From c0d2f47f7dd13a1477585a1d25901663a288452c Mon Sep 17 00:00:00 2001 From: "Moe Charm (CI)" Date: Sun, 14 Dec 2025 17:09:57 +0900 Subject: [PATCH] docs: Phase 6-2 FastLane free dedup instructions --- CURRENT_TASK.md | 7 ++ ...FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md | 117 ++++++++++++++++++ ...PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md | 3 + 3 files changed, 127 insertions(+) create mode 100644 docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 17bbd7fb..41f30f5c 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -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) diff --git a/docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md new file mode 100644 index 00000000..9de81681 --- /dev/null +++ b/docs/analysis/PHASE6_FRONT_FASTLANE_2_FREE_DEDUP_NEXT_INSTRUCTIONS.md @@ -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) + diff --git a/docs/analysis/PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md index 404bf48d..0f560be4 100644 --- a/docs/analysis/PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md +++ b/docs/analysis/PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md @@ -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`