Major Features: - Debug counter infrastructure for Refill Stage tracking - Free Pipeline counters (ss_local, ss_remote, tls_sll) - Diagnostic counters for early return analysis - Unified larson.sh benchmark runner with profiles - Phase 6-3 regression analysis documentation Bug Fixes: - Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB) - Fix profile variable naming consistency - Add .gitignore patterns for large files Performance: - Phase 6-3: 4.79 M ops/s (has OOM risk) - With SuperSlab: 3.13 M ops/s (+19% improvement) This is a clean repository without large log files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
50 lines
1.7 KiB
C
50 lines
1.7 KiB
C
// hakmem_batch.h - madvise Batching for TLB Optimization (Box Theory)
|
||
//
|
||
// Priority 3 optimization from ChatGPT Pro feedback:
|
||
// Batch MADV_DONTNEED calls to reduce TLB flush overhead
|
||
//
|
||
// Why batching matters:
|
||
// - mimalloc is 2× faster on VM scenario partly due to batched madvise
|
||
// - Each madvise() call triggers TLB flush (expensive!)
|
||
// - Batching 4MB worth of blocks reduces TLB flushes by 50-100×
|
||
//
|
||
// Expected Gain: +20-30% on VM scenario
|
||
|
||
#pragma once
|
||
#include <stddef.h>
|
||
#include <stdint.h>
|
||
|
||
// Configuration
|
||
#define BATCH_THRESHOLD (8 * 1024 * 1024) // 8MB: flush batch when reached (Phase 6.11: increased from 1MB for 2MB allocations)
|
||
#define BATCH_MIN_SIZE (64 * 1024) // 64KB: only batch large blocks
|
||
#define BATCH_MAX_BLOCKS 256 // Max blocks in batch
|
||
|
||
// Batch state
|
||
typedef struct {
|
||
void* blocks[BATCH_MAX_BLOCKS]; // Pointers to blocks
|
||
size_t sizes[BATCH_MAX_BLOCKS]; // Sizes of blocks
|
||
int count; // Number of blocks in batch
|
||
size_t total_bytes; // Total bytes in batch
|
||
} DontneedBatch;
|
||
|
||
// Batching API (Box Interface)
|
||
void hak_batch_init(void);
|
||
void hak_batch_shutdown(void);
|
||
|
||
// Add block to batch (returns 1 if flushed, 0 if buffered)
|
||
int hak_batch_add(void* ptr, size_t size);
|
||
|
||
// Force flush all batched blocks
|
||
void hak_batch_flush(void);
|
||
|
||
// Statistics
|
||
void hak_batch_print_stats(void);
|
||
|
||
// Query
|
||
size_t hak_batch_get_pending_bytes(void);
|
||
int hak_batch_get_pending_count(void);
|
||
|
||
// Page-level DONTNEED batching (for managed pool pages): enqueue whole pages
|
||
// Flush performs MADV_DONTNEED only (no munmap), safe with retained VA pointers.
|
||
int hak_batch_add_page(void* page, size_t size);
|