2.9 KiB
2.9 KiB
Phase 25.2 — Numeric Microbench & EXE Tuning
Status: proposal(Phase 25 / 25.1 の後続フェーズ)
ゴール
- Phase 25 で整備した numeric core / AotPrep /
NYASH_AOT_NUMERIC_COREの仕組みを前提に、matmul_coreを含む numeric 系 microbench(LLVM/EXE)を安定して実行できる状態にする。- EXE/LLVM ラインでの性能を観測しやすくし、「VM 側の自己ホスト部分の重さ」と「生成された EXE の速さ」を分離して評価できるようにする。
- Phase 25.1 の Stage0/Stage1 設計に沿って、将来的に Stage1(EXE) から microbench を叩く土台を作る。
スコープ(Phase 25.2)
1) matmul_core microbench EXE ラインの安定化
- 対象:
tools/perf/microbench.sh --case matmul_core --backend llvm --exe ...
- 目標:
NYASH_AOT_NUMERIC_CORE=1ON の状態で、matmul_coremicrobench が LLVM/EXE 経路で安定して実行できること。- STRICT(
NYASH_AOT_NUMERIC_CORE_STRICT=1)は AotPrep 後の MIR(JSON) に対してのみ適用し、pre-AotPrep の MIR emit/VM 起動を阻害しないこと。
- タスク(例):
- provider 経路(
env.mirbuilder.emit)の安定化と診断強化(VM ハングや長時間化の原因切り分け)。 NYASH_LLVM_DUMP_MIR_INを使った実際のmatmul_coreMIR 形状の観察と numeric_core パスの適用確認。
- provider 経路(
2) コンパイル経路とベンチ経路の分離
- 問題意識:
- 現状 microbench は「`.hako → Program(JSON) → MIR(JSON) → AotPrep → ny-llvmc → EXE → 実行」を 1 コマンドで行うため、selfhost VM 部分の重さと EXE 実行の重さが混ざりやすい。
- 方針:
matmul_core用に:- 一度だけ MIR(JSON) を生成し、その JSON を複数回再利用するモードを用意する(例:
tools/dev_numeric_core_prep.sh+ny-llvmc直呼び)。 - microbench は「既に生成済みの EXE を何度も実行する」モードと、「.hako からフルコンパイルする」モードを分ける。
- 一度だけ MIR(JSON) を生成し、その JSON を複数回再利用するモードを用意する(例:
3) numeric_core STRICT モードの本番運用ルール
- Phase 25 では:
- STRICT は AotPrep 後の MIR(JSON) に対してのみチェックするように整理済み。
- pre-AotPrep 生 MIR へのチェックは Rust 側から削除済み。
- Phase 25.2 での追加整理:
- microbench / CI で
NYASH_AOT_NUMERIC_CORE_STRICT=1を使う場合のガイドラインを docs に追記。 - STRICT 違反時の代表的な原因(numeric_core がマッチできないパターン)を例示し、デバッグ手順を
DEBUG_NUMERIC_CORE.mdに統合。
- microbench / CI で
スコープ外
- Stage0/Stage1 の設計・導線整理自体は Phase 25.1 の責務(本フェーズでは利用側の調整に留める)。
- 新しい numeric ABI の機能追加や IntArrayCore/MatI64 の API 拡張(根幹設計は Phase 25 側で担当)。