docs: Phase 6-2 FastLane free dedup instructions

This commit is contained in:
Moe Charm (CI)
2025-12-14 17:09:57 +09:00
parent f301ee4df3
commit c0d2f47f7d
3 changed files with 127 additions and 0 deletions

View File

@ -16,6 +16,13 @@
- A/B は **同一バイナリで ENV トグル**(削除/追加で別バイナリ比較にしない) - A/B は **同一バイナリで ENV トグル**(削除/追加で別バイナリ比較にしない)
- Mixed 10-run は `scripts/run_mixed_10_cleanenv.sh` 基準ENV 漏れ防止) - Mixed 10-run は `scripts/run_mixed_10_cleanenv.sh` 基準ENV 漏れ防止)
### Next: Phase 6-2 FRONT-FASTLANE-FREE-DEDUPfree 側重複排除)
狙い: `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 ## 更新メモ2025-12-14 Phase 5 E5-3 Analysis - Strategic Pivot
### Phase 5 E5-3: Candidate Analysis & Strategic Recommendations ⚠️ DEFER (2025-12-14) ### Phase 5 E5-3: Candidate Analysis & Strategic Recommendations ⚠️ DEFER (2025-12-14)

View File

@ -0,0 +1,117 @@
# Phase 6-2: Front FastLane Free DeDup次の指示書
## 0. 目的(狙い)
Phase 6-1 FastLanedefault 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: 0A/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` → handledreturn true
- `0` → not-handledreturn 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-runclean 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%** → 研究箱として freezedefault は上げない)
- 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

View File

@ -59,3 +59,6 @@ FastLane 内で `tiny_get_max_size()` を毎回呼ぶのは、E4-2 の勝ち筋
- `malloc_wrapper_env_get()` 由来の `tiny_max_size_256`(または max_size 値)を FastLane に渡して “call を消す” - `malloc_wrapper_env_get()` 由来の `tiny_max_size_256`(または max_size 値)を FastLane に渡して “call を消す”
- ただし “FastLane で同じ判定を二度しない” を守る(境界 1 箇所) - ただし “FastLane で同じ判定を二度しない” を守る(境界 1 箇所)
また、FastLane free 側は `free_tiny_fast()` と Tiny header 検証が二重になりやすいので、次の指示書で重複排除を優先する:
- `docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md`