Files
hakmem/docs/analysis/PHASE2_B4_WRAPPER_SHAPE_1_DESIGN.md

58 lines
2.1 KiB
Markdown
Raw Normal View History

# Phase 2 B4: WRAPPER-SHAPE-1malloc/free wrapper のホット/コールド分割)
## 目的
Phase 2 B3 で `malloc_tiny_fast_for_class()` の route dispatch 形は勝ち形に寄せられた。
次の “芯” は wrapper 層(`malloc/free`)の I-cache / 分岐形で、稀なチェックを `noinline,cold` に押し出してホットを最短化する。
狙いは **アルゴリズム変更ではなく「形」**:
- 既存の安全チェックは削らない(移動/集約のみ)
- ホットは `return` で即抜け(重複 work を作らない)
- 失敗/特殊条件は cold に委譲(境界は 1 箇所)
## Box Theory箱割り
### L0: WrapperHotBox
責務: 通常ケースを最短で Tiny fast に到達させ、成功なら即 return。
- `malloc`: init wait → init → Tiny fast → hit で return
- `free`: BenchFast → Tiny free fast → hit で return
### L1: WrapperColdBox
責務: それ以外LD/jemalloc/force_libc/分類/所有権/フォールバック/診断)を 1 箱に集約。
境界: `HAKMEM_WRAP_SHAPE=1` のとき、入口で 1 回だけ hot/cold を分岐する。
## 実装指示(ファイル / 形)
- `core/box/hak_wrappers.inc.h`
- `malloc_cold()` / `free_cold()``__attribute__((noinline, cold))` で追加
- `malloc()` / `free()``HAKMEM_WRAP_SHAPE` gate を追加
- ENV gate:
- `HAKMEM_WRAP_SHAPE=0/1`default 0
- ただしプリセットで default=1 に昇格可能bench_profile
## 可視化(最小)
常時ログは禁止。必要なら:
- ワンショット(数回のみ)
- `HAKMEM_DEBUG_COUNTERS=1` ビルド時だけのカウンタ
## Fail-Fast / 安全
- `g_hakmem_lock_depth` の ++/-- はどの return 経路でも対称に保つ
- safety check の削除は禁止(移動のみ)
## A/B 結果2025-12-13
Mixed 10-run:
- `HAKMEM_WRAP_SHAPE=0`: 34,750,578 ops/s
- `HAKMEM_WRAP_SHAPE=1`: 35,262,596 ops/s
- mean: **+1.47%** / median: **+1.39%** → **GO**
決定:
- `HAKMEM_WRAP_SHAPE` は ENV gate のまま維持しつつ、`MIXED_TINYV3_C7_SAFE` プリセットで default=1 に昇格。