docs: Phase 6-2 FastLane free dedup instructions
This commit is contained in:
@ -16,6 +16,13 @@
|
||||
- A/B は **同一バイナリで ENV トグル**(削除/追加で別バイナリ比較にしない)
|
||||
- Mixed 10-run は `scripts/run_mixed_10_cleanenv.sh` 基準(ENV 漏れ防止)
|
||||
|
||||
### Next: Phase 6-2 FRONT-FASTLANE-FREE-DEDUP(free 側重複排除)
|
||||
|
||||
狙い: `front_fastlane_try_free()` が `free_tiny_fast()` と **Tiny header 検証を二重に行っている**箇所を削り、free 側の固定費をさらに薄くする。
|
||||
|
||||
- 指示書: `docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md`
|
||||
- A/B: `HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0/1`(同一バイナリ)
|
||||
|
||||
## 更新メモ(2025-12-14 Phase 5 E5-3 Analysis - Strategic Pivot)
|
||||
|
||||
### Phase 5 E5-3: Candidate Analysis & Strategic Recommendations ⚠️ DEFER (2025-12-14)
|
||||
|
||||
@ -0,0 +1,117 @@
|
||||
# Phase 6-2: Front FastLane Free DeDup(次の指示書)
|
||||
|
||||
## 0. 目的(狙い)
|
||||
|
||||
Phase 6-1 FastLane(default ON)で “入口固定費” は大きく削減できた。次は **free 側の FastLane 内重複**を削り、さらに baseline を押し上げる。
|
||||
|
||||
- 期待: **+1〜3%**(free が支配的なため、当たれば上振れあり)
|
||||
- 方針: 箱理論のまま(Fail-Fast / 境界1箇所 / ENVで戻せる)
|
||||
|
||||
## 1. 根拠(現状のボトルネック)
|
||||
|
||||
FastLane ON の perf(例: `perf_fastlane_on_999.data`)で、free 周辺がまだ太い:
|
||||
|
||||
- `front_fastlane_try_free` が大きい(free wrapper と合わせて free 側が支配的)
|
||||
- `front_fastlane_try_free` が **Tiny header の検証を自前でやった後に** `free_tiny_fast()` を呼び、`free_tiny_fast()` 側でも **同じ header 検証を再実行**している(= 入口で二重コスト)
|
||||
|
||||
この “二重検証” を消すのが Phase 6-2 の芯。
|
||||
|
||||
## 2. Box Theory(箱の切り方)
|
||||
|
||||
### L0: ENV gate(戻せる)
|
||||
|
||||
既存:
|
||||
- `core/box/front_fastlane_env_box.h`
|
||||
- `front_fastlane_enabled()`
|
||||
- `front_fastlane_class_mask()`
|
||||
|
||||
追加(Phase 6-2):
|
||||
- `HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0/1`
|
||||
- default: **0**(まず A/B)
|
||||
- GO 後: default **1**(opt-out)
|
||||
|
||||
### L1: FrontFastLaneBox(境界1箇所)
|
||||
|
||||
- `core/box/front_fastlane_box.h`
|
||||
- `front_fastlane_try_free()` 内で **重複ヘッダ検証を排除**
|
||||
- fallback は従来どおり wrapper へ(境界は維持)
|
||||
|
||||
## 3. 実装指示(小パッチ順)
|
||||
|
||||
### Patch 1: Free DeDup ENV gate を追加(L0)
|
||||
|
||||
対象:
|
||||
- `core/box/front_fastlane_env_box.h`
|
||||
|
||||
追加 API:
|
||||
- `static inline int front_fastlane_free_dedup_enabled(void)`
|
||||
- ENV: `HAKMEM_FRONT_FASTLANE_FREE_DEDUP`
|
||||
- default: 0(A/B 用)
|
||||
- キャッシュ方式: `static _Atomic int cached=-1` + `getenv`(1回だけ)
|
||||
|
||||
### Patch 2: `front_fastlane_try_free()` を “重複なし” にする(L1)
|
||||
|
||||
対象:
|
||||
- `core/box/front_fastlane_box.h`
|
||||
|
||||
やること:
|
||||
1) `front_fastlane_free_dedup_enabled()==1` かつ `front_fastlane_class_mask()==0xFF` のとき
|
||||
- `free_tiny_fast(ptr)` を **直接呼ぶ**
|
||||
- 返り値 `1` → handled(return true)
|
||||
- `0` → not-handled(return false)
|
||||
2) それ以外(dedup OFF / class mask を絞っている)では、従来どおり “class mask 判定付き” の経路に残す。
|
||||
|
||||
注意(重要):
|
||||
- `front_fastlane_try_free()` の中にある `extern int free_tiny_fast(void*)` 宣言は **削除**し、`malloc_tiny_fast.h` の `static inline free_tiny_fast()` をそのまま呼ぶ(リンク/インラインの整合)。
|
||||
- `!g_initialized` の Fail-Fast は現状維持(init 中は既存 wrapper に任せる)。
|
||||
|
||||
## 4. A/B(同一バイナリ)
|
||||
|
||||
### Mixed 10-run(clean env)
|
||||
|
||||
OFF:
|
||||
```sh
|
||||
HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0 scripts/run_mixed_10_cleanenv.sh
|
||||
```
|
||||
|
||||
ON:
|
||||
```sh
|
||||
HAKMEM_FRONT_FASTLANE_FREE_DEDUP=1 scripts/run_mixed_10_cleanenv.sh
|
||||
```
|
||||
|
||||
判定(Mixed 10-run mean):
|
||||
- GO: **+1.0% 以上**
|
||||
- NEUTRAL: **±1.0%** → 研究箱として freeze(default は上げない)
|
||||
- NO-GO: **-1.0% 以下** → 即 revert / freeze
|
||||
|
||||
### perf 確認(任意だが強推奨)
|
||||
|
||||
目的: `front_fastlane_try_free` の self% が目に見えて落ちるか確認する。
|
||||
|
||||
```sh
|
||||
perf record -F 999 -- env HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0 \
|
||||
./bench_random_mixed_hakmem 20000000 400 1 >/dev/null
|
||||
perf report --stdio --no-children --percent-limit 0.5 | head
|
||||
|
||||
perf record -F 999 -- env HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE HAKMEM_FRONT_FASTLANE_FREE_DEDUP=1 \
|
||||
./bench_random_mixed_hakmem 20000000 400 1 >/dev/null
|
||||
perf report --stdio --no-children --percent-limit 0.5 | head
|
||||
```
|
||||
|
||||
## 5. 健康診断(必須)
|
||||
|
||||
```sh
|
||||
scripts/verify_health_profiles.sh
|
||||
```
|
||||
|
||||
## 6. 昇格(GO のときだけ)
|
||||
|
||||
- `front_fastlane_free_dedup_enabled()` の default を **1** に変更(opt-out)
|
||||
- `core/bench_profile.h` の主要プロファイルで `bench_setenv_default("HAKMEM_FRONT_FASTLANE_FREE_DEDUP","1")`
|
||||
- `CURRENT_TASK.md` に A/B 数値と rollback(`=0`)を追記
|
||||
|
||||
## 7. Rollback(即戻せる)
|
||||
|
||||
- `HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0`(Phase 6-2 だけ戻す)
|
||||
- さらに戻すなら `HAKMEM_FRONT_FASTLANE=0`(FastLane 全体OFF)
|
||||
|
||||
@ -59,3 +59,6 @@ FastLane 内で `tiny_get_max_size()` を毎回呼ぶのは、E4-2 の勝ち筋
|
||||
|
||||
- `malloc_wrapper_env_get()` 由来の `tiny_max_size_256`(または max_size 値)を FastLane に渡して “call を消す”
|
||||
- ただし “FastLane で同じ判定を二度しない” を守る(境界 1 箇所)
|
||||
|
||||
また、FastLane free 側は `free_tiny_fast()` と Tiny header 検証が二重になりやすいので、次の指示書で重複排除を優先する:
|
||||
- `docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md`
|
||||
|
||||
Reference in New Issue
Block a user