Files
hakmem/docs/analysis/C6_HOTBOX_DESIGN.md
Moe Charm (CI) 8f18963ad5 Phase 36-37: TinyHotHeap v2 HotBox redesign and C7 current_page policy fixes
- Redefine TinyHotHeap v2 as per-thread Hot Box with clear boundaries
- Add comprehensive OS statistics tracking for SS allocations
- Implement route-based free handling for TinyHeap v2
- Add C6/C7 debugging and statistics improvements
- Update documentation with implementation guidelines and analysis
- Add new box headers for stats, routing, and front-end management
2025-12-08 21:30:21 +09:00

61 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# C6_HOTBOX_DESIGN
目的: class6 を C7 SAFE と同じ TinyHeap ベースでホット化するための箱を定義する。まずは SAFEmeta きちんと保持だけを対象とし、ULTRAmeta を大胆に省く)は C6 ではやらない。
## 境界(箱の責務)
- **内側 (C6 HotBox)**: TinyHeapBox 上での heap → page → block 管理、current_page ポリシー。
- **外側 (Cold Box)**: Superslab / Tier / Guard / Stats。TLS SLL とは原則切断TinyHeap クラスには SLL を使わせない)。
## ENV / A/B 切替
- `HAKMEM_TINY_HEAP_BOX` … TinyHeap front 全体の ON/OFF。
- `HAKMEM_TINY_HEAP_CLASSES` … クラスごとの TinyHeap マスク。デフォルトは `0x80` (C7 のみ)。
- `HAKMEM_TINY_C6_HOT` … C6 Hot front を有効化するスイッチ1 で C6 専用直線パスを許可)。
- `HAKMEM_TINY_C6_META_MODE` … 0=OFF, 1=SAFE当面は SAFE のみ。ULTRA はやらない)。
- **注意**: meta_mode=1 は現時点では bench/実験専用。長めの C6-heavy でクラッシュする既知事象があり、通常運用は
meta_mode=0 または C6 TinyHeap OFF を推奨する。
- デバッグ用meta_mode=1 時の Fail-Fast/可視化):
- `HAKMEM_TINY_C6_DEBUG_POP=1` … pop まわりの Fail-Fast を有効化。
- `HAKMEM_TINY_C6_DELTA_TRACE=1` … delta を触った箇所を last_delta_site に記録。
- `HAKMEM_TINY_C6_DELTA_DEBUG=1` … destructor で delta サマリを dump。
- `HAKMEM_TINY_C6_DELTA_TRACE=1` が有効なときは delta サイト (ALLOC/FREE/ATTACH/EMPTY/THRESHOLD) をページに刻み、
`HAKMEM_TINY_C6_DEBUG_POP=1` では pop/free の Fail-Fast範囲外 freelist/ss mismatch/cap0 等)と 512 行までの debug log を出す。
## 現状の事実2025-12 時点)
- C6 TinyHeap`HAKMEM_TINY_HEAP_CLASSES=0x40`)は C6-heavy / Mixed どちらも回帰気味(最新測定 2025-12-05
- C6-heavy (min=257/max=768, ws=256, iters=20k, debug OFF)
- LEGACY: **41.74M ops/s**HEAP_STATS 0
- TinyHeap mode0 (`C6_META_MODE=0`): **36.07M ops/s**cls6 fast=5381 / slow_prepare=1
- TinyHeap mode1 (`C6_META_MODE=1` SAFE): **28.86M ops/s**cls6 fast=2692 / slow_prepare=2690
- Mixed 161024B (ws=256, iters=20k)
- LEGACY: **40.90M ops/s**
- C7_SAFE (C6 OFF): **40.96M ops/s**cls7 fast=5691 / slow=1
- C6+C7 SAFE (`HEAP_CLASSES=0xC0`、両方 meta_mode=1): **27.21M ops/s**cls6 fast=1388 / slow=1366、cls7 fast=5664 / slow=19
- mode0 は slow_prepare≈1 でも約 -14%C6-heavyと大きくマイナス、mode1 は slow_prepare が増えてさらに悪化。現状は bench/実験専用マスク0x40/0xC0とし、通常は LEGACY か C7_SAFE のみを推奨。
- slow_prepare が小さいまま回帰するため、原因は Front/Hot の命令コストや meta 更新コストdelta/flush 実装の重さにあると推定。mode1 は delta/flush を触ることで slow_prepare も増えやすい点に注意。
- meta_mode=1 の暫定防御Phase2122:
- attach で meta->freelist を範囲チェックし、OOB は NULL に潰す。
- empty→release で meta->freelist を NULL にし、debug 時は page->free_list に poison。
- pop で freelist OOB / ss mismatch / cap0 などを Fail-Fast。
- 上記後、C6-heavy iters=1000/1500/2000/20000 で再現していた SIGSEGV は出なくなり、delta サマリは 0/0/0ただし bench 専用扱いは継続)。
## 要件と設計方針
- 当面は **SAFE のみ**meta/active を delta + flush で正確寄りに保つ。ULTRA は C6 では導入しない。
- A/B できるように:
- C6 Hot front: `HAKMEM_TINY_C6_HOT=1` で直線パスを有効化。
- C6 TinyHeap ON/OFF: `HAKMEM_TINY_HEAP_CLASSES` のビットで切替(デフォルトは OFF
- Box Theory 準拠:
- HotBoxTinyHeap 内部)と Cold BoxSuperslab/Tier/Guard/Statsの境界は 1 箇所。
- TLS SLL は C6 HotBox からは触らない。
## 今後のフォーカス
- C7 SAFE で効いた current_page 固定+ delta/閾値 flush を C6 に横展開するかを検討。
- Front/Hot の命令数を減らすため、C6 専用の直線フロントGate → Heap 一本化)を C7 と対称に整える。
- 成果の指標:
- C6-heavy で LEGACY と同等以上を目指す。
- Mixed 161024B で C6 を載せてもマイナスが小さい±1M 以内)こと。
v1 の結論と凍結方針
--------------------
- v1 では C6 TinyHeap/Hot はどのモードでも C6-heavy/Mixed で明確なマイナス。meta_mode=1 は bench/実験専用とし、通常は mode0 か OFF を推奨。
- C6 の本格的な再設計は TinyHeap v2C5C7 をまとめて組み直す箱で行う。C6 を触るときは bench/実験マスク (0x40/0xC0) とデバッグ ENV を明示的に有効にする。