Files
hakmem/docs/analysis/FREE_TINY_FAST_HOTCOLD_OPT_1_DESIGN.md

128 lines
4.6 KiB
Markdown
Raw Normal View History

Phase ALLOC-TINY-FAST-DUALHOT-1 & Optimization Roadmap Update 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>
2025-12-13 05:35:46 +09:00
# Phase FREE-TINY-FAST-HOTCOLD-OPT-1 設計mimalloc 追いかけfree hot を薄くする)
## 背景(なぜ今これ?)
- 直近 perfMixed`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% を下げる**(まずは 13pp を目標)
- C6-heavy: 既存性能を壊さない±2% 以内)
を狙う。
---
## 方針Box Theory
- **箱にする**: `free_tiny_fast` の中で “ホット箱/コールド箱” を分ける。
- **境界 1 箇所**: wrapper 側は変更最小(引き続き `free_tiny_fast(ptr)` だけ呼ぶ)。
- **戻せる**: ENV で A/Bdefault 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: HotBoxalways_inline
`free_tiny_fast_hot(ptr, header, class_idx, base)` を新設static inline
**責務**: “ほぼ常に必要な処理だけ” を行い、できるだけ早く `return 1` で終わる。
ホットで残す候補:
1. `ptr` の basic guardNULL / page boundary
2. 1-byte header magic check + `class_idx` 取得
3. `base` 計算
4. **最頻ルートの早期 return**
- 例: `class_idx==7 && tiny_c7_ultra_enabled_env()``tiny_c7_ultra_free(ptr)` → return
- 例: policy が `LEGACY` のとき **即 legacy free**(コールドへ落とさない)
### L1: ColdBoxnoinline,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 分割版
### Stats案、TLS のみ)
- `HAKMEM_FREE_TINY_FAST_HOTCOLD_STATS=0/1`default 0
- `hot_enter`
- `hot_c7_ultra`
- `hot_ultra_tls_push`
- `hot_mid_v35`
- `hot_legacy_direct`
- `cold_called`
- `ret0_not_tiny_magic` など(戻り 0 の理由別)
注意:
- **global atomic は禁止**(過去に stats atomic が 9〜10% 外乱になったため)。
- dump は `atexit` or pthread_key destructor で **1 回だけ**
---
## 実装順序(小パッチ)
1. **ENV gate 箱**: `*_env_box.h`default OFF、キャッシュ化
2. **Stats 箱**: TLS カウンタ + dumpdefault OFF
3. **Hot/Cold 分割**: `free_tiny_fast()` 内で
- header/class/base を取る
- “ホットで完結できるか” 判定
- それ以外だけ `cold()` に委譲
4. **健康診断ラン**: `scripts/verify_health_profiles.sh` を OFF/ON で実行
5. **A/B**:
- Mixed: `HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE`(中央値 + 分散)
- C6-heavy: `HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1`
6. **perf**: `free` self% と `branch-misses` の差を確認(目標: free self% 減)
---
## 判定ゲートfreeze/graduate
- Gate 1安全: health profile PASSOFF/ON
- Gate 2性能:
- Mixed: -2% 以内(理想は +0〜+数%
- C6-heavy: ±2% 以内
- Gate 3観測: stats ON 時に “cold_called が低い/理由が妥当” を確認
満たせなければ **研究箱として freezedefault OFF**
freeze は失敗ではなく、Box Theory の成果として保持する。