Files
hakmem/docs/analysis/TINY_NEXT_STEPS.md
2025-12-09 21:50:15 +09:00

7.3 KiB
Raw Blame History

Tiny Next Steps (Phase 19 メモ)

事実スナップショット

  • 標準プロファイル (v1 締め)
    • LEGACY … TinyHeap 全無効。
    • C7_SAFE … class mask=0x80, meta_mode=1 に加え HAKMEM_TINY_STATS_BOX=1 HAKMEM_TINY_STATS_BATCH=0 をセット。C6 は OFF。
    • Bench/実験 … C7_ULTRA_BENCH、C6 TinyHeap マスク (0x40/0xC0)、HAKMEM_TINY_STATS_BATCH=1 は bench 専用。
  • プロファイルと性能
    • C7_SAFE: C7-only 20k/ws64 ≈46.6M ops/s、Mixed 161024B は LEGACY と ±1M 以内軽いマイナス〜誤差。C7-heavy 向けの本番寄りプロファイル。
    • C7_ULTRA_BENCH: C7-only 20k/ws64 ≈52M ops/sbench 専用、Superslab/Tier 整合は緩む)。
    • C6 TinyHeap: C6-heavy (min=257/max=768) LEGACY≈44.3M → TinyHeap≈38.6M。Mixed 161024B でも ≈38.5M〜39.5M と明確なマイナス。slow_prepare は ≒1 でも遅く、経路オーバーヘッドが支配的。
    • Cold Stats Box: STATS_BOX=1 は C7 SAFE で同等〜わずかプラス、BATCH=1 は C7-only/Mixed とも大幅マイナスbench 専用扱い)。
  • クラス分布の目安HEAP_STATS, ws=256/iters=20k
    • Mixed 161024B + C7 SAFE: cls7 fast≈5691 / slow≈1。C6 を載せた場合でも cls6 fast≈2744 / slow≈1 と slow_prepare は低い。
    • C6-heavy: cls6 fast≈5372 / slow≈1。slow_prepare が少なくても throughput は低下。
  • 結論(現状)
    • C7 SAFE は C7-only で明確なプラス、Mixed でも許容レンジ → 推奨プロファイル候補。
    • C6 TinyHeap は現状ベンチ/実験専用。デフォルトでは OFFmask=0x80 のまま)。

次の箱候補2 本に絞る)

  1. C6 TinyHeap を C7 SAFE 流に攻める箱

    • やること: current 固定・slow_prepare 抑制、meta-light/delta/閾値 flush の安全版を C6 に移植。Superslab/Tier の整合を Fail-Fast で確認しながら命令を削る。
    • リスク: 実装が複雑化するため delta debug/assert を増やす必要あり。効果が出なければ C6 TinyHeap は Bench 専用のまま。
  2. Tiny front をさらに薄くする箱

    • 方向: Route Snapshot の上に C6/C7 用の直線 frontC7 HotPipeline 相当を広げ、Gate/UC/TLS SLL 経路の命令数を削る。
    • 位置づけ: C6 TinyHeap 攻めとほぼ同じ課題の裏表。C6 current 固定+軽量 meta と合わせて検討。
  3. Cold Tiny Stats Box を詰める箱

    • 役割: C7 SAFE で始めた page 内 delta/flush を「Cold Stats Box」に委譲し、meta->used / ss_active_* の更新をホットパスから切り離す。
    • 進捗: STATS_BOX を導入済み。BATCH=0 は性能同等、BATCH=1 は C7-only/Mixed とも大きく劣化bench 専用)。HAKMEM_TINY_STATS_BATCH は当面 OFF 推奨。
    • 次の一手: BATCH=0 を前提に C5/C6 など他クラスへの適用可否を検討するか、別の箱front/UC など)を優先するかを再評価。

