Files
hakmem/docs/analysis/PHASE6_FRONT_FASTLANE_1_DESIGN.md

122 lines
5.0 KiB
Markdown
Raw Normal View History

# Phase 6: Front FastLaneLayer CollapseDesign v1
## 0. 背景 / ねらい
直近の勝ち筋は「分岐形」ではなく **重複排除(境界の一本化)** と **ENV/TLS 読み回数の削減**だった。
一方で “削る(別バイナリ比較)” は配置/LTO の二次効果で壊れやすく **NO-GO**
外部レビューML2では、次の芯は **Front FastLanewrapper→gate→policy→route の Layer Collapse**が最優先、という結論になった。
- 外部回答の記録: `PHASE_ML2_CHATGPT_RESPONSE_FASTLANE.md`
- 質問状: `PHASE_ML2_CHATGPT_QUESTIONNAIRE_FASTLANE.md`
## 1. ゴールBox Theory
- **Hot の入口を 1 箱に畳む**malloc/free の “入口固定費” を減らす)
- **境界は 1 箇所**FastLane → ColdFallback の単一フォールバック)
- **戻せる**ENV gate で A/B
- **見える化は最小**hit/fallback のカウンタだけ)
- **Fail-Fast**(確信が持てないものは必ず既存経路へ)
## 2. 非ゴール(やらない)
- 凍結箱を「削除して痩せさせる」E7 NO-GO
- 参照: `docs/analysis/PHASE5_E7_FROZEN_BOX_PRUNE_AB_TEST_RESULTS.md`
- “branch hint” の固定最適化CPU/モードで逆効果になりやすい)
## 3. 形Box 図)
```
(ENV: HAKMEM_FRONT_FASTLANE=0/1)
+---------------------+
| L0: FastLaneEnvBox |
+---------------------+
|
v
+--------------------+ +--------------------------+
| malloc/free wrapper| --> | L1: FrontFastLaneBox |
| (既存のまま) | | - size->class->route |
+--------------------+ | - try_alloc / try_free |
| - fast: 直線 + 早期return|
+--------------------------+
| \
handled->| \ not-handled
v v
+------------------+ +-----------------------+
| L1a: HotHandlers | | L2: ColdFallbackIface |
| (既存を呼ぶだけ) | | (既存 wrapper 継続) |
+------------------+ +-----------------------+
```
**境界 1 箇所**: `FrontFastLaneBox` が “handled できない” と判断したら即 `ColdFallbackIface`=既存 wrapper の続き)へ落とす。
## 4. 既存資産の再利用(重要)
FastLane を “新規で全部作る” のではなく、既に勝っている箱を **Hot 入口で 1 回だけ読む**形に揃える。
- Wrapper ENV snapshot:
- `core/box/malloc_wrapper_env_snapshot_box.h`
- `core/box/free_wrapper_env_snapshot_box.h`
- Tiny route snapshot:
- `core/box/tiny_route_env_box.h`route_kind を class ごとに決める)
- ENV snapshot consolidationある場合:
- `core/box/hakmem_env_snapshot_box.h`
方針:
- FastLane 内で “同じ判定を 2 回やらない”。
- 既存の Hot handler例: `malloc_tiny_fast_for_class()` / `tiny_alloc_gate_fast()` / `free_tiny_fast()`)を **呼ぶだけ**に留める。
## 5. FastLane の責務L1
### 5.1 alloc: try_alloc(size) の責務
- size から class を決める(可能なら LUT / 1 回)
- class から route を決める(可能なら snapshot / 1 回)
- “確信が持てる”場合のみ Hot handler に直行し、成功したら即 return
- 失敗したら **即 not-handled**Cold へ)
### 5.2 free: try_free(ptr) の責務
- **確信が持てる**場合のみ tiny free へ直行(例: header で tiny 物を fail-fast 判定できる)
- それ以外は not-handledCold へ)
## 6. Fail-Fast安全ゲート
FastLane の原則:
- “fast path に入る条件” は **必要最小**
- “fallback 条件” は **広く**
alloc:
- `size <= tiny_get_max_size()`(もしくは wrapper snapshot 由来の cheap 判定)
- class が範囲内
- route が “既知の tiny hot handler で処理可能”
free:
- header magic / class_idx が valid
- “tiny が確実” と言える場合のみ(曖昧なら必ず Cold
## 7. ENV / A/B 方針
- `HAKMEM_FRONT_FASTLANE=0/1`default 1, opt-out
- optional:
- `HAKMEM_FRONT_FASTLANE_CLASS_MASK=0x??`(段階導入用)
A/B:
- Mixed 10-run は必ず clean env runner を使うENV 漏れ防止)
- `scripts/run_mixed_10_cleanenv.sh`
GO/NO-GO運用:
- GO: Mixed 10-run mean **+1.0% 以上**
- NEUTRAL: **±1.0%**freeze
- NO-GO: **-1.0% 以下**rollback/freeze
## 8. 実装方針(小パッチ順)
1. **ENV gate 箱**default ON
2. **FrontFastLaneBox**alloc のみ / tiny のみ)
3. **free を追加**tiny 直通のみ、曖昧なら落とす)
4. **最小 stats**hit/fallback、理由は 3〜6 種類まで)
5. 健康診断 + Mixed 10-run A/B
次の具体指示は `docs/analysis/PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md` にまとめる。