58 lines
2.1 KiB
Markdown
58 lines
2.1 KiB
Markdown
|
|
# Phase 2 B4: WRAPPER-SHAPE-1(malloc/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 に昇格。
|
|||
|
|
|