diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 563165ea..79922ebd 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -51,14 +51,24 @@ - 実装 + A/B: `docs/analysis/PHASE8_FREE_STATIC_ROUTE_ENV_CACHE_FIX_1_AB_TEST_RESULTS.md` - コミット: `be723ca05` -### Next: Phase 9(次の芯) +### Phase 9 FREE-TINY-FAST MONO DUALHOT: monolithic `free_tiny_fast()` に C0–C3 direct 移植 — ✅ GO / 本線昇格 -優先候補(GO を狙う小パッチ): -1) **Phase 9: FREE-TINY-FAST MONO DUALHOT (FastLane 対応)** - - 背景: Phase 7(FastLane free を hot/cold に合わせる)は NO-GO。FastLane free は monolithic `free_tiny_fast()` を維持する必要がある。 - - 狙い: wrapper 側で勝っている “C0–C3 は第2ホット” を、**monolithic `free_tiny_fast()` 側に最小固定費で移植**し、FastLane free でも効く状態にする(hot/cold split は持ち込まない)。 - - 期待: +1〜4%(C0–C3 が支配的な Mixed で上振れあり) - - 指示書: `docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md` +結果: Mixed 10-run mean **+2.72%**、標準偏差 **-60.8%**。Phase 7 の NO-GO(関数 split)を教訓に、monolithic 内 early-exit で “第2ホット(C0–C3)” を FastLane free にも通した。 + +- 指示書(完了): `docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md` +- 実装 + A/B: `docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md` +- コミット: `871034da1` +- Rollback: `export HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=0` + +### Next: Phase 10(次の芯) + +Perf(Phase 9 後, Mixed)で `front_fastlane_try_free` が依然 top(free 側が支配的)。次は **FastLane free / legacy fallback の固定費削減**を狙う。 + +候補(GO を狙う小パッチ): +1) **Phase 10: FREE-TINY-FAST “LEGACY direct” 拡張(C4–C7 を含む、断定できる範囲だけ)** + - 目的: `free_tiny_fast()` の “policy/route/ENV チェック” の残り固定費を削減し、`front_fastlane_try_free` を更に薄くする + - 方針: 断定できる条件(route snapshot / no-learner / no-larson-fix 等)のみ direct → それ以外は既存経路へ(Fail-Fast) + - 指示書: `docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md` ## 更新メモ(2025-12-14 Phase 5 E5-3 Analysis - Strategic Pivot) diff --git a/docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md new file mode 100644 index 00000000..2d66ff4f --- /dev/null +++ b/docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md @@ -0,0 +1,161 @@ +# Phase 10: FREE-TINY-FAST MONO LEGACY DIRECT(FastLane free 固定費削減)次の指示書 + +## 0. 目的(狙い) + +Phase 6 FastLane + Phase 6-2 Free DeDup + Phase 9 MONO DUALHOT により、Mixed の free は主に: + +`free()` wrapper → `front_fastlane_try_free()` → monolithic `free_tiny_fast()` + +へ集約された。 + +次の芯は、`free_tiny_fast()` 内の **“LEGACYで確実に断定できるケース”** から、残っている固定費(policy/route/ENV/TLS の読み分け)をさらに削り、`front_fastlane_try_free` の実効コストを落とすこと。 + +## 1. 現状(観測) + +Perf(Phase 9 後, Mixed)で `front_fastlane_try_free` が依然 top。ここは `free_tiny_fast()` が inline されているため、free 側の勝負所がここに集中している。 + +## 2. 方針(Box Theory) + +- 箱(L0/L1/L2): + - L0: `FreeTinyFastMonoLegacyDirectEnvBox`(ENV gate のみ、A/B と即 rollback のため) + - L1: `free_tiny_fast()`(monolithic hot path) + - L2: `free_path_stats_box.h`(最小カウンタ、debug only) +- 境界(変換点 1 箇所): + - `free_tiny_fast()` 冒頭(header→class_idx→base 確定直後)に 1 箇所だけ early-exit を置く + - それ以外の既存経路は崩さない(Fail-Fast) +- 戻せる: + - ENV で OFF にできる(同一バイナリ A/B) +- Fail-Fast: + - “断定できない” 場合は必ず既存経路へ(特に MID/ULTRA/v7 を誤って LEGACY に落とさない) +- 見える化(最小): + - `mono_legacy_direct_hit` を 1 箇所だけ(`HAKMEM_DEBUG_COUNTERS=1` のときのみ) + +## 3. 仕様(MONO LEGACY DIRECT の条件) + +`free_tiny_fast()` で **以下の条件をすべて満たす場合のみ** direct を許可する: + +1) `HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=1` +2) **cached non-LEGACY mask** 上で non-LEGACY ではない(= ULTRA/MID/V7 が絡まない) + - 目的: `SMALL_ROUTE_ULTRA` / `MID_V3/V35` / `V7` を誤って LEGACY に落とさない + - 実装: env box 初期化時に `free_policy_fast_v2_nonlegacy_mask()`(Phase POLICY-FAST-PATH-V2 の計算)相当を **一度だけ**実行して `uint8_t nonlegacy_mask` をキャッシュし、hot path では `mask & (1u<larson_fix == 0` + - 目的: Larson fix(cross-thread 判定が必要なモード)では direct 禁止 + +direct path の中身: + +- `FREE_PATH_STAT_INC(mono_legacy_direct_hit);` +- `tiny_legacy_fallback_free_base(base, class_idx);` +- `return 1;` + +注: +- Phase 9(C0–C3 direct)は「第2ホット」対策として残す(Phase 10 は “C4–C7 を含む拡張” が主目的)。 +- `class_idx == 7` は `C7 ULTRA early-exit` が先に効く想定。条件 2) の nonlegacy mask でも弾かれるため安全側。 + +## 4. 実装指示(小パッチ順) + +### Patch 1: ENV gate 箱を追加(L0) + +新規: +- `core/box/free_tiny_fast_mono_legacy_direct_env_box.h` + +ENV: +- `HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0/1`(default 0) + +要件: +- probe window 64(bench_profile の putenv 競合に耐える) +- hot path: cached==1/0 の即 return +- 追加: `uint8_t nonlegacy_mask` を env box でキャッシュ(init 時に 1 回だけ計算) + +API(例): +- `static inline int free_tiny_fast_mono_legacy_direct_enabled(void)` +- `static inline uint8_t free_tiny_fast_mono_legacy_direct_nonlegacy_mask(void)` + +### Patch 2: `free_tiny_fast()` に early-exit を追加(L1) + +対象: +- `core/front/malloc_tiny_fast.h` の `free_tiny_fast(void* ptr)` + +差し込み位置(変換点 1 箇所): +- header magic / class_idx 抽出 +- `base = tiny_user_to_base_inline(ptr)` 取得直後 + +やること: +- Phase 9(C0–C3 direct)/ C7 ULTRA early-exit の **後**(または干渉しない位置)に + - “MONO LEGACY DIRECT” 判定を追加 +- 条件が揃えば `tiny_legacy_fallback_free_base(base, class_idx); return 1;` +- 条件が揃わなければ **既存経路を完全維持** + +### Patch 3: 見える化(最小) + +対象: +- `core/box/free_path_stats_box.h` + +追加: +- `uint64_t mono_legacy_direct_hit;` + +増分: +- direct path で `FREE_PATH_STAT_INC(mono_legacy_direct_hit);` + +### Patch 4: A/B 用の cleanenv 追記(任意) + +対象: +- `scripts/run_mixed_10_cleanenv.sh` + +追記候補: +- `export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=${HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT:-0}` + +(注: 本線 preset で default ON に昇格するまでは 0 固定で良い) + +## 5. A/B(同一バイナリ) + +### Mixed 10-run(clean env) + +Baseline: +```sh +HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0 scripts/run_mixed_10_cleanenv.sh +``` + +Optimized: +```sh +HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=1 scripts/run_mixed_10_cleanenv.sh +``` + +判定(Mixed 10-run mean): +- GO: **+1.0% 以上** +- NEUTRAL: **±1.0%** +- NO-GO: **-1.0% 以下** + +### C6-heavy(必須) + +目的: nonlegacy mask が効いており、MID v3 有効時に direct が誤爆しないことを確認。 + +```sh +HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0 ./bench_mid_large_mt_hakmem 1 1000000 400 1 +HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=1 ./bench_mid_large_mt_hakmem 1 1000000 400 1 +``` + +期待: +- ほぼニュートラル(C6 は MID v3 で nonlegacy mask により direct しない) + +## 6. 健康診断(必須) + +```sh +scripts/verify_health_profiles.sh +``` + +## 7. 昇格(GO のときだけ) + +- `core/bench_profile.h` + - `MIXED_TINYV3_C7_SAFE` に `bench_setenv_default("HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT","1")` を追加 + - `C6_HEAVY_LEGACY_POOLV1` は **未設定のまま**推奨(誤爆防止のため、必要なら別プリセットへ) +- `CURRENT_TASK.md` に A/B 結果と rollback を追記 + +## 8. Rollback + +```sh +export HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0 +``` + +同一バイナリで即座に baseline に戻せる。 diff --git a/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md b/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md index 376ed42e..89ba740f 100644 --- a/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md +++ b/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md @@ -1,5 +1,13 @@ # Phase 9: FREE-TINY-FAST MONO DUALHOT A/B テスト結果 +## Status(2025-12-14) + +**✅ GO / 本線昇格(+2.72% Mixed 10-run, σ -60.8%)** + +- コミット: `871034da1` +- Preset: `core/bench_profile.h`(`MIXED_TINYV3_C7_SAFE` で default ON) +- Rollback: `export HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=0` + ## 実装概要 ### 目的 @@ -177,15 +185,12 @@ Phase 7 は関数 split(hot/cold)を合わせに行って負けたが、Phas ## 次のステップ -### 昇格(GO のため) +### 昇格(GO)— 完了 -1. **`core/bench_profile.h` に preset 追加**: - - `MIXED_TINYV3_C7_SAFE` に `bench_setenv_default("HAKMEM_FREE_TINY_FAST_MONO_DUALHOT","1")` を追加 - - `C6_HEAVY_LEGACY_POOLV1` は未設定のまま(C0–C3 専用のため影響が小さい) +Phase 9 は本線に昇格済み(`871034da1`)。 -2. **`CURRENT_TASK.md` に記録**: - - Phase 9 の A/B 数値(+2.72%) - - Rollback 手順: `export HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=0` +- `core/bench_profile.h`: `MIXED_TINYV3_C7_SAFE` に `HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=1` +- `CURRENT_TASK.md`: Phase 9 GO を記録(+2.72% / σ -60.8%) ### 検証済み項目 diff --git a/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md index d1343620..dad9ead4 100644 --- a/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md +++ b/docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md @@ -1,5 +1,14 @@ # Phase 9: FREE-TINY-FAST MONO DUALHOT(FastLane 対応)次の指示書 +## Status(2025-12-14) + +**✅ GO / 本線昇格(+2.72% Mixed 10-run, σ -60.8%)** + +- A/B 結果: `docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md` +- コミット: `871034da1` +- Preset: `core/bench_profile.h` に `HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=1`(`MIXED_TINYV3_C7_SAFE`) +- Rollback: `export HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=0` + ## 0. 目的(狙い) Phase 6 FastLane + Phase 6-2 Free DeDup により、Mixed の free は主に **FastLane → monolithic `free_tiny_fast()`** を通る。 @@ -140,4 +149,3 @@ scripts/verify_health_profiles.sh ## 8. Rollback - `export HAKMEM_FREE_TINY_FAST_MONO_DUALHOT=0` -