diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index d8e00987..7f01d9da 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -37,6 +37,12 @@ ### Next: TBD(Phase 6 完了、次の芯を検討中) +現状の候補(優先順): +1) **Phase 7: FastLane Free Hot/Cold Alignment** + - FastLane free が `free_tiny_fast()`(monolithic)固定で、既存の勝ち箱 `free_tiny_fast_hot()`(Hot/Cold + DUALHOT)が効かない “ねじれ” を解消する。 + - 指示書: `docs/analysis/PHASE7_FRONT_FASTLANE_FREE_HOTCOLD_1_NEXT_INSTRUCTIONS.md` + - A/B: `HAKMEM_FREE_TINY_FAST_HOTCOLD=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/PHASE7_FRONT_FASTLANE_FREE_HOTCOLD_1_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE7_FRONT_FASTLANE_FREE_HOTCOLD_1_NEXT_INSTRUCTIONS.md new file mode 100644 index 00000000..ca2a8411 --- /dev/null +++ b/docs/analysis/PHASE7_FRONT_FASTLANE_FREE_HOTCOLD_1_NEXT_INSTRUCTIONS.md @@ -0,0 +1,99 @@ +# Phase 7: FastLane Free Hot/Cold Alignment(次の指示書) + +## 0. 目的(狙い) + +Phase 6 で FastLane(default ON)+ Free DeDup(default ON)まで本線化できた。次は **FastLane free が `free_tiny_fast()`(monolithic)固定になっている不整合**を解消し、既存の勝ち箱である **`free_tiny_fast_hot()`(Hot/Cold + DUALHOT)** を FastLane からも使えるようにする。 + +狙いは「新しい最適化」ではなく、**既存の勝ちパスを FastLane にも通す**こと。 + +- 期待: **+1〜4%**(free 支配なので上振れあり) +- リスク: 中(`free_tiny_fast_cold()` は `noinline,cold` のため、cold 比率が高いと回帰し得る) + +## 1. 現状と問題(Box のねじれ) + +現状: +- wrapper の free 入口では `HAKMEM_FREE_TINY_FAST_HOTCOLD=1` のとき `free_tiny_fast_hot()` が使われる。 +- しかし Phase 6 の FastLane free は `free_tiny_fast()` を直接呼ぶため、**hot/cold 側の勝ち箱(DUALHOT 等)が FastLane 経由だと効かない**。 + +この “ねじれ” を直すのが Phase 7 の芯。 + +## 2. 変更方針(境界は 1 箇所のまま) + +- `front_fastlane_try_free()` の **DeDup 経路**(default path)で、 + - `HAKMEM_FREE_TINY_FAST_HOTCOLD=1` → `free_tiny_fast_hot(ptr)` を使う + - `HAKMEM_FREE_TINY_FAST_HOTCOLD=0` → 従来どおり `free_tiny_fast(ptr)` +- class mask 運用(`HAKMEM_FRONT_FASTLANE_CLASS_MASK!=0xFF`)の互換のため、 + - **mask を絞っている場合は従来経路を維持**(FastLane が “勝手に free しない”) + +境界: +- handled → return(FastLane 内で完結) +- not handled → wrapper へフォールバック(従来どおり) + +## 3. 実装指示(小パッチ順) + +### Patch 1: FastLane free の DeDup 経路を hot/cold 対応にする + +対象: +- `core/box/front_fastlane_box.h` + +変更点(概略): +- 既存(DeDup 経路): + - `int result = free_tiny_fast(ptr);` +- 変更後: + - `int result = hak_free_tiny_fast_hotcold_enabled() ? free_tiny_fast_hot(ptr) : free_tiny_fast(ptr);` + +注意: +- `front_fastlane_box.h` は `../front/malloc_tiny_fast.h` を include 済みなので、 + - `free_tiny_fast_hot()` / `hak_free_tiny_fast_hotcold_enabled()` は追加 include なしで参照できる想定。 +- Fail-Fast(`!g_initialized`)は維持。 +- `HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0`(mask 運用用)は従来のまま。 + +## 4. A/B(同一バイナリ) + +前提: +- `HAKMEM_FRONT_FASTLANE=1`(default ON) +- `HAKMEM_FRONT_FASTLANE_FREE_DEDUP=1`(default ON) + +### Mixed 10-run(clean env) + +A: hot/cold OFF(monolithic) +```sh +HAKMEM_FREE_TINY_FAST_HOTCOLD=0 scripts/run_mixed_10_cleanenv.sh +``` + +B: hot/cold ON(FastLane でも hot/cold を使う) +```sh +HAKMEM_FREE_TINY_FAST_HOTCOLD=1 scripts/run_mixed_10_cleanenv.sh +``` + +判定(Mixed 10-run mean): +- GO: **+1.0% 以上** +- NEUTRAL: **±1.0%** +- NO-GO: **-1.0% 以下** + +### C6-heavy 5-run(任意) + +```sh +HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 HAKMEM_FREE_TINY_FAST_HOTCOLD=0 ./bench_mid_large_mt_hakmem 1 1000000 400 1 +HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 HAKMEM_FREE_TINY_FAST_HOTCOLD=1 ./bench_mid_large_mt_hakmem 1 1000000 400 1 +``` + +## 5. 健康診断(必須) + +```sh +scripts/verify_health_profiles.sh +``` + +## 6. 昇格(GO のときだけ) + +- `core/bench_profile.h` の `MIXED_TINYV3_C7_SAFE` は既に `HAKMEM_FREE_TINY_FAST_HOTCOLD=1`(想定)なので、**追加作業不要**。 +- `C6_HEAVY_LEGACY_POOLV1` も必要なら default=1 を維持。 +- `CURRENT_TASK.md` に A/B 数値と rollback を追記。 + +## 7. Rollback + +- `HAKMEM_FREE_TINY_FAST_HOTCOLD=0`(FastLane free も monolithic に戻る) +- さらに戻すなら + - `HAKMEM_FRONT_FASTLANE_FREE_DEDUP=0` + - `HAKMEM_FRONT_FASTLANE=0` +