Add comprehensive design docs and research boxes: - docs/analysis/ALLOC_TINY_FAST_DUALHOT_1_DESIGN.md: ALLOC DUALHOT investigation - docs/analysis/FREE_TINY_FAST_DUALHOT_1_DESIGN.md: FREE DUALHOT final specs - docs/analysis/FREE_TINY_FAST_HOTCOLD_OPT_1_DESIGN.md: Hot/Cold split research - docs/analysis/POOL_MID_INUSE_DEFERRED_DN_BATCH_DESIGN.md: Deferred batching design - docs/analysis/POOL_MID_INUSE_DEFERRED_REGRESSION_ANALYSIS.md: Stats overhead findings - docs/analysis/MID_DESC_CACHE_BENCHMARK_2025-12-12.md: Cache measurement results - docs/analysis/LAST_MATCH_CACHE_IMPLEMENTATION.md: TLS cache investigation Research boxes (SS page table): - core/box/ss_pt_env_box.h: HAKMEM_SS_LOOKUP_KIND gate - core/box/ss_pt_types_box.h: 2-level page table structures - core/box/ss_pt_lookup_box.h: ss_pt_lookup() implementation - core/box/ss_pt_register_box.h: Page table registration - core/box/ss_pt_impl.c: Global definitions Updates: - docs/specs/ENV_VARS_COMPLETE.md: HOTCOLD, DEFERRED, SS_LOOKUP env vars - core/box/hak_free_api.inc.h: FREE-DISPATCH-SSOT integration - core/box/pool_mid_inuse_deferred_box.h: Deferred API updates - core/box/pool_mid_inuse_deferred_stats_box.h: Stats collection - core/hakmem_super_registry: SS page table integration Current Status: - FREE-TINY-FAST-DUALHOT-1: +13% improvement, ready for adoption - ALLOC-TINY-FAST-DUALHOT-1: -2% regression, frozen as research box - Next: Optimization roadmap per ROI (mimalloc gap 2.5x) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
4.6 KiB
4.6 KiB
Phase FREE-TINY-FAST-HOTCOLD-OPT-1 設計(mimalloc 追いかけ:free hot を薄くする)
背景(なぜ今これ?)
- 直近 perf(Mixed)で
hak_super_lookupは 0.49% self → SS map 系は ROI が低い。 - 一方で
free(wrapper +free_tiny_fast)が ~30% self と最大ボトルネック。 - 現状の
free_tiny_fastは「多機能を 1 関数に内包」しており、ルート分岐・route snapshot・Larson fix・TinyHeap/v6/v7 などの枝が同居している。
結論: I-cache/分岐/不要な前処理が、mimalloc との差として残っている可能性が高い。
(PT や deferred など“正しい研究箱”は freeze で OK。今はホットの削りが勝ち筋。)
目的
free_tiny_fast() を「ホット最小 + コールド分離」に分割し、
- Mixed(標準): free の self% を下げる(まずは 1–3pp を目標)
- C6-heavy: 既存性能を壊さない(±2% 以内)
を狙う。
方針(Box Theory)
- 箱にする:
free_tiny_fastの中で “ホット箱/コールド箱” を分ける。 - 境界 1 箇所: wrapper 側は変更最小(引き続き
free_tiny_fast(ptr)だけ呼ぶ)。 - 戻せる: ENV で A/B(default OFF→実測→昇格)。
- 見える化(最小): カウンタは TLS のみ(global atomic 禁止)、dump は exit 1回。
- Fail-Fast: 不正 header/不正 class は即
return 0(従来通り通常 free 経路へ)。
変更対象(現状)
core/box/hak_wrappers.inc.hからfree_tiny_fast(ptr)が呼ばれている。core/front/malloc_tiny_fast.hのfree_tiny_fast()が巨大で、多数のルートを抱えている。
提案アーキテクチャ
L0: HotBox(always_inline)
free_tiny_fast_hot(ptr, header, class_idx, base) を新設(static inline)。
責務: “ほぼ常に必要な処理だけ” を行い、できるだけ早く return 1 で終わる。
ホットで残す候補:
ptrの basic guard(NULL / page boundary)- 1-byte header magic check +
class_idx取得 base計算- 最頻ルートの早期 return
- 例:
class_idx==7 && tiny_c7_ultra_enabled_env()→tiny_c7_ultra_free(ptr)→ return - 例: policy が
LEGACYのとき 即 legacy free(コールドへ落とさない)
- 例:
L1: ColdBox(noinline,cold)
free_tiny_fast_cold(ptr, class_idx, base, route_kind, ...) を新設。
責務: 以下の “頻度が低い/大きい” 処理だけを担当する。
- TinyHeap/free-front v3 snapshot 依存の経路
- Larson fix の cross-thread 判定 + remote push
- v6/v7 等の研究箱ルート
- 付随する debug/trace(ビルドフラグ/ENV でのみ)
コールド化の意義:
freeの I-cache 汚染を減らす(mimalloc の “tiny hot + slow fallback” に寄せる)- 分岐予測の安定化(ホット側の switch を細くする)
ENV / 観測(最小)
ENV(案)
HAKMEM_FREE_TINY_FAST_HOTCOLD=0/1(default 0)- 0: 現状の
free_tiny_fast(比較用) - 1: Hot/Cold 分割版
- 0: 現状の
Stats(案、TLS のみ)
HAKMEM_FREE_TINY_FAST_HOTCOLD_STATS=0/1(default 0)hot_enterhot_c7_ultrahot_ultra_tls_pushhot_mid_v35hot_legacy_directcold_calledret0_not_tiny_magicなど(戻り 0 の理由別)
注意:
- global atomic は禁止(過去に stats atomic が 9〜10% 外乱になったため)。
- dump は
atexitor pthread_key destructor で 1 回だけ。
実装順序(小パッチ)
- ENV gate 箱:
*_env_box.h(default OFF、キャッシュ化) - Stats 箱: TLS カウンタ + dump(default OFF)
- Hot/Cold 分割:
free_tiny_fast()内で- header/class/base を取る
- “ホットで完結できるか” 判定
- それ以外だけ
cold()に委譲
- 健康診断ラン:
scripts/verify_health_profiles.shを OFF/ON で実行 - A/B:
- Mixed:
HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE(中央値 + 分散) - C6-heavy:
HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1
- Mixed:
- perf:
freeself% とbranch-missesの差を確認(目標: free self% 減)
判定ゲート(freeze/graduate)
- Gate 1(安全): health profile PASS(OFF/ON)
- Gate 2(性能):
- Mixed: -2% 以内(理想は +0〜+数%)
- C6-heavy: ±2% 以内
- Gate 3(観測): stats ON 時に “cold_called が低い/理由が妥当” を確認
満たせなければ 研究箱として freeze(default OFF)。
freeze は失敗ではなく、Box Theory の成果として保持する。