Files
hakmem/docs/analysis/TINY_C7_ULTRA_DESIGN.md

113 lines
6.3 KiB
Markdown
Raw Normal View History

# TINY_C7_ULTRA_DESIGN
## 目的
- C7 (1024B) 向け mimalloc 型超高速パスULTRAを用意し、Mixed 161024B を mimalloc の 5 割近辺まで寄せる。
- 学習層や stats の仕組みは残しつつ、C7 同一スレッドのホットパスからは極力それらを排除する。
## 箱構造
- Hot: TinyC7UltraBoxTLS freelist + C7 専用セグメントを握る同一スレッド専用箱)
- Cold: C7UltraSegmentBoxC7 専用セグメント管理。現段階では設計のみで未実装)
- 既存 Cold: Superslab / WarmPool / Guard / Remote / Stats は既存の箱のまま。ULTRA は原則触らない。
## 決定事項(芯)
1. C7 専用ページ源
- ULTRA は「C7 専用セグメント」からページを取る(将来は mmap で 2〜4MiB 単位)。
- v3/v4/Tiny v1 が握る C7 ページとは混ざらない前提。
- UF-1 時点では C7UltraSegmentBox は未実装で、C7 ページ供給は既存 v3 経由の stub とする。
2. free 時の ptr→page
- ULTRA が扱う C7 ページは C7 専用セグメント上にのみ存在すると決める。
- 将来像:
- seg = p & ~(SEG_SIZE-1) で segment 基底。
- seg が ULTRA 管理表にあれば offset / page_idx / page_meta から class=7 を取得し、ヘッダなしで freelist push。
- 管理表に無ければ既存 v3/v4 freeヘッダありにフォールバック。
3. ULTRA と v3/v4 の責務分離
- ULTRA ON: C7 アロケーションはすべて ULTRA 管理v3/v4 は C7 ページを新規に取らない)。
- ULTRA OFF: C7 は v3現行本命か v4 が処理する。
- free: 「まず ULTRA セグメントか」を判定し、ULTRA 管理外なら常に v3/v4 free へ落とすオーバーレイ構造。
- Remote/cross-thread free は ULTRA 非対応。ULTRA は同一スレッド C7 専用 TLS box として設計。
4. Fail-Fast ポリシー
- ULTRA が扱わないポインタは必ず v3/v4 側でヘッダ検証・範囲チェックを行う。
- ULTRA 内部不整合(将来フェーズ)は statsワンショットログで可視化し、可能なら v3/v4 へフォールバック。
## セグメント前提UF-3 仕様)
- SEG_SIZE: 2MiB (pow2)。seg_base = ptr & ~(SEG_SIZE-1) で判定可能にする。
- セグメント構造(イメージ):
- base, seg_size (=2MiB), page_size (=TINY_PAGE_SIZE 想定), num_pages (=seg_size/page_size)
- page_meta[num_pages]freelist/used/capacity だけを持つ軽量構造)
- free 時の判定:
- seg = p & ~(SEG_SIZE-1) で ULTRA 管理セグメントか確認。
- 管理外 → v3 freeヘッダ付き経路へフォールバック。
- 管理内 → page_idx = (p - seg_base) >> PAGE_SHIFT で page_meta を取得し、ヘッダ無しで freelist push。
- Remote/cross-thread free は UF-3 でも非対応(同一スレッド C7 専用のまま)。
## UF-4: C7 ULTRA header light研究箱
- 目的: C7 ULTRA の alloc/free から tiny_region_id_write_header の毎回実行を外し、carve 時だけに寄せる。
- 手段: freelist の next をヘッダ直後に格納してヘッダを保持し、ENV `HAKMEM_TINY_C7_ULTRA_HEADER_LIGHT` (default 0) ON のときだけ carve 時に一括書き込み。alloc はヘッダ済みならスキップ。
- Fail-Fast: ULTRA 管理外 ptr は従来どおり v3 free 経路へ落とす。
## フェーズ
- UF-1: 箱・ENV・front フックだけ stub で入れる(中身は v3 C7 経由、挙動変化なし)。
- UF-2: ULTRA TLS freelist を実装C7 ページ 1 枚を TLS で握る。同一スレッドのみ。C7 ページ供給は当面 v3/v4 経由。
- UF-3: C7UltraSegmentBox を実装し、ptr→segment mask でヘッダレス free に寄せる(セグメント 1 枚のみでも可)。
- UF-4: C7 ULTRA header light を研究箱として追加し、ON/OFF A/BMixed / C7-only 両方)で評価する。
Phase PERF-ULTRA-REBASE-1 計測完了 + PERF-ULTRA-ALLOC-OPT-1 計画策定 ## Phase PERF-ULTRA-REBASE-1 実施 - C4-C7 ULTRA 全て ON 状態での CPU ホットパス計測 - Mixed 16-1024B, 10M cycles での perf 分析 - **発見**: C7 ULTRA alloc が新しい最大ボトルネック(7.66% self%) ## ホットパス分析結果 | 順位 | 関数 | self% | |------|------|-------| | #1 | C7 ULTRA alloc | **7.66%** ← 最大ボトルネック | | #2 | C4-C7 ULTRA free群 | 5.41% | | #3 | gate/front前段 | 2.51% ← 既に十分薄い | | #4 | header | < 0.17% ← ULTRA で削減済み | ## 戦略転換(重要) これまで: 新しい箱や世代(v4/v5/v6)を追加 → 今後: 既に当たりが出ている ULTRA 内部を細かく削る 理由: - v6/v5 拡張は -12〜33% の大幅回帰 - gate/front や header はもう改善の余地が少ない - C7 ULTRA alloc の 7.66% → 5-6% 削減で全体効果 2-3% ## Phase PERF-ULTRA-ALLOC-OPT-1 計画策定 - ターゲット: tiny_c7_ultra_alloc() の hot path を直線化 - 施策: 1. TLS ヒットパスの直線化(env check/snapshot 削除) 2. TLS freelist レイアウト最適化(L1 キャッシュ親和性) 3. segment/page_meta アクセスの確認(slow path 確認) - 計測: C7-only + Mixed での A/B テスト - 期待: 7.66% → 5-6%、全体で +2-3M ops/s ## ドキュメント更新 - CURRENT_TASK.md: PERF-ULTRA-REBASE-1 結果と ALLOC-OPT-1 計画を追記 - TINY_C7_ULTRA_DESIGN.md: Phase PERF-ULTRA-ALLOC-OPT-1 セクション追加 - NEW: docs/analysis/PERF_ULTRA_ALLOC_OPT_1_PLAN.md - 詳細な実装計画書 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-11 20:05:09 +09:00
---
## Phase PERF-ULTRA-ALLOC-OPT-1: C7 ULTRA alloc 内部最適化(実装予定)
### 背景Phase PERF-ULTRA-REBASE-1 の発見)
2025-12-11 の perf 計測C4-C7 ULTRA 全て ONで以下が判明
**ホットパス分析結果** (allocator 内部, self%):
- **C7 ULTRA alloc: 7.66%** ← **新しい最大ボトルネック**
- C4-C7 ULTRA free群: 5.41%
- gate/front前段: 2.51% ← **既に十分薄い**
- header: < 0.17% **ULTRA 経路での削減効果が出ている**
### 結論
**v6/v5/v4 のような新世代追加ではなく、既に当たりが出ている ULTRA 内部を薄くする方針に転換**。
- v6/v5 の C5/C4 拡張は -12〜33% の大幅回帰を招いた
- header や gate/front は既に改善済み(許容範囲)
- **C7 ULTRA alloc の 7.66% を 5-6% に削れば、全体で 2-3% の効果が期待できる**
### 実装施策
**ターゲット**: `tiny_c7_ultra_alloc()` の hot path を直線化
1. **TLS ヒットパスの直線化**
- env check が残っていないか確認lazy init 後は ENV 参照すべきではない)
- snapshot 取得が hot path に含まれていないか確認
- fast path を完全に直線化(分岐最小化)
2. **TLS freelist レイアウト最適化**
- freelist[], count などのホットデータが 1 cache line に収まるか確認
- alloc ホットデータfreelist[], countの配置を L1 キャッシュ友好的に再配置
3. **segment / page_meta アクセスの確認**
- segment learning / page_meta access が本当に slow pathキャッシュミス時だけか確認
- hot path に余分なメモリアクセスが混入していないか確認
### 計測戦略
**A/B テスト**:
- C7-only1024B固定と Mixed16-1024Bの両方で計測
- enabler: HAKMEM_TINY_C7_ULTRA_FREE_ENABLED=1
**perf 計測**:
- 最適化前後で `perf report --stdio` により self% が 7.66% → 5-6% まで落ちるか確認
- throughput 改善量ops/sを測定
### 期待値
- **alloc パス**: 5-10% の削減self% 2% 削減で全体効果 2-3%
- **全体 Mixed throughput**: +2-3M ops/s31.6M ops/s → 33-35M ops/s 想定)
### 次ステップ
1. 実装完了後、perf 再計測で効果を検証
2. self% が 5-6% に達したら次フェーズC4-C7 ULTRA free群 5.41% の軽量化)へ
3. それ以上の改善は narrow pointpage_of/segment 判定, so_alloc系の検討が必要