Phase 3 D2: Wrapper Env Cache - [DECISION: NO-GO]
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>
2025-12-13 22:03:27 +09:00
|
|
|
|
# Phase 3 D3: Alloc Gate Specialization(Mixed “LEGACY-only” 最短化)設計メモ
|
|
|
|
|
|
|
2025-12-14 00:05:11 +09:00
|
|
|
|
> NOTE (2025-12-13): この設計メモは **後続の Phase 4 D3** により置き換えられました。
|
|
|
|
|
|
> 最新の設計・ENV・実装指示は `docs/analysis/PHASE4_D3_ALLOC_GATE_SPECIALIZATION_1_DESIGN.md` を参照してください。
|
|
|
|
|
|
|
Phase 3 D2: Wrapper Env Cache - [DECISION: NO-GO]
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>
2025-12-13 22:03:27 +09:00
|
|
|
|
## 目的
|
|
|
|
|
|
|
|
|
|
|
|
Mixed 本線(`MIXED_TINYV3_C7_SAFE`)では、
|
|
|
|
|
|
構成が固定されているため「毎回の gate 判定」をさらに削れる余地がある。
|
|
|
|
|
|
|
|
|
|
|
|
この D3 は `tiny_alloc_gate_fast()` の分岐を “Mixed に特化した形” にして、
|
|
|
|
|
|
alloc 入口の命令数と分岐を 1–2% 詰めることを狙う。
|
|
|
|
|
|
|
|
|
|
|
|
## 前提(Mixed 本線の固定事項)
|
|
|
|
|
|
|
|
|
|
|
|
- `HAKMEM_MID_V3_ENABLED=0`(C6 を MID に送らない)
|
|
|
|
|
|
- `HAKMEM_TINY_STATIC_ROUTE=1`(policy_snapshot bypass)
|
|
|
|
|
|
- `HAKMEM_TINY_ALLOC_ROUTE_SHAPE=1`(alloc dispatch 形最適化)
|
|
|
|
|
|
- Tiny front v3 + LUT + fast classify は ON(既定)
|
|
|
|
|
|
|
|
|
|
|
|
## 非目標
|
|
|
|
|
|
|
|
|
|
|
|
- ルーティングポリシーの意味変更(ULTRA/MID/V7/LEGACY の優先順位は変えない)
|
|
|
|
|
|
- サイズ→クラス変換の SSOT を壊す
|
|
|
|
|
|
- allocator のアルゴリズム変更(形の削減のみ)
|
|
|
|
|
|
|
|
|
|
|
|
## Box Theory(箱割り)
|
|
|
|
|
|
|
|
|
|
|
|
### L0: Env(戻せる)
|
|
|
|
|
|
|
|
|
|
|
|
- ENV gate: `HAKMEM_ALLOC_GATE_LEGACY_ONLY=0/1`(default: 0)
|
|
|
|
|
|
- 目的: Mixed 本線だけで A/B → 勝てなければ即 OFF
|
|
|
|
|
|
|
|
|
|
|
|
### L1: AllocGateLegacyOnlyBox(境界: alloc gate 入口 1箇所)
|
|
|
|
|
|
|
|
|
|
|
|
責務:
|
|
|
|
|
|
- `tiny_alloc_gate_fast()` のうち “Mixed 本線で常に同じ結果になる分岐” を削って、
|
|
|
|
|
|
`malloc_tiny_fast_for_class()` への最短経路を作る。
|
|
|
|
|
|
|
|
|
|
|
|
安全フェンス(必須):
|
|
|
|
|
|
- 初回に 1 回だけ “本当に LEGACY-only か” を確認してから有効化する。
|
|
|
|
|
|
- 例: `small_policy_v7_init_from_env(&tmp)` で route_kind が LEGACY 以外を含むなら自動 disable
|
|
|
|
|
|
- Learner 有効時は自動 disable(route が動的に変わる)
|
|
|
|
|
|
|
|
|
|
|
|
## 実装指示(小パッチ)
|
|
|
|
|
|
|
|
|
|
|
|
### Patch D3-1: ENV gate + “safe enable” 判定
|
|
|
|
|
|
|
|
|
|
|
|
- 新規: `core/box/alloc_gate_legacy_only_box.h/.c`
|
|
|
|
|
|
- `alloc_gate_legacy_only_enabled_fast()`(hot path 用: boolean)
|
|
|
|
|
|
- 初期化境界 1 箇所:
|
|
|
|
|
|
- `small_policy_v7_init_from_env(&tmp)` で route_kind を検査
|
|
|
|
|
|
- `tmp.route_kind[i] != SMALL_ROUTE_LEGACY` が存在したら disable
|
|
|
|
|
|
- learner ON のときも disable
|
|
|
|
|
|
- A/B で ON のときだけ有効になるようにする
|
|
|
|
|
|
|
|
|
|
|
|
### Patch D3-2: `tiny_alloc_gate_fast()` 統合(差し替え 1 箇所)
|
|
|
|
|
|
|
|
|
|
|
|
- `core/box/tiny_alloc_gate_box.h`
|
|
|
|
|
|
- `TinyRoutePolicy` の分岐を “Mixed では常に同じ” に寄せる(ただし fence を守る)
|
|
|
|
|
|
- 形の例(概略):
|
|
|
|
|
|
- `if (alloc_gate_legacy_only_enabled_fast()) { return malloc_tiny_fast_for_class(size, class_idx); }`
|
|
|
|
|
|
- それ以外は現行の gate ロジックを維持
|
|
|
|
|
|
|
|
|
|
|
|
注意:
|
|
|
|
|
|
- `tiny_alloc_gate_fast` は「Tiny を使うか/Pool へ逃がすか」の境界なので、
|
|
|
|
|
|
“gate の意味” を変えない。削れるのは **分岐の形だけ**。
|
|
|
|
|
|
|
|
|
|
|
|
## A/B(GO/NO-GO)
|
|
|
|
|
|
|
|
|
|
|
|
Mixed 10-run(推奨: 20M iters):
|
|
|
|
|
|
- baseline: `HAKMEM_ALLOC_GATE_LEGACY_ONLY=0`
|
|
|
|
|
|
- opt: `HAKMEM_ALLOC_GATE_LEGACY_ONLY=1`
|
|
|
|
|
|
|
|
|
|
|
|
判定(10-run mean):
|
|
|
|
|
|
- GO: **+1.0% 以上**
|
|
|
|
|
|
- NO-GO: **-1.0% 以下**
|
|
|
|
|
|
- ±1.0%: NEUTRAL(研究箱維持、default OFF)
|
|
|
|
|
|
|
|
|
|
|
|
## リスク
|
|
|
|
|
|
|
|
|
|
|
|
- 低〜中
|
|
|
|
|
|
- Mixed 本線に限定すれば低い
|
|
|
|
|
|
- “safe enable 判定” を入れないと、ENV 組み合わせで破綻するリスクが上がる
|
|
|
|
|
|
|
|
|
|
|
|
## Rollback
|
|
|
|
|
|
|
|
|
|
|
|
- `HAKMEM_ALLOC_GATE_LEGACY_ONLY=0`(即 OFF)
|
|
|
|
|
|
- 箱は独立させ、既存 gate を汚さない(境界 1 箇所差し替え)
|