61 lines
4.8 KiB
Markdown
61 lines
4.8 KiB
Markdown
|
|
# C6_HOTBOX_DESIGN
|
|||
|
|
|
|||
|
|
目的: class6 を C7 SAFE と同じ TinyHeap ベースでホット化するための箱を定義する。まずは SAFE(meta きちんと保持)だけを対象とし、ULTRA(meta を大胆に省く)は 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 16–1024B (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 の暫定防御(Phase21–22):
|
|||
|
|
- 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 準拠:
|
|||
|
|
- HotBox(TinyHeap 内部)と Cold Box(Superslab/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 16–1024B で C6 を載せてもマイナスが小さい(±1M 以内)こと。
|
|||
|
|
|
|||
|
|
v1 の結論と凍結方針
|
|||
|
|
--------------------
|
|||
|
|
- v1 では C6 TinyHeap/Hot はどのモードでも C6-heavy/Mixed で明確なマイナス。meta_mode=1 は bench/実験専用とし、通常は mode0 か OFF を推奨。
|
|||
|
|
- C6 の本格的な再設計は TinyHeap v2(C5–C7 をまとめて組み直す箱)で行う。C6 を触るときは bench/実験マスク (0x40/0xC0) とデバッグ ENV を明示的に有効にする。
|