当面の運用ルール

  • デフォルト: PROFILE=LEGACY か PROFILE=C7_SAFE を手動選択。C7_SAFE 時は HAKMEM_TINY_STATS_BOX=1 HAKMEM_TINY_STATS_BATCH=0 をセット。C6 TinyHeap は明示しない限り OFF。
  • mimalloc 比較フラグ:
  • C7-only → HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_STATS_BOX=1 HAKMEM_TINY_STATS_BATCH=0 HAKMEM_TINY_LARSON_FIX=1ULTRA は研究用)。
  • Mixed 161024B → HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_LARSON_FIX=1 で PROFILE=LEGACY と PROFILE=C7_SAFE を並べて比較C6 は載せない)。
  • C6 を触るときは必ず HEAP_CLASSES で class6 を明示し、HAKMEM_TINY_HEAP_STATS[_DUMP]=1 で fast/slow を一緒に記録する。C6 は bench 専用のまま。
  • HotHeap v2 (C7 専用) の扱い:
    • 現状は C7-only でも v1 より遅く、Mixed では大きく回帰。標準は HAKMEM_TINY_HOTHEAP_V2=0v1 C7_SAFE を使用)。
    • 研究/実験で使う場合のみ HAKMEM_TINY_HOTHEAP_V2=1 HAKMEM_TINY_HOTHEAP_CLASSES=0x80 を明示し、HAKMEM_TINY_HOTHEAP_V2_STATS=1 で fallback/fast 比率を観測する。結果が悪くてもよいベンチ専用モードとする。

Phase68更新版: 次に攻める大きな箱候補

  • C7 HotHeap v2:
    • C7-only / Mixed 長尺プロファイルでは v1 同等以上まで来ており、bench/pro 用には十分な状態。
    • ただしデフォルトは引き続き v2 OFFC7 SAFE v1 本線。今後は「C7-heavy なワークロード向けオプション」として扱う。
  • C6/C5 TinyHeap v2:
    • C6 v2 は route 修正後も C6-heavy/Mixed で明確にマイナス。構造は通電したが perf 未達のため、当面は研究箱として据え置く。
    • C5 への拡張も v2 の再設計フェーズTinyHeap v3 相当)でまとめて考えるのが良さそう。
  • mid/smallmid / pool 側:
    • Mixed 161024B / mid-large ベンチの perf 分析では、pool allocatorhak_pool_try_alloc/freeや smallmid パスが依然として大きな self% を占めている。
    • Phase68 以降の本命: pool/smallmid の Hot Box 化・front 整理。新設 docs/analysis/POOL_V2_BOX_DESIGN.mddocs/design/POOL_HOTBOX_V2_IMPLEMENTATION_GUIDE.md に箱と境界を記載。
    • Tiny v2 は C7-only ベースで一旦凍結し、mid/pool を先に +5〜10% 押し上げるのが mimalloc 7〜8割に近づく近道と考える。***

補足: C7 v3 と Mixed front

  • C7 v3: C7-only / Mixed で v3 ON が +αslow=1、fallback=0、refill はウォームアップ由来)を確認。デフォルトは OFF のまま、C7-heavy bench で opt-in。
  • Mixed 161024B で v3 ON の userland perf は、リリースビルドでは free/malloc に潰れて非C7 Tiny front が見えない。DEBUG/記号付きビルドで再 perf を取り、size→class→route 前段や header 書き込みのフラット化を次ターゲット候補として再評価する。

Phase69: SmallObjectHotBox v3 構想Tiny + mid/smallmid 統合)

  • 背景:
    • Tiny (161024B) と mid/smallmid の両方で mimalloc に 0.4〜0.5× 程度の差が残っており、Tiny v2 / pool v2 での局所最適では 7〜8割に届きにくいことが見えてきた。
    • TinyHotHeap v2 (C7-only) は C7-heavy/Mixed 長尺で v1 SAFE を上回るところまで到達した一方、C6/C5 や pool v2 は研究箱のまま凍結となった。
  • 方針:
    • Tiny (C0〜C7) と mid/smallmid の一部を統合して扱う SmallObjectHotBox v3 を新設し、「SmallObject 全体を 1 枚の Hot Box」として設計し直す。
    • Superslab/Segment/Tier/Guard/Remote は Cold Box として据え置き、Hot 側は SmallObjectHotBox v3 に集約する。
    • 設計は docs/analysis/SMALLOBJECT_HOTBOX_V3_DESIGN.md にまとめ、実装タスクは docs/design/SMALLOBJECT_HOTBOX_V3_IMPLEMENTATION_GUIDE.md に段階的に記載。
  • 位置づけ:
    • Tiny v2 / pool v2 で得た知見page_of O(1)、current/partial/retire ポリシー、Cold IF の 2 箇所化を統合しつつ、v3 では「Tiny + mid/smallmid の一体化」を目指す。
    • 実装は bench/研究プロファイルから段階的に進め、v1/v2 への戻り道を常に維持する。***