Files
hakmem/docs/analysis/C6_HOTBOX_DESIGN.md

61 lines
4.8 KiB
Markdown
Raw Normal View History

# 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 を明示的に有効にする。