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:
Moe Charm (CI)
2025-12-14 19:59:15 +09:00
parent 871034da1f
commit 720ae61007
4 changed files with 199 additions and 15 deletions

View File

@ -0,0 +1,161 @@
# Phase 10: FREE-TINY-FAST MONO LEGACY DIRECTFastLane 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. 現状(観測)
PerfPhase 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 fixcross-thread 判定が必要なモード)では direct 禁止
direct path の中身:
- `FREE_PATH_STAT_INC(mono_legacy_direct_hit);`
- `tiny_legacy_fallback_free_base(base, class_idx);`
- `return 1;`
注:
- Phase 9C0C3 directは「第2ホット」対策として残すPhase 10 は “C4C7 を含む拡張” が主目的)。
- `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 64bench_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 9C0C3 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-runclean 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 に戻せる。

View File

@ -1,5 +1,13 @@
# Phase 9: FREE-TINY-FAST MONO DUALHOT A/B テスト結果
## Status2025-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 は関数 splithot/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` は未設定のままC0C3 専用のため影響が小さい)
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%
### 検証済み項目

View File

@ -1,5 +1,14 @@
# Phase 9: FREE-TINY-FAST MONO DUALHOTFastLane 対応)次の指示書
## Status2025-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`