Files
hakmem/docs/analysis/PHASE3_C3_STATIC_ROUTING_1_DESIGN.md
Moe Charm (CI) d54893ea1d Phase 3 C3: Static Routing A/B Test ADOPT (+2.20% Mixed gain)
Step 2 & 3 Complete:
- A/B test (Mixed 10-run): STATIC_ROUTE=0 (38.91M) → =1 (39.77M) = +2.20% avg
  - Median gain: +1.98%
  - Result:  GO (exceeds +1.0% threshold)

- Decision:  ADOPT into MIXED_TINYV3_C7_SAFE preset
  - bench_profile.h line 77: HAKMEM_TINY_STATIC_ROUTE=1 default
  - Learner auto-disables static route when HAKMEM_SMALL_LEARNER_V7_ENABLED=1

Implementation Summary:
- core/box/tiny_static_route_box.{h,c}: Research box (Step 1A)
- core/front/malloc_tiny_fast.h: Route lookup integration (Step 1B, lines 249-256)
- core/bench_profile.h: Bench sync + preset adoption

Cumulative Phase 2-3 Gains:
- B3 (Routing shape): +2.89%
- B4 (Wrapper split): +1.47%
- C3 (Static routing): +2.20%
- Total: ~6.8% (35.2M → ~39.8M ops/s)

Next: Phase 3 C1 (TLS Prefetch, expected +2-4%)

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-13 18:46:11 +09:00

4.1 KiB
Raw Blame History

Phase 3 C3: Tiny Static Routingpolicy snapshot bypass設計メモ

目的(なにを削るか)

malloc_tiny_fast_for_class() / tiny_alloc_gate_fast() の hot path で毎回呼ばれている small_policy_v7_snapshot()TLS policy snapshotroute_kind[class] ロードを 省略し、 「このプロファイルでは route が固定」という前提で class→route を静的テーブル参照に置換する。

狙いはアルゴリズム変更ではなく instruction / cache / branch の削減。

非目標(やらないこと)

  • Learner の学習ロジックを hot path に混ぜないLearning Layer の箱を汚さない)
  • route の意味ULTRA/MID/LEGACY/V7や優先順位は変えない
  • 既存の ENV の意味を変えないA/B で戻せる)

Box Theory箱割り

L0: StaticRouteEnvBox戻せる

  • ENV: HAKMEM_TINY_STATIC_ROUTE=0/1default: 0
  • 強制無効(安全フェンス):
    • Learner が有効な場合は自動で OFFstatic route は learner の更新を反映できない)
    • LD safe / diagnostic モード等の特殊経路では OFFwrapper 側の cold に回す)

L1: TinyStaticRouteBox境界: 1 箇所)

責務: class_idx -> route_kind静的スナップショットを保持するだけ。

  • データ:
    • SmallRouteKind route_kind[8]
    • inited1 回だけ初期化)
  • 初期化境界:
    • small_policy_v7_init_from_env(&tmp) を 1 回呼び、tmp.route_kind[] をコピー
    • ※ Learner の update は一切適用しないLearner ON なら L0 で無効化)

L2: Front Integrationhot path の差し替え点)

malloc_tiny_fast_for_class()route_kind を取る部分だけを差し替える:

if (static_route_enabled) {
  route_kind = g_tiny_static_route.route_kind[class_idx];
} else {
  route_kind = small_policy_v7_snapshot()->route_kind[class_idx];
}

以降の dispatchB3: route shape / 従来 switchそのまま

実装指示(小パッチ順序)

  1. ENV gate を追加

    • HAKMEM_TINY_STATIC_ROUTE を読み、cached にするprobe window 方式は不要推奨)
    • 併せて「Learner 有効なら強制 OFF」を入れるENV を直に読むだけでよい)
  2. TinyStaticRouteBox を追加

    • core/box/tiny_static_route_box.h/.c
    • tiny_static_route_init_once() / tiny_static_route_route_kind(class_idx) を提供
  3. malloc_tiny_fast_for_class に統合

    • route_kind 取得を Box 経由に変更static ON の時だけ bypass
    • 既存の B3 HAKMEM_TINY_ALLOC_ROUTE_SHAPE合成できること(静的 route を feed するだけ)
  4. ベンチ用の ENV 注入putenv対策

    • bench は bench_apply_profile() が putenv するため、必要なら:
      • small_policy_v7_bump_version()bench_apply_profile() 末尾で呼び、policy snapshot が「最終 ENV」を読むようにする
      • tiny_static_route_refresh_from_env() を用意し、bench_apply_profile() の末尾で呼ぶ
    • ただし tiny_env_cfg() と同様に「初回呼び出しが bench_apply_profile 後」なら refresh は不要。
      • 先に tiny_static_route_init が走らないことを確認してから追加する(余計な分岐は増やさない)。
  5. 最小可視化debug counters のみ)

    • HAKMEM_DEBUG_COUNTERS が 1 のときだけ:
      • static_route_hit / static_route_fallback を 64-bit で増やす
    • 常時ログは禁止(ワンショットのみ許可)

GO/NO-GO ゲートA/B

  • MixedHAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE10-run:
    • GO: +1.0% 以上
    • NO-GO: -1.0% 以下freeze
  • C6-heavyHAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV15-run:
    • 参考(勝っても Mixed で負けたら本線には入れない)

想定される落とし穴

  • small_policy_v7_snapshot() 自体が既に十分軽い場合:
    • bypass のメリットが薄く、追加分岐が負ける(その場合は迷わず freeze
  • Learner ON の状態で static route を ON にすると:
    • route 変更が反映されず挙動がズレる → L0 で強制 OFF