docs: record Phase 9 GO promotion; add Phase 10 instructions
Phase 9 updates: - Mark Phase 9 as promoted (GO +2.72%) - Update CURRENT_TASK.md with Phase 9 results - Update PHASE9 docs with promotion status Phase 10 instructions: - New: PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md - Target: Extend free_tiny_fast() "LEGACY direct" to C4-C7 - Strategy: Safe conditions + early-exit (similar to Phase 9 success pattern) - ENV: HAKMEM_FREE_TINY_FAST_MONO_LEGACY_DIRECT=0/1 - Expected: +1-3% (C4-C7 coverage expansion) Files modified: - CURRENT_TASK.md: Phase 9 GO record, Phase 10 next - docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_AB_TEST_RESULTS.md - docs/analysis/PHASE9_FREE_TINY_FAST_MONO_DUALHOT_1_NEXT_INSTRUCTIONS.md Files added: - docs/analysis/PHASE10_FREE_TINY_FAST_MONO_LEGACY_DIRECT_1_NEXT_INSTRUCTIONS.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -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<<class)` の 1 回だけで判定する
|
||||
3) `g_tiny_route_snapshot_done == 1` かつ `g_tiny_route_class[class_idx] == TINY_ROUTE_LEGACY`
|
||||
- 目的: TinyHeap/hotheap ルートを誤って LEGACY に落とさない
|
||||
4) `tiny_env_cfg()->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 に戻せる。
|
||||
@ -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%)
|
||||
|
||||
### 検証済み項目
|
||||
|
||||
|
||||
@ -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`
|
||||
|
||||
|
||||
Reference in New Issue
Block a user