diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index e097cae1..031f3eb5 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -16,7 +16,7 @@ **Decision: GO** (+3.35% >= +1.0% threshold) - Exceeds conservative estimate (+3-5%) → Achieved +3.35% -- Action: Promote to `MIXED_TINYV3_C7_SAFE` preset (HAKMEM_FREE_TINY_DIRECT=1 default) +- Action: Promote to `MIXED_TINYV3_C7_SAFE` preset (HAKMEM_FREE_TINY_DIRECT=1 default) ✅ **Health Check**: ✅ PASS - MIXED_TINYV3_C7_SAFE: 41.9M ops/s @@ -24,7 +24,7 @@ - All profiles passed, no regressions **Implementation**: -- ENV gate: `HAKMEM_FREE_TINY_DIRECT=0/1` (default: 0 → promote to 1) +- ENV gate: `HAKMEM_FREE_TINY_DIRECT=0/1` (default: 0, preset(MIXED)=1) - Files created: - `core/box/free_tiny_direct_env_box.h` (ENV gate) - `core/box/free_tiny_direct_stats_box.h` (Stats counters) @@ -58,6 +58,7 @@ - Design docs: - `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_DESIGN.md` - `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_AB_TEST_RESULTS.md` + - `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_NEXT_INSTRUCTIONS.md` - `docs/analysis/PHASE5_E5_COMPREHENSIVE_ANALYSIS.md` --- diff --git a/docs/analysis/ENV_PROFILE_PRESETS.md b/docs/analysis/ENV_PROFILE_PRESETS.md index f7d81833..cc4c7541 100644 --- a/docs/analysis/ENV_PROFILE_PRESETS.md +++ b/docs/analysis/ENV_PROFILE_PRESETS.md @@ -45,6 +45,7 @@ HAKMEM_BENCH_MAX_SIZE=1024 - `HAKMEM_MID_V3_ENABLED=0`(Mixed 本線では OFF。C6-heavy のみ推奨ON) - `HAKMEM_MID_V3_CLASSES=0x0`(Mixed 本線では未使用) - `HAKMEM_MID_V35_ENABLED=0`(Phase v11a-5: Mixed では MID v3.5 OFF が最速) +- `HAKMEM_FREE_TINY_DIRECT=1`(Phase 5 E5-1: free() で Tiny を直通、重複排除) ### 任意オプション - stats を見たいとき: @@ -131,6 +132,13 @@ HAKMEM_MALLOC_WRAPPER_ENV_SNAPSHOT=1 - **Status**: ✅ GO(Mixed 10-run: **+21.83% mean / +22.86% median**)→ ✅ Promoted to `MIXED_TINYV3_C7_SAFE` preset default(opt-out 可) - **Effect**: `malloc()` wrapper の tiny fast 判定を TLS snapshot で短絡し、hot path の関数呼び出し/判定を削減(特に `tiny_get_max_size()`) - **Rollback**: `HAKMEM_MALLOC_WRAPPER_ENV_SNAPSHOT=0` +- **Phase 5 E5-1(Free Tiny Direct Path)** ✅ GO (PROMOTED TO DEFAULT): +```sh +HAKMEM_FREE_TINY_DIRECT=1 +``` + - **Status**: ✅ GO(Mixed 10-run: **+3.35% mean / +3.36% median**)→ ✅ Promoted to `MIXED_TINYV3_C7_SAFE` preset default(opt-out 可) + - **Effect**: free wrapper で Tiny header を 1 回だけ検証し、Tiny free を直通(重複/コールド分岐を回避) + - **Rollback**: `HAKMEM_FREE_TINY_DIRECT=0` - v2 系は触らない(C7_SAFE では Pool v2 / Tiny v2 は常時 OFF)。 - FREE_POLICY/THP を触る実験例(現在の HEAD では必須ではなく、組み合わせによっては微マイナスになる場合もある): ```sh diff --git a/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_AB_TEST_RESULTS.md b/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_AB_TEST_RESULTS.md index 953922ee..931bd767 100644 --- a/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_AB_TEST_RESULTS.md +++ b/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_AB_TEST_RESULTS.md @@ -11,7 +11,7 @@ ## Test Configuration **Workload**: Mixed (16-1024B, ws=400, 20M iterations) -**Baseline Profile**: `MIXED_TINYV3_C7_SAFE` (E4-1+E4-2 ON) +**Baseline Profile**: `MIXED_TINYV3_C7_SAFE`(E4-1+E4-2 を含む既定設定) **Test Runs**: 10-run A/B test (same binary, ENV toggle) **Platform**: Linux 6.8.0-87-generic @@ -129,10 +129,9 @@ Run 10: 45799630 ops/s - **E5-1 baseline differs**: 44.38M ops/s (note: slightly lower, session variance) - E5-1 ON: 45.87M ops/s (+3.35% from its baseline) -**Note**: E5-1 was tested on a different baseline (44.38M vs 47.34M). This variance is due to: -- Different test session (cache/TLB state) -- Thermal throttling -- Kernel scheduler variance +**Note**: `bench_setenv_default()` は “未設定の ENV だけ” を注入するため、 +過去の実験で `HAKMEM_FREE_WRAPPER_ENV_SNAPSHOT=0` / `HAKMEM_MALLOC_WRAPPER_ENV_SNAPSHOT=0` を export したままだと、 +プリセットの既定 ON が効かずベースラインが下がることがあります。 **To measure true cumulative effect**, we should test E4+E5-1 together vs E4 alone in the same session. diff --git a/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_NEXT_INSTRUCTIONS.md new file mode 100644 index 00000000..607b1800 --- /dev/null +++ b/docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_NEXT_INSTRUCTIONS.md @@ -0,0 +1,86 @@ +# Phase 5 E5-1: Free Tiny Direct Path(GO後の指示書) + +## Status(2025-12-14) + +- E5-1 は ✅ GO(Mixed 10-run: **+3.35% mean / +3.36% median**) +- 次は「昇格(preset default)→ 再 baseline → E5-2/E5-3 の順」で進める + +参照: +- Design: `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_DESIGN.md` +- Results: `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_1_AB_TEST_RESULTS.md` + +--- + +## Step 1: プリセット昇格(MIXED の default ON) + +対象: +- `core/bench_profile.h` の `MIXED_TINYV3_C7_SAFE` + +設定(opt-out 可): +- `bench_setenv_default("HAKMEM_FREE_TINY_DIRECT", "1");` + +Rollback: +- `HAKMEM_FREE_TINY_DIRECT=0` + +--- + +## Step 2: ドキュメント反映(プリセット定義) + +- `docs/analysis/ENV_PROFILE_PRESETS.md` + - `MIXED_TINYV3_C7_SAFE` の “自動設定される主な ENV” に `HAKMEM_FREE_TINY_DIRECT=1` を追記 + - Phase 5 E5-1 の項目を追加(A/B と rollback) + +--- + +## Step 3: 同一バイナリでの A/B(昇格確認) + +注意: `bench_setenv_default()` は “未設定の ENV だけ” を注入するため、 +過去の A/B で `HAKMEM_*_WRAPPER_ENV_SNAPSHOT=0` を export したままだと、プリセット ON が効かない。 + +### A: Baseline(E5-1 を明示 OFF) +```sh +HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \ + HAKMEM_FREE_TINY_DIRECT=0 \ + ./bench_random_mixed_hakmem 20000000 400 1 +``` + +### B: Optimized(プリセット default ON を使用) +```sh +HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \ + ./bench_random_mixed_hakmem 20000000 400 1 +``` + +GO/NO-GO: +- Mean +1.0% 以上で OK(既に +3.35% 実績なので基本は通る) + +--- + +## Step 4: 健康診断(必須) + +```sh +scripts/verify_health_profiles.sh +``` + +--- + +## Step 5: 新 baseline で perf(次の芯を選ぶ) + +```sh +HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE perf record -F 99 -- \ + ./bench_random_mixed_hakmem 20000000 400 1 +perf report --stdio --no-children +``` + +判断基準(self% ≥ 5%): +- `tiny_region_id_write_header` が依然 5% 以上 → **E5-2** 優先 +- `hakmem_env_snapshot_enabled` / `tiny_get_max_size` が 5% 付近まで上がる → **E5-3** 優先 + +--- + +## Next(E5-2 / E5-3) + +- E5-2: Header write を refill 境界へ(prefill box) + - 目標: `tiny_region_id_write_header` の hot path stores を減らす(A3 の “always_inline” は NO-GO 済み) +- E5-3: `hakmem_env_snapshot_enabled()` の分岐形/配置を “enabled 前提” に寄せる + - 目標: mispredict を避け、`malloc_tiny_fast.h` 内の繰り返し gate を軽くする + diff --git a/docs/analysis/PHASE5_E5_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE5_E5_NEXT_INSTRUCTIONS.md index d910bc52..766a1285 100644 --- a/docs/analysis/PHASE5_E5_NEXT_INSTRUCTIONS.md +++ b/docs/analysis/PHASE5_E5_NEXT_INSTRUCTIONS.md @@ -13,6 +13,9 @@ 狙い: “形” 最適化は一段落。次は **free 内部** と **ヘッダ書き込み**、そして **ENV snapshot gate の常時コスト**を削る。 +Update: +- E5-1(Free Tiny Direct Path)✅ GO(+3.35% mean / +3.36% median)→ 指示書: `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_NEXT_INSTRUCTIONS.md` + --- ## Step 0: Baseline 固定(Mixed) @@ -60,7 +63,7 @@ perf report --stdio --no-children --symbol free ### 実装ルール - 境界は 1 箇所(`free()` wrapper の先頭分岐で確定) -- `ENV gate`: `HAKMEM_FREE_TINY_DIRECT=0/1`(default 0) +- `ENV gate`: `HAKMEM_FREE_TINY_DIRECT=0/1`(default 0 / preset(MIXED)=1) - 可視化はカウンタのみ(`direct_hit`, `direct_miss`, `invalid_header`) ### GO/NO-GO @@ -127,4 +130,3 @@ scripts/verify_health_profiles.sh - `core/bench_profile.h` の `MIXED_TINYV3_C7_SAFE` に default 化(opt-out 可能) - `docs/analysis/ENV_PROFILE_PRESETS.md` に A/B と rollback を追記 - `CURRENT_TASK.md` を更新(結果と “次の芯” を 1 行で) - diff --git a/docs/analysis/PHASE5_POST_E1_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE5_POST_E1_NEXT_INSTRUCTIONS.md index 3663a835..46ea9358 100644 --- a/docs/analysis/PHASE5_POST_E1_NEXT_INSTRUCTIONS.md +++ b/docs/analysis/PHASE5_POST_E1_NEXT_INSTRUCTIONS.md @@ -72,3 +72,4 @@ scripts/verify_health_profiles.sh - E4-2 設計/実装: `docs/analysis/PHASE5_E4_2_MALLOC_WRAPPER_ENV_SNAPSHOT_NEXT_INSTRUCTIONS.md` - E4 合算 A/B: `docs/analysis/PHASE5_E4_COMBINED_AB_TEST_NEXT_INSTRUCTIONS.md` - E5 次の芯: `docs/analysis/PHASE5_E5_NEXT_INSTRUCTIONS.md` +- E5-1 昇格: `docs/analysis/PHASE5_E5_1_FREE_TINY_DIRECT_NEXT_INSTRUCTIONS.md`