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>
66 lines
2.4 KiB
C
66 lines
2.4 KiB
C
// hakmem_elo.h - ELO Rating Strategy Selection (Box Theory)
|
|
//
|
|
// Priority 1 optimization from ChatGPT Pro feedback:
|
|
// ELO-based strategy selection for multi-objective optimization
|
|
//
|
|
// Why ELO beats UCB1:
|
|
// - UCB1 assumes independent arms
|
|
// - ELO handles transitivity (if A>B and B>C, then A>C)
|
|
// - Better for multi-objective scoring (CPU + memory + page faults)
|
|
//
|
|
// Expected Gain: +10-20% on VM scenario (close gap with mimalloc)
|
|
|
|
#pragma once
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
// Configuration
|
|
#define ELO_K_FACTOR 32.0 // ELO K-factor (higher = faster learning)
|
|
#define ELO_INITIAL_RATING 1500.0 // Starting ELO rating
|
|
#define ELO_MAX_STRATEGIES 12 // Max candidate strategies
|
|
#define ELO_EPSILON 0.1 // Epsilon-greedy exploration (10%)
|
|
#define ELO_MIN_SAMPLES 50 // Min samples before ELO update
|
|
#define ELO_SURVIVAL_COUNT 6 // Top-M strategies survive
|
|
|
|
// Strategy Candidate
|
|
typedef struct {
|
|
int strategy_id; // Unique strategy ID
|
|
double elo_rating; // Current ELO rating (starts at 1500)
|
|
uint64_t wins; // Number of wins
|
|
uint64_t losses; // Number of losses
|
|
uint64_t draws; // Number of draws
|
|
uint64_t samples; // Total samples collected
|
|
size_t threshold_bytes; // mmap threshold for this strategy
|
|
int active; // 1 if strategy is active
|
|
} EloStrategyCandidate;
|
|
|
|
// Allocation Statistics (for comparison)
|
|
typedef struct {
|
|
uint64_t cpu_ns; // CPU time (nanoseconds)
|
|
uint64_t page_faults; // Number of page faults
|
|
uint64_t bytes_live; // Live memory bytes
|
|
uint64_t alloc_count; // Number of allocations
|
|
} EloAllocStats;
|
|
|
|
// ELO System API (Box Interface)
|
|
void hak_elo_init(void);
|
|
void hak_elo_shutdown(void);
|
|
|
|
// Strategy selection (epsilon-greedy)
|
|
int hak_elo_select_strategy(void);
|
|
size_t hak_elo_get_threshold(int strategy_id);
|
|
|
|
// Record allocation result
|
|
void hak_elo_record_alloc(int strategy_id, size_t size, uint64_t duration_ns);
|
|
|
|
// Trigger ELO evolution (pairwise comparison)
|
|
void hak_elo_trigger_evolution(void);
|
|
|
|
// Statistics
|
|
void hak_elo_print_stats(void);
|
|
void hak_elo_print_leaderboard(void);
|
|
|
|
// Internal helpers (exposed for testing)
|
|
double hak_elo_compute_score(const EloAllocStats* stats);
|
|
void hak_elo_update_ratings(EloStrategyCandidate* a, EloStrategyCandidate* b, double score_diff);
|