Files
hakmem/docs/analysis/PHASE74_UNIFIEDCACHE_HITPATH_STRUCTURAL_OPT_0_DESIGN.md
Moe Charm (CI) e9b97e9d8e Phase 74-1/74-2: UnifiedCache LOCALIZE optimization (P1 frozen, NEUTRAL -0.87%)
Phase 74-1 (ENV-gated LOCALIZE):
- Result: +0.50% (NEUTRAL)
- Runtime branch overhead caused instructions/branches to increase
- Diagnosed: Branch tax dominates intended optimization

Phase 74-2 (compile-time LOCALIZE):
- Result: -0.87% (NEUTRAL, P1 frozen)
- Removed runtime branch → instructions -0.6%, branches -2.3% ✓
- But cache-misses +86% (register pressure/spill) → net loss
- Conclusion: LOCALIZE本体 works, but fragile to cache effects

Key finding:
- Dependency chain reduction (LOCALIZE) has low ROI due to cache-miss sensitivity
- P1 (LOCALIZE) frozen at default OFF
- Next: Phase 74-3 (P0: FASTAPI) - move branches outside hot loop

Files:
- core/hakmem_build_flags.h: HAKMEM_TINY_UC_LOCALIZE_COMPILED flag
- core/box/tiny_unified_cache_hitpath_env_box.h: ENV gate (frozen)
- core/front/tiny_unified_cache.h: compile-time #if blocks
- docs/analysis/PHASE74_*: Design, instructions, results
- CURRENT_TASK.md: P1 frozen, P0 next instructions

Also includes:
- Phase 69 refill tuning results (archived docs)
- PERFORMANCE_TARGETS_SCORECARD.md: Phase 69 baseline update
- PHASE70_REFILL_OBSERVABILITY_PREREQS_SSOT.md: Route banner docs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-18 07:47:44 +09:00

5.3 KiB
Raw Permalink Blame History

Phase 74: UnifiedCache hit-path structural optimization (WS=400 SSOT)

Status: 🟡 DRAFT設計SSOT / 次の指示書)

0) 背景(なぜ今これか)

  • 現行 baselinePhase 69: bench_random_mixed_hakmem_minimal_pgo = 62.63M ops/s = 51.77% of mimallocHAKMEM_WARM_POOL_SIZE=16
  • Phase 70観測SSOTにより、WS=400Mixed SSOTでは UnifiedCache miss が極小であることが確定。
    • unified_cache_refill() / WarmPool-pop を速くしても ROI はほぼゼロrefill最適化は凍結
    • SSOT: docs/analysis/PHASE70_REFILL_OBSERVABILITY_PREREQS_SSOT.md
  • Phase 73perf statにより、WarmPool=16 の勝ちは instruction/branch の微減が支配的と確定。
    • つまり次も「hit-path を短くする」方向が最も筋が良い。
    • 詳細: docs/analysis/PHASE70_71_WARMPOOL16_ANALYSIS.md

本フェーズの狙いは、UnifiedCache の hit-pathpush/popから“踏まなくていい分岐/ロード”を構造で外に追い出すこと。

1) 目的 / 非目的

目的

  • WS=400 の SSOT workload で +1〜3%(単発)を狙う(積み上げで M2=55% へ)。
  • “経路が踏まれていない最適化” を避けるPhase 70 の SSOT を守る)。

非目的

  • unified_cache_refill() の最適化miss が極小なので SSOT では ROI なし)。
  • link-out / 大削除による DCElayout tax で符号反転の前例が多い)。
  • route kind を変えて別 workload にする(まず SSOT workload を崩さない)。

2) Box Theory箱割り

箱の責務

L0: EnvGateBox

  • HAKMEM_TINY_UC_* のトグルdefault OFF、いつでも戻せる

L1: TinyUnifiedCacheHitPathBoxNEW / 研究箱)

  • unified_cache_push/pophit-path だけを短くするrefill/overflow/registryは触らない
  • 変換点(境界)は 1 箇所: unified_cache_push/pop 内で “fast→fallback” を1回だけ行う。

可視化(最小)

  • uc_hitpath_fast_hits / uc_hitpath_fast_fallbacks の2カウンタだけ必要なら
  • それ以外は perf statinstructions/branchesを正とする。

3) 具体案(優先順)

P1低リスク: ローカル変数化で再ロード/依存チェーンを固定する

狙い:

  • cache->head/tail/mask/capacity 等の再ロードを抑制し、依存チェーンを短くする。

設計:

  • unified_cache_push() / unified_cache_pop_or_refill() の中で
    • uint16_t head = cache->head; のように ローカルへ落とす
    • next = (x + 1) & mask の算術を 1回に固定
    • cache->tail = next; のような store を最後にまとめる

導入:

  • ENV: HAKMEM_TINY_UC_LOCALIZE=0/1default 0
  • 方式: 同一バイナリで ON/OFFlayout tax を最小にするため、分岐は入口1回に限定

リスク:

  • レジスタ圧上昇で逆に遅くなる可能性 → A/B 必須。

P0中リスク/中ROI: Fast-API 化enable判定/統計を外に追い出す)

狙い:

  • hit-path の中に残る “ほぼ不変な判定” を 呼び出し側に追い出しpush/pop を直線化する。

設計:

  • unified_cache_push_fast(TinyUnifiedCache* cache, void* base) のような 最短API を追加
    • 前提: “有効/初期化済み/統計OFF” を呼び出し側で保証
    • 失敗時のみ既存 unified_cache_push() へ落とす境界1箇所

導入:

  • ENV: HAKMEM_TINY_UC_FASTAPI=0/1default 0
  • Fail-fast: 途中でモードが変わったら “safe fallback” へbench用途なら abort でも良い)

リスク:

  • call site の増加で layout が動く → GO 閾値は +1.0%(厳しめ)。

P2高リスク/高ROI候補: hot class 限定で slots を TLS 直置きpointer chase削減

狙い:

  • hit-path の cache->slots のロード(ポインタ追跡)を消す。

設計:

  • TinyUnifiedCache の “hot class のみ” を別構造に逃がし、TLS 内に slots[] を直置き。
    • 対象候補: 容量が小さい C4/C5/C6/C7C2/C3 の 2048 は直置きが重い)

リスク:

  • TLS サイズ増で dTLB/cache が悪化しうる勝てば大きいが、NO-GO もあり得る)。

4) A/BSSOT

4.1 ベンチ条件(固定)

  • scripts/run_mixed_10_cleanenv.shITERS=20000000 WS=400
  • HAKMEM_WARM_POOL_SIZE=16baseline

4.2 GO/NO-GO

  • GO: +1.0% 以上
  • NEUTRAL: ±1.0%research box freeze
  • NO-GO: -1.0% 以下(即 revert

4.3 追加で必ず見るPhase 73 教訓)

  • perf stat: instructions, branches, branch-misses(勝ち筋が instruction/branch 減なので)
  • cache-misses, iTLB-load-misses, dTLB-load-misseslayout tax 検知)

5) 直近の実装順(推奨)

  1. P1LOCALIZE を小さく入れて A/B最短で勝ち筋確認
  2. 勝てたら P0FASTAPI を追加(さらに分岐を外へ)
  3. それでも足りなければ P2inline slots hot を research box として試す

6) 退出条件(やめどき)

  • WS=400 SSOT で perf 上の “unified_cache_push/pop” が Top 50 圏外になったら、この系は撤退Phase 42 の教訓)。
  • 3回連続で NEUTRAL/NO-GO が続いたら、次の構造別層layout tax の危険が増すため)。