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

78 lines
7.3 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.

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=1`ULTRA は研究用)。
- 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=0`v1 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.md``docs/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 への戻り道を常に維持する。***