# Phase P1: 学習の安定化(ヒステリシス/ドウェル+Canary採用) 目的: CAP/W_MAX/THP の自動調整に安定性を持たせ、短時間計測でも振動を抑えつつ安全に最適値へ収束させる。 ## 実装点(hakmem_learner.c) - CAP 調整(Mid/Large) - 窓内ヒット率に基づく±`step`を継続しつつ、クラス別ドウェルを導入。 - 環境変数で秒指定((`window_ms/1000`)単位で加算) - `HAKMEM_CAP_DWELL_SEC_MID`(既定3秒) - `HAKMEM_CAP_DWELL_SEC_LG`(既定5秒) - 変更が起きたときのみ該当クラスのドウェルをリセット→過剰振動抑制。 - W_MAX 学習(UCB1) - ドウェルに加えて Canary 試験導入(候補値を一時採用し、所定秒数のスコア比較で採否を決定)。 - 環境変数: - `HAKMEM_WMAX_LEARN=1`(有効化) - `HAKMEM_WMAX_CANARY=1`(Canary有効, 既定ON) - `HAKMEM_WMAX_TRIAL_SEC`(既定5) - `HAKMEM_WMAX_ADOPT_PCT`(既定0.01→+1%以上で採用) - `HAKMEM_WMAX_DWELL_SEC`(アーム切替ドウェル) - THP閾値 学習(UCB1) - 上記と同様の Canary 試験(別ENV)。 - 環境変数: - `HAKMEM_THP_LEARN=1`(有効化) - `HAKMEM_THP_CANARY=1`(Canary有効, 既定ON) - `HAKMEM_THP_TRIAL_SEC`(既定6) - `HAKMEM_THP_ADOPT_PCT`(既定0.015→+1.5%以上で採用) - `HAKMEM_THP_DWELL_SEC`(アーム切替ドウェル) - スコア指標(簡易) - `score = (mid_hit + large_hit) - (mid_miss + large_miss) - 2*l1_fallback` - Canaryは切替直前のアーム平均スコアをベースラインとし、試験区間平均と比較して採否を決定。 ## 使い方(短時間プリセット) - 学習ON(Midバンド, 4T, 1秒) ``` HAKMEM_LEARN=1 HAKMEM_WMAX_LEARN=1 HAKMEM_WMAX_CANARY=1 \ HAKMEM_THP_LEARN=1 HAKMEM_THP_CANARY=1 \ HAKMEM_POOL_MIN_BUNDLE=4 HAKMEM_L25_MIN_BUNDLE=2 \ LD_PRELOAD=$(readlink -f ./libhakmem.so) mimalloc-bench/bench/larson/larson 1 2048 32768 10000 1 12345 4 ``` - 計測を長くする場合(2–10秒)は `*_TRIAL_SEC` と `*_DWELL_SEC` を少し伸ばすと振動がさらに減少。 ## メモ - Learner起動: `HAKMEM_LEARN=1`(既定OFF) - 収束の可視化は `docs/benchmarks/*` のサマリとLearnerログを併読。