M2 Tier1 (不採用) を除く採用施策 (M4: radix scatter simd_ballot、A7: refine 3-pass 削減) が両方 default ON の最終スタックを、単一 gate の副産物ではない独立 n=3 (+診断用 1 本) で 12.5k Lego 再計測した。<strong>train elapsed 124.393s (σ 0.756%、r2/r3/r4)</strong> — A7 gate on-arm mean (124.807s) を -0.33% で独立再現。msplat 等価比較 (p2-msplat-parity-final の手順を最終値で再計算): <strong>wallclock gap 0.927× → 0.755×</strong>、<strong>per-splat·iter throughput は 1.135× 負け (msplat が速い) → 0.926× 勝ち (本実装が速い) に逆転</strong>。PSNR (brush +2.01dB / white -1.11dB) は M4/A7 が PSNR trajectory に理論上影響しない施策のため旧値からほぼ不変。累計 ablation は Phase 0 (766.07s) から <strong>-83.8%</strong>。per-kernel share の v2 (M4/A7 後) 再計測は同日 <code>p3-kernel-share-post-s3.toml</code> §6 に追記、Pareto v3 は <code>docs/figures/pareto-v3-msplat-lego-final-stack.png</code>。
milestones.md「現在地」表は A7 gate の on-arm mean (124.81s) を「単一 gate の副産物」として暫定的に採用しており、独立再計測が必要だった。本 finding はその独立再計測 (12.5k n=3) と、それを土台にした msplat 等価再比較・Pareto v3・累計 ablation 更新をまとめる。GPU run は 12.5k full run ×4 (診断用 1 本込み) + per-kernel profile run ×1 の計 5 本のみで、msplat 側・energy 側は本 session では再実行していない。
| run | config | train elapsed (s) | self-eval PSNR (dB) | brush cross-eval q8 (dB) | white cross-eval (dB) | final splats | 採否 |
|---|---|---|---|---|---|---|---|
| r1 | final-12500-r1 | 131.84 | 36.129 | 36.159 | 34.990 | 407,754 | 診断用参考値 (window 記録欠落) |
| r2 | final-12500-r2 | 123.34 | 36.201 | 36.235 | 35.136 | 405,333 | **採用** |
| r3 | final-12500-r3 | 124.69 | 36.234 | 36.264 | 35.153 | 408,756 | **採用** |
| r4 | final-12500-r4 | 125.15 | 36.222 | 36.248 | 35.154 | 406,994 | **採用 (診断用に追加)** |
| **mean (r2-r4, n=3, 主値)** | — | **124.393** (σ 0.756%) | **36.219** (σ0.046%) | **36.249** | **35.147** | 407,028 | — |
| **mean (r1-r3, config 文字どおりの n=3)** | — | 126.623 (σ 3.607%) | 36.188 | 36.219 | 35.093 | 407,281 | 参考 |
| **mean (r1-r4, n=4)** | — | 126.255 (σ 3.011%) | 36.197 | 36.227 | 35.108 | 407,209 | 参考 |
r1 は最初の driver 実行 (§0 の自己バグにより r1 のみで停止した回) で完走した run で、r1 の run 窓に対応する独立 10s load sampler ログは、後続の r2/r3 再実行で `final-stack-n3.sh` を再起動した際に : >"$SAMPLE_LOG" で truncate されており窓内 load 記録が 0 サンプルである。当初はこの記録欠落 (`p2-msplat-parity-final` §7「事前 gate だけでは不十分、窓内記録が必須」への抵触) だけを根拠に r1 を格下げしていたが、advisor レビュー指摘を受けてログ自身の ms/iter trace (p3-refine-3pass §7 が汚染 run の判別に使ったのと同じ discriminator) を直接調べたところ、より積極的な証拠が見つかった: r2/r3/r4 は iter 6000〜12500 の間 ms/iter が 11.0〜12.1 でほぼ平坦に対し、r1 だけ iter 6000 (11.1ms) → 7000 (15.5ms) → 8000 (14.0ms) → 9000 (12.4ms) と局所的に跳ね上がり、iter 10000 以降 (11.8〜12.0ms) は他 run と合流する。iter 1000〜5000 の値は 4 run とも ±0.3ms 以内で一致しており (例: iter3000 は r1=8.6/r2=8.4/r3=8.5/r4=8.2)、r1 が一貫して重い cold-start ではなくiter 6000-9000 に限定された transient であることを trace 自体が示している。この 3000 iter 区間の超過 (r1 vs r2-r4 平均、およそ +3〜4ms/iter × 3000iter ≈ 数秒〜7秒) が r1 の全体超過 (r2-r4 平均比 +6.9s) の大半を説明する。訂正: 当初 r1 の pre/post uptime を「他 run より高い側」と書いたが、正しくはpost のみ (4.76) が最高で、pre (1.46) は r4 の pre (3.80) より低い — 判断根拠は uptime ではなく上記 ms/iter trace に置く。結論: r2/r3/r4 (trace 平坦、window 記録あり、A7 gate on-arm mean 124.807s を -0.33% で再現) を正式な n=3 として採用し、r1 は iter 6000-9000 の transient 汚染が trace 上で直接確認できる診断用参考値とする。r1 を含めた場合でも期日目標 (≤135s) は変わらず達成 (126.62s / 126.26s とも 135s 未満)。
throughput (ns/splat·iter) の計算に必要な「iteration 平均 splat 数」は、各 run のログが 1000 iter ごとに出力する splat 数を台形則で積分して算出した (advisor レビュー指摘: 旧 finding の 322k という値をそのまま借用せず、自前の log から再計算する)。r2/r3/r4 の平均は 321,636.5 で、p2-msplat-parity-final が報告した 322k と 0.1% 差で一致し、この算出法の妥当性を裏づける。
milestones.md M7 手順 2 (`2026-08-30-c1v2-12500-off-prof.toml`) は、milestone 本文が指定した「同じ finding に v2 節を追記」という指示どおり、新規 finding を作らず p3-kernel-share-post-s3.toml に §6 (v2 節) / §7 を追記した。要点のみ引用する: leaf gpu_ms 合計は v1 141.716s → v2 114.508s (-19.20%)、いずれも busy union と exact 一致。radix share 26.40%→12.01% (絶対 -63.25%、M4 gate の forward_submission=per_stage 補助計測 -63.7% と独立一致、cross-validation)。backward_raster share は 33.86%→40.07% に上昇しているが、これは分母 (radix の劇的縮小) が原因で、backward_raster 自体の絶対 gpu_ms はむしろ -4.40% と縮んでいる (「share 上昇 ≠ 遅くなった」の注記を finding 本文に明記済み)。
| 段階 | 施策 | Lego 12.5k train elapsed (s) | PSNR (dB) | Δ (対前段) | msplat 比較値 (旧166s系/新165s系) |
|---|---|---|---|---|---|
| Phase 0 | baseline (規約 v2 適用後) | 766.07 | 36.216 | — | 4.51× |
| + C0 | resident binning arena + radix pass skip 16→11 | 395.59 | 36.183 | -48.4% | — |
| + LC | backward last_contributor range | 336.33 | 36.191 | -15.0% | — |
| + S1 | pipeline 全域 resident 化 (Tier A/B/C) | 261.55 | 36.148 | -22.2% | 1.56× |
| + W1 | warp sparse skip | 241.41 | 36.201 | -7.7% | 1.44× |
| + W2 | chained submission (adam+loss chain 統合) | 219.51 | 36.170 | -9.1% | 1.31× |
| + S2 | forward 1 CB 化 + hierarchical GPU scan | 187.65 | 36.167 | -9.9% | 1.105× |
| + S3 | iteration pipelining depth 2 | 151.70 | 36.202 | -18.1% | 0.907× (process wallclock 154.00s 基準、train elapsed 列とは分子が異なる点に注意) |
| **+ radix simd_ballot (M4)** | radix scatter simdgroup ballot 2 段化 | 127.53 | 36.143 | **-14.9%** | — |
| **+ refine 3-pass 削減 (A7)** | refine scratch 永続化 + compact 直書き | 124.81 | 36.241 | **-2.15%** | — |
| **+ 最終スタック独立再計測 (M7)** | M4+A7 済みスタックの独立 n=3 gate | **124.39** | **36.219** | **-0.33%** (ほぼ noise) | **0.755× (新 gap 公式値)** |
「msplat 比較値」列は各段階の finding が同時期に引用した msplat 実測値 (166〜220s 系、複数の異なる session・protocol) に対する比であり、互いに厳密には同じ msplat 断面ではない (roadmap v2 冒頭の累計注記も同じ注意書きを付けている)。S3 行までの値は各 finding からの引用をそのまま転記した。M4/A7 の 2 段は当時 msplat 側の等価比較を行っていない (gate は wallclock/PSNR の A/B のみ) ため空欄、M7 で改めて msplat 側 (block1 n=2 mean 164.69s) と揃えて **0.755×** を算出した (§4)。
| 断面 | 旧値 (2026-08-17、S3 のみ) | 新値 (2026-08-30、M4+A7 込み) | 再計測の有無 |
|---|---|---|---|
| **wallclock gap (12.5k / msplat 30K、block1 n=2 分母)** | 0.927× | **0.755×** | **新規実測** (本実装側のみ、r2-r4 mean 124.393s) |
| 同上、msplat n=4 mean (165.42s) 分母 | 0.923× | **0.752×** | 同上 |
| **per-splat·iter throughput (本実装 / msplat)** | 1.135× (msplat が速い、13.5% 負け) | **0.926× (本実装が速い、7.4% 優位)** | **新規実測** — avg splats を新 4 run の trapezoid 積分で自前算出 (321,637) |
| brush convention PSNR Δ (msplat 保守値 34.243dB 比) | +1.97dB | **+2.01dB** | **新規実測** (`splat eval --convention brush --quantize-8bit` を既存 final.ply に再実行、新規学習 run は無し) |
| white convention PSNR Δ (msplat cross-eval 最小 36.252dB 比) | -1.10dB | **-1.11dB** | 同上 (`white_eval.py` を既存 final.ply に再実行) |
| matched-wallclock 断面 (13,300 iter) | 165.85s / brush+1.94dB (1.007×) | **未再計測** | carry forward。M7 スタックでの ~164.7s 到達点は概算 ~16,000〜16,500 iter 圏 (未検証・線形外挿、次 session 課題) |
| matched-PSNR (brush) 断面 (6,000 iter) | 51.60s (0.313×) | **未再計測** | carry forward。iter 数自体は PSNR trajectory 不変のため 6,000 のままのはずだが、対応 wallclock の実測が必要 |
| matched-iteration (30K vs 30K) | 479.91s (2.888×) | **未再計測** | carry forward。30k full run が必要 (~8 分、本 session の GPU 予算外) |
| GPU energy / package energy | 0.906× / 0.896× | **未再計測** | carry forward。`splat power-sample` 併走 run が必要 |
2026-08-17 時点 (S3 のみ) の per-splat·iter throughput は msplat 1.135× (本実装が 13.5% 遅い) で、p2-msplat-parity-final は「near-parity まで詰めたが、まだ 13.5% 負け」と結論していた。M4 (radix simd_ballot) + A7 (refine 3-pass) の 2 施策で本実装は 37.9ns → 30.94ns/splat·iter に縮み、msplat 33.4ns を下回った (比 0.926×、本実装が 7.4% 優位)。本実装側の avg splats (321,637) は新規 4 run の trapezoid 積分による自前算出 (旧 322k と 0.1% 差で一致 — 算出法の相互検証も兼ねる) だが、msplat 側の avg splats (~165,000) は p2-msplat-parity-final からの借用値であり、本 session では msplat を再実行していないため再導出できていない。逆転の主張が成立する境界を逆算すると、msplat 側 avg splats が ~178,200 (借用値比 +8.0%) を超えると throughput は再び msplat 優位に戻る — msplat 30K の final splats (191,209〜196,404、n=4) から avg/final 比が本実装並み (0.79) なら avg ≈ 151k で安全側に収まるが、early-stopping 型の densification で avg/final 比が高め (0.92 程度) なら境界に近づく。「本実装が優位」の結論は、この ±8% 未満の借用値誤差の範囲内でのみ成立する — 確定させるには msplat 側の avg splats を同じ trapezoid 法で再導出する追加作業 (msplat 側ログの再解析、GPU run 不要) が次 session の課題として残る。roadmap v2 が「単位仕事あたりでは 2.6 倍遅い (2026-08-16)」→「near-parity、まだ 13.5% 負け (2026-08-17)」と書いてきた脚注は、本 finding で「本実装が優位 (ただし msplat 側 avg splats の借用値誤差 ±8% 未満という条件つき)」に書き換える。
M4 (radix scatter の rank 計算方式変更、sort parity は bit-exact) と A7 (refine の allocation/copy 経路変更、書き込みロジック自体は不変) はいずれも「計算結果を変えない」ことを parity test で pin した施策であり、PSNR trajectory が理論上動く理由が無い。実測でも brush +1.97dB→+2.01dB (Δ+0.04dB)、white -1.10dB→-1.11dB (Δ-0.01dB) と両方向とも run-to-run ノイズ帯 (n=3 の σ が 0.01〜0.09dB オーダー) に収まる差で、この予想を裏づけている。
12.5k の速度比 (124.393/151.70 ≈ 0.820×) を旧 matched 断面 (6.0k/13.3k/30k) の wallclock にそのまま掛けて『新値』を捏造することはしなかった。M4 (radix) のコストは pair 数 (≈ splat 数に比例) に、A7 (refine) のコストは tick あたりの scratch サイズ (同じく splat 数に依存) に、それぞれ non-uniform に依存する — p2-msplat-parity-final §5 自身が「30k 断面では 36.5ns/splat·iter、12.5k は 37.9ns と splat 数で per-splat 効率が変わる」と記録しており、単一の乗数で全 iter 数に外挿するのは過剰な精度を偽装することになる。matched-wallclock の到達 iter 数についてのみ、参考の概算 (線形外挿、未検証) として ~16,000〜16,500 iter 圏という方向感を §4 表の備考に残したが、これは公表値ではなく次 session への申し送りである。
この finding が観測された / 言及している実験 run。