From 4c4796a1f8ed09653fcc8581de4f3b2e08b0a55d Mon Sep 17 00:00:00 2001 From: "Moe Charm (CI)" Date: Sat, 13 Dec 2025 17:32:34 +0900 Subject: [PATCH] =?UTF-8?q?Phase=202=20B4:=20Documentation=20&=20Instructi?= =?UTF-8?q?on=20Creation=20(Phase=202=E2=86=923=20Transition)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documentation Created: - docs/analysis/PHASE2_STRUCTURAL_CHANGES_NEXT_INSTRUCTIONS.md: Phase 2 完了レポート (B3+B4累積 +4.4%) - docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md: Phase 3 開始指示(C3 Static Routing優先) Verification Completed: - ✅ HAKMEM_WRAP_SHAPE=1 プリセット昇格(core/bench_profile.h:67) - ✅ wrapper_env_refresh_from_env() 実装済み(core/box/wrapper_env_box.c:49-64) - ✅ malloc_cold() lock_depth 対称性確認(全 return 経路で g_hakmem_lock_depth--) - ✅ A/B テスト結果: Mixed +1.47% (≥+1.0% GO threshold) Summary: B3 routing shape: +2.89% B4 wrapper shape: +1.47% ───────────────── Estimated total: ~+4.4% Next Phase: Phase 3 (Cache Locality, +12-22%) - Priority: C3 (Static Routing) - bypass policy_snapshot, +5-8% expected - Profile: perf top で malloc/policy_snapshot hot spot を特定推奨 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 --- CURRENT_TASK.md | 6 +- ...E2_STRUCTURAL_CHANGES_NEXT_INSTRUCTIONS.md | 81 ++++++++++++++++ ...PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md | 97 +++++++++++++++++++ 3 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 docs/analysis/PHASE2_STRUCTURAL_CHANGES_NEXT_INSTRUCTIONS.md create mode 100644 docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index df0f6919..1897cdda 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -127,7 +127,7 @@ **C6-heavy**: Deferred(pre-existing linker issue in bench_allocators_hakmem, not B4-related) **Decision**: ✅ **ADOPT as default** (Mixed +1.47% >= +1.0% threshold) -- Next: Enable HAKMEM_WRAP_SHAPE=1 in MIXED_TINYV3_C7_SAFE profile +- ✅ Done: `MIXED_TINYV3_C7_SAFE` プリセットで `HAKMEM_WRAP_SHAPE=1` を default 化(bench_profile) ### Phase 1: Quick Wins(完了) @@ -139,11 +139,13 @@ - ❌ **B1(Header tax 削減 v2)**: `HAKMEM_TINY_HEADER_MODE=LIGHT` は Mixed -2.54% → NO-GO / freeze(`docs/analysis/PHASE2_B1_HEADER_TAX_AB_TEST_RESULTS.md`) - ✅ **B3(Routing 分岐形最適化)**: `HAKMEM_TINY_ALLOC_ROUTE_SHAPE=1` は Mixed +2.89% / C6-heavy +9.13% → ADOPT(プリセット default=1) -- ▶ **B4(次の芯)**: WRAPPER-SHAPE-1(malloc/free のホット整形。`docs/analysis/PHASE2_B4_WRAPPER_SHAPE_1_DESIGN.md`) +- ✅ **B4(WRAPPER-SHAPE-1)**: `HAKMEM_WRAP_SHAPE=1` は Mixed +1.47% → ADOPT(`docs/analysis/PHASE2_B4_WRAPPER_SHAPE_1_DESIGN.md`) - (保留)**B2**: C0–C3 専用 alloc fast path(入口短絡は回帰リスク高。B4 の後に判断) ### Phase 3: Cache Locality (Weeks 4-5) - Target: +12-22% (57-68M ops/s) +**指示書**: `docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md` + **優先度 C1** - TLS cache prefetch: - `__builtin_prefetch(g_small_policy_v7, 0, 3)` on malloc entry - Improve L1 hit rate on cold start diff --git a/docs/analysis/PHASE2_STRUCTURAL_CHANGES_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE2_STRUCTURAL_CHANGES_NEXT_INSTRUCTIONS.md new file mode 100644 index 00000000..b7a24a5a --- /dev/null +++ b/docs/analysis/PHASE2_STRUCTURAL_CHANGES_NEXT_INSTRUCTIONS.md @@ -0,0 +1,81 @@ +# Phase 2: 構造修正 完了レポート(2025-12-13) + +## 概要 + +Phase 2 では **wrapper 層とアロケーション経路のルーティング形** に焦点を当て、3つのサブフェーズ(B1, B3, B4)を実装。最終的に **B3 + B4 の組み合わせで +4.4% の改善** を達成。 + +## 実装内容 + +### B1: Header Tax 削減 v2 ❌ NO-GO + +**狙い**: Header write の条件分岐を削減(HEADER_MODE=LIGHT) + +**結果**: +- Mixed (10-run): 48.89M → 47.65M ops/s (**-2.54%**, regression) +- 理由: 条件チェックオーバーヘッドが memory store 削減効果を上回る +- 決定: **FREEZE** (research box, ENV opt-in) + +### B3: Routing 分岐形最適化 ✅ ADOPT + +**狙い**: malloc_tiny_fast() 内の rare route(V7, MID, ULTRA)を noinline,cold へ + +**実装**: +- core/front/malloc_tiny_fast.h:252-267 で HAKMEM_TINY_ALLOC_ROUTE_SHAPE dispatch +- Hot path: LIKELY on LEGACY (C0-C7 の大多数) +- Cold path: V7/MID/ULTRA 分岐を cold 領域へ + +**結果**: +- Mixed (10-run): 48.41M → 49.80M ops/s (**+2.89%**, win) +- C6-heavy (5-run): 8.97M → 9.79M ops/s (**+9.13%**, strong) +- 決定: **ADOPT as default** in MIXED_TINYV3_C7_SAFE + +### B4: Wrapper Layer Hot/Cold Split ✅ ADOPT + +**狙い**: wrapper 入口の "稀なチェック"(LD mode、jemalloc、force_libc、診断)を noinline,cold へ + +**実装**: +- malloc_cold() (noinline,cold): LD mode、jemalloc、force_libc、BenchFast、init wait 処理 +- malloc() hot/cold dispatch: HAKMEM_WRAP_SHAPE=1 ENV gate +- free_cold() (noinline,cold): pointer 分類、ownership check、header validation、全フォールバック +- free() hot/cold dispatch: BenchFast → Tiny fast → free_cold() 委譲 + +**結果**: +- Mixed (10-run): 34,750,578 → 35,262,596 ops/s (**+1.47%**, average) +- 決定: **ADOPT as default** (HAKMEM_WRAP_SHAPE=1) + +## 累積効果 + +``` +Phase 2 Combined (B3 + B4): + B3 routing shape: +2.89% + B4 wrapper shape: +1.47% + ───────────────────────── + Estimated total: ~+4.4% +``` + +## 重要な同期機構 + +**bench_profile での ENV 設定の反映**: +``` +core/bench_profile.h:9 → wrapper_env_box.h インクルード +core/box/wrapper_env_box.c:49-64 → wrapper_env_refresh_from_env() 実装 +``` + +bench_profile() 後に wrapper_env_refresh_from_env() を呼び出すことで、 +putenv() が wrapper 側の ENV キャッシュに反映される。 + +## 次フェーズ: Phase 3 計画 + +目標: Cache Locality 最適化 (+12-22%) + +**C3(優先度: 最高)**: Static Routing +- perf top で hot spot を特定 +- malloc_tiny_fast() の policy_snapshot を bypass +- 期待: +5-8% + +**C1/C2**: TLS prefetch + metadata cache optimization +- 期待: +2-4% + 5-10% + +--- + +次の担当者へ: C3 から着手推奨。 diff --git a/docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md b/docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md new file mode 100644 index 00000000..1b9fcf4b --- /dev/null +++ b/docs/analysis/PHASE3_CACHE_LOCALITY_NEXT_INSTRUCTIONS.md @@ -0,0 +1,97 @@ +# Phase 3: Cache Locality 最適化(開始指示) + +## 目標 + +**現状**: Mixed ~35.2M ops/s (B3+B4 後) +**目標**: 57-68M ops/s (+12-22%) + +## Phase 3 構成 + +### C3(優先度: 🔴 最高): Static Routing + +**背景**: +- Mixed の perf top では malloc/policy_snapshot が hot +- 現在: 毎回 malloc 時に policy snapshot + learner evaluation → 大きな overhead +- 案: malloc_tiny_fast() 呼び出し前に "static route" を init 時決定 + +**実装ステップ**: + +1. **Profiling(現状把握)** + ```bash + perf record -F 99 ./bench_random_mixed_hakmem + perf top --call-graph=flame -p [pid] + # → malloc/policy_snapshot/learner がどの程度か確認 + ``` + +2. **Static Route Detection (init 時)** + - malloc_tiny_fast() が呼ばれる前に route を "決定" + - 対象: C0-C7 の class 別に「LEGACY が dominant か」を判定 + - ENV gate: HAKMEM_STATIC_ROUTE=1/0 (default 0) + +3. **Route Bypass** + ```c + // 現在(毎回評価): + route = g_policy_learner->get_route(class_idx); // 高コスト + + // C3 Static(init 時決定): + if (static_route_enabled()) { + route = g_static_route[class_idx]; // cached, no learner + } else { + route = learner_route(...); // 従来通り + } + ``` + +4. **期待**: +5-8% +5. **A/B Test**: Mixed 10-run + C6-heavy 5-run + +### C1(優先度: 🟡 中): TLS Cache Prefetch + +**狙い**: policy_snapshot 実行前に g_small_policy_v7 をプリフェッチ + +**実装**: +```c +__builtin_prefetch(g_small_policy_v7, 0, 3); // L1 cache, write intent +``` + +**期待**: +2-4% + +### C2(優先度: 🟡 中): Slab Metadata Cache Optimization + +**狙い**: hot metadata(policy, slab descriptor)をより近い場所に配置 + +**期待**: +5-10% + +## 実装フロー + +``` +1. C3(Static Routing)実装 & A/B test + ├─ GO: default 化 + └─ NO-GO: freeze + +2. C1(TLS Prefetch)追加実装 + └─ Cumulative test + +3. C2(Metadata Optimization) + └─ Final A/B +``` + +## 安全性確認 + +- **LD mode**: static route は LD 環境では disable(policy learner は LD で active) +- **Lock depth**: malloc 側なので不要 +- **Rollback**: ENV gate で即時 OFF 可能 + +## 次のアクション + +**今すぐ**: +1. `perf record -F 99 ./bench_random_mixed_hakmem` を実行して hot spot 特定 +2. policy_snapshot / learner evaluation の overhead 定量化 +3. C3 static route detection の実装開始 + +**以降**: +- A/B テスト(Mixed 10-run)で +5-8% 確認 +- C1/C2 の段階的導入 + +--- + +**背中が見える段階から、さらに奥深く。**