96 lines
7.4 KiB
Markdown
96 lines
7.4 KiB
Markdown
|
|
TinyHeap v2 Design (入口メモ)
|
|||
|
|
============================
|
|||
|
|
|
|||
|
|
現状の v2 (Phase32 時点)
|
|||
|
|
------------------------
|
|||
|
|
- C7 専用で「1 枚 lease + current/freelist を v2 で握る」状態。ページ供給・meta/ss_active/Remote/Stats はすべて v1 TinyHeap/C7 SAFE に委譲。
|
|||
|
|
- A/B でいつでも v1 に戻せる(`HAKMEM_TINY_HOTHEAP_V2` / `HAKMEM_TINY_HOTHEAP_CLASSES`)。性能はまだ v1 と同等を維持するのが目的。
|
|||
|
|
|
|||
|
|
ゴール
|
|||
|
|
-----
|
|||
|
|
- mimalloc の heap→page→block に近い形で C5/C6/C7 を 1 つの TinyHotHeap に統合し、Gate/UC/TLS-SLL をさらに薄くする。
|
|||
|
|
- v1 で得た C7 SAFE の current 固定・delta/Stats Box をクラス共通のポリシーとして一般化し、Tiny 層全体の命令数を半分近く狙う。
|
|||
|
|
- 学習層はこれまで通り「外の箱」(Policy Snapshot)に閉じ込め、ホットパスはポリシー値を読むだけにする。
|
|||
|
|
|
|||
|
|
前提
|
|||
|
|
----
|
|||
|
|
- Cold Stats/Guard/Tier は v1 の Cold Stats Box を土台にし、バッチ/集計を Cold 側で吸収する。
|
|||
|
|
- C6 TinyHeap は v1 では凍結したまま。v2 では C5–C7 を最初から設計し直す前提で扱う。
|
|||
|
|
|
|||
|
|
方針候補(箇条書き)
|
|||
|
|
-------------------
|
|||
|
|
- C5–C7 を 1 つの TinyHotHeap にまとめ、class ごとの current_page ポリシー(C7 SAFE を一般化)を持たせる。
|
|||
|
|
- Gate/Route を「size→class→hotheap/legacy」の 1 LUT + 1 分岐に統一し、C6/C7 の直線フロントをデフォルト化。
|
|||
|
|
- Stats Box を前提に、meta->used / ss_active_* は Hot 側で直接触らず、イベント + バッチ更新に寄せる。
|
|||
|
|
- C6 は v1 で封印したまま、v2 で C7 SAFE 流の current/delta を最初から組み込む。
|
|||
|
|
- 学習/Policy は Snapshot Box 化し、ホットパスはポリシー値読み取りのみ(学習の ON/OFF でホットパスの命令数が変わらないようにする)。
|
|||
|
|
|
|||
|
|
ゴール / 非ゴール(v2 スコープの固定)
|
|||
|
|
-------------------------------------
|
|||
|
|
- ゴール:
|
|||
|
|
- C5–C7 を 1 つの TinyHotHeap(HotHeap v2)に統合し、heap→page→block のみに集中するホット層を構築する。
|
|||
|
|
- C7-only / Mixed で mimalloc に 1.5〜2× 近づける “理論上” の構造(フロントと Cold 更新の命令数を半減させる)。
|
|||
|
|
- Hot 層は current 固定+delta/Stats Box バッチを前提とし、学習層は Snapshot Box に閉じ込めてホットパスから排除する。
|
|||
|
|
- 非ゴール:
|
|||
|
|
- v2 では C0–C4 や巨大サイズ帯は触らない(Tiny 以外は対象外)。
|
|||
|
|
- 学習層のポリシー/ノブの仕様変更は行わない(Snapshot の読み取りだけを継続)。
|
|||
|
|
- v1 の C7 SAFE プロファイルを壊さない(v1/v2 の A/B 共存を前提)。
|
|||
|
|
|
|||
|
|
箱構造(HotHeap v2 の 1 枚図イメージ)
|
|||
|
|
--------------------------------------
|
|||
|
|
- TinyHotHeapBox (per-thread):
|
|||
|
|
- hot.cls[5..7] に current_page / partial / full / stride を持つ。
|
|||
|
|
- API(案):
|
|||
|
|
- hot_alloc(ci) / hot_free(ci, p)
|
|||
|
|
- hot_refill(ci)(cold へ 1 箇所だけ触れる境界)
|
|||
|
|
- ColdSuperslabBox / ColdStatsBox / PolicySnapshotBox / LearningBox(外側の箱):
|
|||
|
|
- Hot からは「イベント/要求」を 1 回だけ投げる。
|
|||
|
|
- ColdStatsBox は delta→バッチ→meta/ss_active_* 反映を担う(v1 Stats Box 互換インタフェースを維持)。
|
|||
|
|
|
|||
|
|
移行戦略と Gate/ENV
|
|||
|
|
------------------
|
|||
|
|
- フラグ:
|
|||
|
|
- HAKMEM_TINY_HOTHEAP_V2=1 で v2 を有効化(デフォルト OFF)。
|
|||
|
|
- HAKMEM_TINY_HOTHEAP_CLASSES でクラスマスク(初期は 0x80=C7 のみ、段階的に 0xE0=C5–C7 へ)。
|
|||
|
|
- A/B 方針:
|
|||
|
|
- v1 TinyHeap(C7 SAFE)と v2 HotHeap を完全に切り替え可能にする。
|
|||
|
|
- Gate/Route は snapshot LUT で「class→route(v1/v2/legacy)」を決定し、1 LUT + 1 分岐の形を維持。
|
|||
|
|
|
|||
|
|
v2 で“変えない”もの
|
|||
|
|
-------------------
|
|||
|
|
- Learning/ACE/ELO: PolicySnapshot の更新だけを学習側が持ち、ホットパスは snapshot 値を読むだけ。
|
|||
|
|
- Cold Stats Box 呼び出しインタフェース: v1 と互換(flush イベントの場所は同じ)。
|
|||
|
|
- Fail-Fast 方針: 範囲外・magic 不一致は即 abort。Superslab/Tier/Guard の不変条件を崩さない。
|
|||
|
|
|
|||
|
|
実装ステップ(3 分割プラン)
|
|||
|
|
---------------------------
|
|||
|
|
1. Step1: v2 用 TinyHotHeapBox 型と API(hot_alloc/free/refill)を追加し、コンパイルパスだけ通す(まだ未使用)。
|
|||
|
|
2. Step2: C7-only を v2 に載せる A/B(HOTHEAP_V2=1 & mask=0x80 で C7 だけ新経路、v1 と並走)。
|
|||
|
|
3. Step3: Mixed のクラス分布を見ながら C6→C5 の順で HotHeap へ移すか判断(マスク 0xC0→0xE0 を段階的に開ける)。
|
|||
|
|
|
|||
|
|
Phase30 (done): 骨組みだけコードに追加
|
|||
|
|
---------------------------------------
|
|||
|
|
- core/box/tiny_hotheap_v2_box.h に v2 用の page/class/ctx 型と stub API(alloc/free/tls)を追加。
|
|||
|
|
- ENV gate だけ先行(HAKMEM_TINY_HOTHEAP_V2、HAKMEM_TINY_HOTHEAP_CLASSES)を用意し、既存経路とは未接続。
|
|||
|
|
- TLS スロットも確保したが、alloc/free は現時点では NULL/no-op。フロント配線は Phase31 以降で A/B 導入予定。
|
|||
|
|
|
|||
|
|
Phase31: C7-only を v2 ラッパ経由で A/B 可能に
|
|||
|
|
----------------------------------------------
|
|||
|
|
- Gate: `tiny_c7_hotheap_v2_enabled()`(`HAKMEM_TINY_HOTHEAP_V2=1` かつ mask bit7)を追加。
|
|||
|
|
- Route snapshot: bit7 が立っていれば `g_tiny_route_class[7]=TINY_ROUTE_HOTHEAP_V2` に設定(デフォルトは Legacy/HEAP のまま)。
|
|||
|
|
- Front: `malloc_tiny_fast` / `free_tiny_fast` の C7 直線パスで v2→v1→legacy slow の順に試行(v2 が NULL のとき v1 にフォールバック)。
|
|||
|
|
- Impl: v2 alloc/free は現時点で v1 の薄ラッパ(実際の挙動は変えない)。TLS ctx で C7 stride を初期化し、簡易カウンタで v2 パスのヒットを把握できるようにした。他クラスは v2 未対応のまま。Superslab/Remote/Stats など Cold 処理はすべて v1 に委譲。
|
|||
|
|
- A/B(Release, HEAP_STATS=ON): C7-only 43.28M(v2 ON/OFF 差なし)、Mixed 16–1024B は LEGACY 42.18M / C7_SAFE v2 OFF 41.15M / v2 ON 40.74M(cls7 fast=5691 / slow=1 で一致、v2 カウンタ増加のみ)。
|
|||
|
|
|
|||
|
|
Phase32: C7 で current_page+freelist を v2 側に持ちつつ、ページ供給は v1 から lease
|
|||
|
|
----------------------------------------------------------------------------
|
|||
|
|
- v1 に `tiny_heap_c7_lease_page_for_v2()` を置き、C7 SAFE が保持しているページ情報(meta/ss/base/capacity)を lease する薄い境界を追加。
|
|||
|
|
- v2 TLS ctx に C7 用の storage_page を持たせ、current_page が空のとき lease した v1 page をラップして保持。Hot 部分の pop/push は v1 の tiny_heap_page_pop/free_local を直接叩き、meta/ss_active の整合は v1 に任せる。
|
|||
|
|
- Free もまず v2 の current_page を優先し、範囲外や meta 不一致は従来の C7 free にフォールバック。Superslab/Remote/Stats など Cold 処理は依然 v1 に委譲(lease を返却しない簡易版)。
|
|||
|
|
- まだ性能は見ず、v2 の Hot 部分が自前で current_page を握れることだけ確認する段階。
|
|||
|
|
|
|||
|
|
Phase33 以降の選択肢
|
|||
|
|
--------------------
|
|||
|
|
- A) v2 で current_page+freelist の多ページ対応・ページ返却まで拡張し、Superslab への触れ方を v2 専用に寄せる(v1 はページ供給だけの Box にする)。
|
|||
|
|
- B) 当面 v2 は C7 限定のラッパ+単一ページ管理のまま据え置き、mid サイズや他クラスの箱に時間を回す。
|