Files
hakmem/docs/analysis/PHASE6_FRONT_FASTLANE_1_DESIGN.md
2025-12-14 16:28:23 +09:00

5.0 KiB
Raw Blame History

Phase 6: Front FastLaneLayer CollapseDesign v1

0. 背景 / ねらい

直近の勝ち筋は「分岐形」ではなく 重複排除(境界の一本化)ENV/TLS 読み回数の削減だった。 一方で “削る(別バイナリ比較)” は配置/LTO の二次効果で壊れやすく NO-GO

外部レビューML2では、次の芯は **Front FastLanewrapper→gate→policy→route の Layer Collapse**が最優先、という結論になった。

  • 外部回答の記録: PHASE_ML2_CHATGPT_RESPONSE_FASTLANE.md
  • 質問状: PHASE_ML2_CHATGPT_QUESTIONNAIRE_FASTLANE.md

1. ゴールBox Theory

  • Hot の入口を 1 箱に畳むmalloc/free の “入口固定費” を減らす)
  • 境界は 1 箇所FastLane → ColdFallback の単一フォールバック)
  • 戻せるENV gate で A/B
  • 見える化は最小hit/fallback のカウンタだけ)
  • Fail-Fast(確信が持てないものは必ず既存経路へ)

2. 非ゴール(やらない)

  • 凍結箱を「削除して痩せさせる」E7 NO-GO
    • 参照: docs/analysis/PHASE5_E7_FROZEN_BOX_PRUNE_AB_TEST_RESULTS.md
  • “branch hint” の固定最適化CPU/モードで逆効果になりやすい)

3. 形Box 図)

                  (ENV: HAKMEM_FRONT_FASTLANE=0/1)
                          +---------------------+
                          | L0: FastLaneEnvBox  |
                          +---------------------+
                                     |
                                     v
  +--------------------+     +--------------------------+
  | malloc/free wrapper| --> | L1: FrontFastLaneBox      |
  | (既存のまま)        |     |  - size->class->route     |
  +--------------------+     |  - try_alloc / try_free   |
                              |  - fast: 直線 + 早期return|
                              +--------------------------+
                                 |                \
                        handled->|                 \ not-handled
                                 v                  v
                      +------------------+   +-----------------------+
                      | L1a: HotHandlers |   | L2: ColdFallbackIface |
                      | (既存を呼ぶだけ) |   | (既存 wrapper 継続)   |
                      +------------------+   +-----------------------+

境界 1 箇所: FrontFastLaneBox が “handled できない” と判断したら即 ColdFallbackIface=既存 wrapper の続き)へ落とす。

4. 既存資産の再利用(重要)

FastLane を “新規で全部作る” のではなく、既に勝っている箱を Hot 入口で 1 回だけ読む形に揃える。

  • Wrapper ENV snapshot:
    • core/box/malloc_wrapper_env_snapshot_box.h
    • core/box/free_wrapper_env_snapshot_box.h
  • Tiny route snapshot:
    • core/box/tiny_route_env_box.hroute_kind を class ごとに決める)
  • ENV snapshot consolidationある場合:
    • core/box/hakmem_env_snapshot_box.h

方針:

  • FastLane 内で “同じ判定を 2 回やらない”。
  • 既存の Hot handler例: malloc_tiny_fast_for_class() / tiny_alloc_gate_fast() / free_tiny_fast())を 呼ぶだけに留める。

5. FastLane の責務L1

5.1 alloc: try_alloc(size) の責務

  • size から class を決める(可能なら LUT / 1 回)
  • class から route を決める(可能なら snapshot / 1 回)
  • “確信が持てる”場合のみ Hot handler に直行し、成功したら即 return
  • 失敗したら 即 not-handledCold へ)

5.2 free: try_free(ptr) の責務

  • 確信が持てる場合のみ tiny free へ直行(例: header で tiny 物を fail-fast 判定できる)
  • それ以外は not-handledCold へ)

6. Fail-Fast安全ゲート

FastLane の原則:

  • “fast path に入る条件” は 必要最小
  • “fallback 条件” は 広く

alloc:

  • size <= tiny_get_max_size()(もしくは wrapper snapshot 由来の cheap 判定)
  • class が範囲内
  • route が “既知の tiny hot handler で処理可能”

free:

  • header magic / class_idx が valid
  • “tiny が確実” と言える場合のみ(曖昧なら必ず Cold

7. ENV / A/B 方針

  • HAKMEM_FRONT_FASTLANE=0/1default 1, opt-out
  • optional:
    • HAKMEM_FRONT_FASTLANE_CLASS_MASK=0x??(段階導入用)

A/B:

  • Mixed 10-run は必ず clean env runner を使うENV 漏れ防止)
    • scripts/run_mixed_10_cleanenv.sh

GO/NO-GO運用:

  • GO: Mixed 10-run mean +1.0% 以上
  • NEUTRAL: ±1.0%freeze
  • NO-GO: -1.0% 以下rollback/freeze

8. 実装方針(小パッチ順)

  1. ENV gate 箱default ON
  2. FrontFastLaneBoxalloc のみ / tiny のみ)
  3. free を追加tiny 直通のみ、曖昧なら落とす)
  4. 最小 statshit/fallback、理由は 3〜6 種類まで)
  5. 健康診断 + Mixed 10-run A/B

次の具体指示は docs/analysis/PHASE6_FRONT_FASTLANE_NEXT_INSTRUCTIONS.md にまとめる。