`splat/configs/2026-08-31-c1-drums-12500-off-prof.toml` (submission=per_kernel/forward_submission=per_stage/pipelining=off、[backend] は c1v2 Lego config を移植) で drums 12.5k を 1 run。leaf 9 label の gpu_ms 合計 170.414242s は末尾 `[gpu] busy 170.414s` と<strong>誤差 0.24ms で一致</strong> (leaf 判定は union との一致で検算、p3-kernel-share-post-s3 と同じ規約)。<strong>backward_raster(+project_back) 40.09%</strong> > rasterize 14.94% > adam 15.52% > ssim 12.75% > radix 11.37% — Lego v2 (40.07/14.13/15.28/13.12/12.01%) と<strong>share は ±1.5pt 以内でほぼ一致</strong>。ただし in-window (12.5k 時点) の splat 数は drums 748,708 / Lego 404,652 で比 1.850倍 (30k 収束時の 998k/400k≈2.5倍とは別の数字)。ms/iter は全 kernel が drums で 1.17〜1.93倍に増加しており、splat-count に無関係なはずの ssim_fwd_grad も 1.446倍増 (1.202→1.738 ms/iter) — comparison 対象の binary vintage 差 (Lego v2 は a446f2c、drums は HEAD 3db33a8、間に S4b ssim_reduce=gpu default flip と C2 計装追加が入っている) による系統的な底上げが疑われ、絶対値比較は汚染されている。
drums (nerf_synthetic, 998k splats @30k 収束時 — Lego 30k の約 2.5倍、p1-axis1-phase-g-pareto-landscape §2) は本日の全最適化判断の根拠になった Lego per-kernel share (p3-kernel-share-post-s3 §6 v2) と splat 数の regime が大きく異なる。share 構造が splat 数に対して不変か — つまり Lego で優先した施策の順位が drums でも成り立つか — を 1 run 実測で判定する。
| kernel (leaf label) | gpu_ms (12,500 iter) | gpu_ms/iter | share |
|---|---|---|---|
| **`ts_backward_raster` (+`ts_project_back`)** | 68,320.800 | **5.466** | **40.09%** |
| `ts_adam` | 26,451.188 | 2.116 | 15.52% |
| `ts_fwd_rasterize` | 25,457.227 | 2.037 | 14.94% |
| `ts_ssim_fwd_grad` | 21,721.819 | 1.738 | 12.75% |
| `ts_fwd_radix_sort` | 19,382.967 | 1.551 | 11.37% |
| `ts_fwd_project` | 4,921.986 | 0.394 | 2.89% |
| `ts_l1_combine_ssim` | 2,168.841 | 0.173 | 1.27% |
| `ts_fwd_emit_pairs` | 1,763.565 | 0.141 | 1.04% |
| `ts_fwd_extract_off` | 225.849 | 0.018 | 0.13% |
| **leaf 合計** | **170,414.242** | **13.633** | **100%** |
| (参照) `[gpu] busy` union | 170,414.0 (170.414s) | 13.633 | — |
| kernel | Lego v2 ms/iter (a446f2c) | drums ms/iter (3db33a8) | ms/iter 比 | Lego v2 share | drums share | share Δ (pt) |
|---|---|---|---|---|---|---|
| backward_raster (+project_back) | 3.670 | 5.466 | 1.489× | 40.07% | 40.09% | +0.02 |
| adam | 1.400 | 2.116 | 1.511× | 15.28% | 15.52% | +0.24 |
| rasterize | 1.295 | 2.037 | 1.573× | 14.13% | 14.94% | +0.81 |
| ssim (`ts_ssim_fwd_grad`) | 1.202 | 1.738 | **1.446×** | 13.12% | 12.75% | -0.37 |
| radix | 1.100 | 1.551 | 1.410× | 12.01% | 11.37% | -0.64 |
| project | 0.271 | 0.394 | 1.451× | 2.96% | 2.89% | -0.07 |
| l1_combine_ssim | 0.090 | 0.173 | **1.928×** | 0.98% | 1.27% | +0.29 |
| emit_pairs | 0.121 | 0.141 | 1.167× | 1.32% | 1.04% | -0.28 |
| extract_off | 0.011 | 0.018 | 1.616× | 0.12% | 0.13% | +0.01 |
| **leaf 合計** | **9.161** | **13.633** | **1.488×** | 100% | 100% | — |
9 kernel すべてで share の差は 1.5pt 未満 (最大は project の -0.07pt〜rasterize の +0.81pt)。backward_raster が単独最大ブロックであること (40%強)、2 位が adam/rasterize (15%前後)、3 位がssim/radix (11-13%) という順位・大まかな比率は drums でも維持されている。Lego の per-kernel share に基づいて優先付けた施策 (backward_raster 系が最優先、radix/adam/rasterize/ssim が僅差の次点) の相対順位は、splat 数が 1.85倍の drums でも覆らない、というのが本 run の一次的な結論。
本比較の Lego v2 (a446f2cacb5a) と drums (HEAD 3db33a802265) の間には 34 commit (非 doc-only 12 commit) が splat/ に入っている。特に S4b (`4405bb4`, ssim_reduce=Gpu default flip、12.5k production -1.43%) と C2 計装追加 (`9deb14a`, 全 CB に kernel_start/kernel_end timestamp 収集を追加) が per-kernel gpu_ms の絶対値に影響しうる。`ts_ssim_fwd_grad` は 800×800 固定解像度・window 7 の純粋 per-pixel kernel であり 理論上 splat 数に依存しないはずだが、実測は 1.202→1.738 ms/iter (+44.6%) と大きく増加している。しかも 9 leaf 全体が 1.17〜1.93倍というかなり均一な増加を示しており (leaf 合計の増加倍率 1.488× に近い値へ多くの kernel が収束している)、これは純粋な splat-count scaling (kernel ごとに増加率が大きく異なるはず — adam/radix は O(splats)、rasterize は O(tile-splat pairs)、ssim/project/extract_off は O(pixels) でほぼ一定のはず) では説明しにくい。S4b の ssim_reduce=Gpu が l1_combine_ssim (1.928×) 側に主な増分を持ち込み、C2 計装の全 CB 追加オーバーヘッドが残り 8 kernel を系統的に底上げしている可能性が高い — ただし本 run 単独では S4b/C2/thermal/純粋な splat scaling を分離できない (n=1、対照実験なし)。ms/iter の絶対値・scaling 係数は次ラウンドで Lego 側も HEAD (3db33a8) で撮り直すまで確定させない。
| kernel (leaf label) | v2 gpu_ms (a446f2c) | v3 gpu_ms (a556b78, 同 Lego scene) | v2 ms/iter | v3 ms/iter | v3/v2 比 | v2 share | v3 share | share Δ (pt) |
|---|---|---|---|---|---|---|---|---|
| backward_raster (+project_back) | 45,877.989 | 46,157.186 | 3.670 | 3.693 | 1.006× | 40.07% | 40.18% | +0.11 |
| adam | 17,502.128 | 17,695.339 | 1.400 | 1.416 | 1.011× | 15.28% | 15.40% | +0.12 |
| rasterize (`ts_fwd_rasterize`) | 16,185.077 | 16,163.920 | 1.295 | 1.293 | 0.999× | 14.13% | 14.07% | -0.06 |
| ssim (`ts_ssim_fwd_grad`) | 15,025.375 | 14,924.969 | 1.202 | 1.194 | 0.993× | 13.12% | 12.99% | -0.13 |
| radix (`ts_fwd_radix_sort`) | 13,749.681 | 13,788.972 | 1.100 | 1.103 | 1.003× | 12.01% | 12.00% | -0.01 |
| project (`ts_fwd_project`) | 3,391.138 | 3,430.628 | 0.271 | 0.274 | 1.012× | 2.96% | 2.99% | +0.03 |
| l1_combine_ssim | 1,124.633 | 1,124.420 | 0.090 | 0.090 | 1.000× | 0.98% | 0.98% | 0.00 |
| emit_pairs (`ts_fwd_emit_pairs`) | 1,511.105 | 1,453.624 | 0.121 | 0.116 | 0.962× | 1.32% | 1.27% | -0.05 |
| extract_off (`ts_fwd_extract_off`) | 140.612 | 141.674 | 0.011 | 0.011 | 1.008× | 0.12% | 0.12% | 0.00 |
| **leaf 合計** | **114,507.738** | **114,880.732** | **9.161** | **9.190** | **1.003×** | 100% | 100% | — |
同じ Lego scene・同じ [backend] regime のまま binary だけを `a446f2c` → `a556b78` (S4b + C2 計装 + それ以降の全 commit を含む) に進めても、9 leaf すべてが v2 比 0.962×〜1.012× (leaf 合計 1.003×) に収まった。最大逸脱は emit_pairs の -3.80%、次点は §2 で名指しした ssim (`ts_ssim_fwd_grad`) の -0.67% (むしろ微減) — drums で見られた +44.6% (1.202→1.738ms/iter) とは方向すら逆であり、ssim_fwd_grad の増加は binary vintage (S4b の ssim_reduce=Gpu) では説明できない。share Δ も全 kernel ±0.13pt 以内で、backward_raster 単独最大 (40%強)・adam/rasterize 次点 (15%前後)・ssim/radix 僅差の 3位 (12-13%) という構造も完全に維持されている。結論: S4b・C2 計装を含む binary vintage 差は per-kernel gpu_ms を系統的には底上げしていない — §2/§4 で報告した「profile=on 経路の系統的な底上げ」疑いは本 run により反証され、取り下げる。加えて、drums run (`cb=187501`) と v3 run (`cb=187501`) はiteration あたりの CB 数が完全に一致 (187,501÷12,500 ≈ 15.00/iter、両者とも submission=per_kernel/forward_submission=per_stage という同一 regime なので当然ではあるが)、C2 は全 CB に一様に kernel_start/end timestamp を挿すだけの計装であるため、C2 の per-CB オーバーヘッドは drums と Lego で iteration あたり同一のはずであり、drums の splat 数 (≒per-iteration の実 kernel dispatch 数) が多い分だけ C2 が「相対的に」より多く効く、という交互作用 (interaction effect) の可能性も本 CB 数一致によって別途排除できる。drums で観測された全 9 leaf 1.17〜1.93倍の増加 (leaf 合計 1.488×) は、drums scene 自体 (in-window splat 数 1.85倍 [§3]、nerf_synthetic 内の画像内容差・tile occupancy パターンの違いなど) に起因すると判定する。ただし本 run が確定させたのは「vintage 由来ではない」ことのみであり、scene 由来の内訳 (splat 数 vs 画像内容) と drums run 固有の測定環境 (thermal 等、§4 が挙げていたが本 run では制御していない要因) の寄与は未分離のまま残る。
§2 は `ts_ssim_fwd_grad` が「800×800 固定解像度・window 7 の純粋 per-pixel kernel であり理論上 splat 数に依存しないはず」という前提で drums の +44.6% を binary vintage 汚染の傍証として扱った。本 run (v3) は同じ Lego scene で binary vintage 差を再現しても ssim_fwd_grad が -0.67% (実質不変、むしろ微減) だったため、+44.6% が binary vintage 由来ではないことが確定した。これにより「ssim_fwd_grad は splat 数に依存しないはず」という §2 の前提こそが実測によって反証された (vintage 差では説明できない以上、splat 数または splat 数と相関する何か — 画像内容・rasterize 出力の統計的性質 — が ssim_fwd_grad の gpu_ms に影響している、と読み替える必要がある)。残る説明候補は (1) drums の画像内容 (nerf_synthetic 内での高周波成分・輝度分布の違いによる SSIM window 内の分岐/早期終了パターン差)、(2) `ssim_reduce = Gpu` (S4b default、`SsimReduceKind::Gpu`) の reduce kernel 自体が完全に splat 数非依存ではなく、上流の rasterize 出力 (splat 数に依存するタイル占有率・アルファブレンド深度) の統計的性質に応じて GPU 側のメモリアクセスパターン/occupancy が変わる、のいずれか。次段で drums 側の ssim_fwd_grad 単体を `ssim_reduce = "host"`/`"gpu"` (`SsimReduceKind::Host`/`Gpu`、`splat/crates/splat-train-v1/src/config.rs` 参照。**`Cpu` という variant は存在しない**) の A/B で切り分けるか、drums の rasterize 出力統計 (per-pixel contributor 数分布) を Lego と比較すれば追加の手がかりが得られる (本 finding のスコープ外、実施していない)。
この finding が観測された / 言及している実験 run。