# Phase 3 C1: TLS Prefetch(Tiny alloc hot path)設計メモ ## 目的 Phase 2-3(B3/B4/C3)で「形(分岐・I-cache)」は勝ち形に寄った。 次は **L1D miss / pointer chase** を減らすための “軽い prefetch” を A/B する。 対象は policy ではなく、実際の alloc が触る **TLS cache**: - `TinyUnifiedCache g_unified_cache[class]`(`core/front/tiny_unified_cache.h`) - 必要なら `cache->slots[]` の先頭付近(head/tail 周辺) ## 非目標 - ルーティングやアルゴリズム変更はしない(prefetch は “ヒント” のみ) - 常時ログは禁止(必要なら `HAKMEM_DEBUG_COUNTERS` のみ) - “当たり前に速い” ことは期待しない(NO-GO なら即 freeze) ## Box Theory(箱割り) ### L0: Env(戻せる) - 既存 ENV を使用: `HAKMEM_TINY_PREFETCH=0/1`(default 0) - 目的: prefetch の on/off を即切替(回帰時に即戻せる) ### L1: PrefetchBox(境界: 1 箇所) 責務: **malloc の hot path で 1 回だけ** prefetch を実行する。 実装場所は “入口” に固定(`malloc_tiny_fast_for_class()`)。 候補 API(header-only で OK): - `tiny_alloc_prefetch_tls_cache(class_idx, route_kind)` - `route_kind == SMALL_ROUTE_LEGACY` のときだけ `g_unified_cache[class_idx]` を prefetch - 余計な prefetch を避ける(C6=MID 等で無駄撃ちしない) ## 実装指示(小パッチ順) 1. **Prefetch 実装(最小)** - 追加箇所: `core/front/malloc_tiny_fast.h` の `malloc_tiny_fast_for_class()` - 条件: - `tiny_env_cfg()->tiny_prefetch == 1` - `route_kind == SMALL_ROUTE_LEGACY` - 実行: - `__builtin_prefetch(&g_unified_cache[class_idx], 0, 3);` - 注意: - `g_unified_cache` は TLS なので “当たる” 前提で入れすぎない(1 回だけ) 2. **Optional(勝ち筋が見えたら)** - `TinyUnifiedCache* cache = &g_unified_cache[class_idx];` - `if (cache->slots) __builtin_prefetch(&cache->slots[cache->head], 0, 3);` - ※ ただしロードが増えるので、まずは 1. の最小で A/B 3. **ドキュメント** - `docs/specs/ENV_VARS_COMPLETE.md` に `HAKMEM_TINY_PREFETCH` を追記 - `docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md` の C1 をこの設計に合わせて更新 ## A/B(GO/NO-GO) - Mixed(`HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE`)10-run - 比較: `HAKMEM_TINY_PREFETCH=0` vs `=1` - **GO**: +1.0% 以上 - **NO-GO**: -1.0% 以下 → freeze - ±1% は “研究箱維持”(デフォルトOFFのまま) ## 期待値の現実 prefetch は “刺さるときだけ刺さる”。 勝ち筋は「route 形の整理(B3/B4/C3)で instruction が減った結果、メモリ待ちが相対的に目立つ」状態になっていること。 もし勝てないなら、次は C2(metadata locality)へ進む。 --- ## 結果(A/B) **判定**: 🔬 NEUTRAL(研究箱維持、default OFF) - Mixed 10-run: - `HAKMEM_TINY_PREFETCH=0`: avg **39.34M** - `HAKMEM_TINY_PREFETCH=1`: avg **39.20M**(avg **-0.34%** / median **+1.28%**) **補足**: - 既存実装は “LEGACY 分岐の直前” に prefetch を入れており lead time が短い。 - 再挑戦するなら、prefetch 位置を **より早い入口**(`malloc_tiny_fast_for_class()` 冒頭など)に動かして A/B を取り直す。