Target: Reduce wrapper_env_cfg() overhead in malloc/free hot path - Strategy: Cache wrapper env configuration pointer in TLS - Approach: Fast pointer cache (TLS caches const wrapper_env_cfg_t*) Implementation: - core/box/wrapper_env_cache_env_box.h: ENV gate (HAKMEM_WRAP_ENV_CACHE) - core/box/wrapper_env_cache_box.h: TLS cache layer (wrapper_env_cfg_fast) - core/box/hak_wrappers.inc.h: Integration into malloc/free hot paths - ENV gate: HAKMEM_WRAP_ENV_CACHE=0/1 (default OFF) A/B Test Results (Mixed, 10-run, 20M iters): - Baseline (D2=0): 46.52M ops/s (avg), 46.47M ops/s (median) - Optimized (D2=1): 45.85M ops/s (avg), 45.98M ops/s (median) - Improvement: avg -1.44%, median -1.05% (DECISION: NO-GO) Analysis: - Regression cause: TLS cache adds overhead (branch + TLS access) - wrapper_env_cfg() is already minimal (pointer return after simple check) - Adding TLS caching layer makes it worse, not better - Branch prediction penalty outweighs any potential savings Cumulative Phase 2-3: - B3: +2.89%, B4: +1.47%, C3: +2.20% - D1: +1.06% (opt-in), D2: -1.44% (NO-GO) - Total: ~7.2% (excluding D2) Decision: FREEZE as research box (default OFF, regression confirmed) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
3.7 KiB
3.7 KiB
Phase 3: Cache Locality(C1/C2/C3 完了後の次指示)
現在地(Status)
C3: Static Routing ✅ ADOPT
HAKMEM_TINY_STATIC_ROUTE=1をMIXED_TINYV3_C7_SAFEのデフォルトへ昇格(policy_snapshot bypass)- 設計メモ:
docs/analysis/PHASE3_C3_STATIC_ROUTING_1_DESIGN.md
C1: TLS Prefetch 🔬 NEUTRAL / FREEZE
HAKMEM_TINY_PREFETCH=1は Mixed で平均が伸びず(±1%域)→ default OFF 維持- 設計メモ:
docs/analysis/PHASE3_C1_TLS_PREFETCH_1_DESIGN.md
C2: Metadata Cache 🔬 NEUTRAL / FREEZE
HAKMEM_TINY_METADATA_CACHE=1は Mixed で平均が伸びず(±1%域)→ default OFF 維持- 設計メモ:
docs/analysis/PHASE3_C2_METADATA_CACHE_1_DESIGN.md
C4: MIXED MID_V3 Routing Fix ✅ ADOPT(大きい勝ち)
MIXED_TINYV3_C7_SAFEのデフォルトを MID_V3 OFF に変更(C6 を LEGACY 側へ戻す)- A/B(Mixed, ws=400, 20M iters, 10-run)で +13% を確認
D1: Free Path Route Cache ✅ GO(ENV opt-in)
HAKMEM_FREE_STATIC_ROUTE=1(default OFF)- A/B(Mixed, 10-run mean)で +1.06%(平均のみ閾値超え。median は負ける場合があるので “候補” 扱い)
- 設計メモ:
docs/analysis/PHASE3_D1_FREE_ROUTE_CACHE_1_DESIGN.md
次の指示(ガツン)
Step 0: Baseline 固定(Mixed)
- まず “現行デフォルト” で 10-run を取る(比較の基準線)
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 20000000 400 1 - A/B の比較は 同じ iter / ws / threads を厳守。
Step 1: MID_V3 の扱いを “本線 SSOT” にする
目的: Mixed 本線は MID_V3 を常時 OFF、C6-heavy のみ ON を維持する。
core/bench_profile.h(プリセット)- Mixed:
HAKMEM_MID_V3_ENABLED=0,HAKMEM_MID_V3_CLASSES=0x0 - C6-heavy: 既存通り
HAKMEM_MID_V3_ENABLED=1,HAKMEM_MID_V3_CLASSES=0x40
- Mixed:
docs/analysis/ENV_PROFILE_PRESETS.md(人間向け SSOT)- Mixed 本線: MID_V3 OFF を明記
- C6-heavy: MID_V3 ON 推奨を明記
GO/NO-GO:
- Mixed (10-run mean): +1.0% 以上で GO(既に +13% を観測)
- C6-heavy: 参考(Mixed を最優先)
Step 2: 次のボトルネックを “数字で” 決める
MID_V3 を切った後に、改めて perf を取り直して “次の芯” を決める。
perf record -F 99 --call-graph dwarf -- \
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 20000000 400 1
perf report --stdio
判定ルール:
- self% が 5% 未満の箱は NO-GO(後回し)
- 5% 以上の関数/箱だけを次のフェーズ候補にする
Step 3: Phase 3 D2(Wrapper Env Cache)を実装して A/B
狙い: wrapper 入口の wrapper_env_cfg() をさらに軽くして 1–2% 詰める。
- 設計メモ:
docs/analysis/PHASE3_D2_WRAPPER_ENV_CACHE_1_DESIGN.md - ENV:
HAKMEM_WRAP_ENV_CACHE=0/1(default 0) - A/B: Mixed 10-run(推奨: 20M iters)
- GO: +1.0% 以上
- NO-GO: -1.0% 以下
- ±1%: NEUTRAL(研究箱維持)
Step 4: Phase 3 D3(Alloc Gate Specialization)は “perf で 5%超えたら” 着手
狙い: Mixed 本線の固定構成に合わせ、alloc gate の分岐を削って 1–2% 詰める。
- 設計メモ:
docs/analysis/PHASE3_D3_ALLOC_GATE_SPECIALIZATION_1_DESIGN.md - ENV:
HAKMEM_ALLOC_GATE_LEGACY_ONLY=0/1(default 0) - 注意: “safe enable 判定” を必ず入れて、ENV 組み合わせで壊れないようにする
次候補(perf で 5% 超なら着手)
tiny_alloc_gate_fast/malloc_tiny_fast_for_class(alloc 側の形最適化)free_tiny_fast_*(free 側第2ホットの追加短絡)- wrapper(
malloc/free)の hot 入口の更なる短縮(B4 の次)