松田研究室
FindingID: p2-last-contributor
Status: stable / task 2026-08 msplat gap sweep Phase 2 2-BWD / STP 再判定
← Findings Index
P2 gap sweep · Phase 2 · 2-BWD + STP 再判定

P2 gap sweep Phase 2 — 2-BWD last_contributor で -15.0% (数学的同値)、STP 再判定は棄却

forward が per-pixel の replay 打ち切り位置 (<code>last_contributor</code>) を保存し、backward replay を <code>[range.x, last_contributor)</code> に制限 (msplat / Inria 原典方式)。打ち切り区間は forward で T early-out 済み = 勾配厳密ゼロなので<strong>数学的同値</strong> (single-pixel fixture の byte equality で証明)。Lego 12.5k gate で <strong>wallclock 395.59 → 336.33s = -14.98%</strong>、backward_raster 12.83 → 7.66ms/call (<strong>-40.3%</strong>)、PSNR +0.008 dB で guard 通過 → default flip。STP 再判定は C0 後 baseline で -2.51% (gate -3% 未達)、LC スタック上では +2.2% の逆効果 — Phase 1a の -7.45% は C0 の page fault 削減と重複していたことを実証し、default Original 維持を確定。msplat gap は 3.2× → <strong>1.53×</strong>。

positiverank: highlc-adopted-minus-15-percent-stp-rejected-final第 1 軸gap-sweepphase-22-bwd-last-contributorbackwardstop-the-popre-evalfunction-constantlego
Δ PSNR
LC 12.5k gate: 36.183 → 36.191 dB = +0.008 dB (数学的同値実装、atomic 非決定性 guard ±0.1 内)
Δ Wallclock
LC 12.5k gate: 395.59 → 336.33s = **-14.98%** (backward_raster -40.3%)。STP: -2.51% (gate 未達)、LC+STP スタック: 343.63s (LC 単独より +2.2%)
Impact
C0 (-48.4%) に続く Phase 2 第 2 弾で、backward 31.4% の新 bottleneck を kernel 側から -40.3% 削減。Lego 12.5k = 336.33s で msplat 30K (220s) 比 1.53× まで縮小し、gap sweep の目標 (≤2.0×) を達成した。実装は「forward が既に知っている打ち切り位置を backward に伝えるだけ」で数学的同値 — 品質を 1 bit も動かさずに backward の replay 計算量を ~40% 削った。STP 再判定は負の結果だが価値が高い: Phase 1a の -7.45% の正体が C0 と同じ page fault 削減だったことを分離実証し、「効果の重複を疑って再 bench する」protocol の正しさを裏付けた。次の bottleneck は forward rasterize 9.8% / radix 13.5% / SSIM 7.5% でいずれも trigger 25% 未達 — Phase 2 はここで完了、Phase 3 (再計測 + Pareto v3) へ。
01

本文

C0 後 baseline (395.59s) で backward_raster が 31.4% と trigger を初超過したため、msplat / Inria 3DGS 原典が持つ per-pixel last_contributor を実装。forward の per-pixel loop は T early-out (next_T ≤ 1e-4) した瞬間に break し、それ以降の splat は一切合成されない — backward は同一式で alpha 列を再計算するので同じ位置で break し、それ以降の splat への atomic emit は厳密にゼロ。よって forward が early-out 位置を保存すれば backward の replay loop は「決して実行されない iteration の静的削除」だけで打ち切れる (数学的同値)。

1. 実装 (`raster_backward_range = last_contributor`)

項目内容
forward (rasterize.metal)`render_splats_f32` / `f16` に buffer(7) `last_contrib_out` を追加、per-pixel の replay exclusive end (early-out した splat の絶対 index、なければ range.y) を常時書き込み。コストは tracking + u32 store 1 回/pixel のみで variant gate せず、out / final_T は bit 不変
backward (rasterize_backwards.metal)3 variant とも replay loop を `[range.x, end)` に制限。Original は per-pixel bound、Simd は `simd_max` (reduction lockstep 維持)、Tg は threadgroup atomic max。bound と自分の stop の間は既存 done flag で寄与 0 (full-range 時と同一動作)。同値性の論証を file 冒頭に明記
variant 解決Metal 第 3 条準拠: function constant `USE_LAST_CONTRIBUTOR_FC` (index 0) で PSO specialize (3 kernel × 2 = 6 PSO)、kernel 内 runtime 分岐なし。`Device::pso_with_constants` / `pso_min256_with_constants` を追加
config 配線`BackendConfig.raster_backward_range = { full_range, last_contributor }`、apply_backend_config の exhaustive destructuring に配線。ForwardState が `last_contrib_buf` (GPU buffer のまま、host readback なし) を保持し per-stage / batched_tail 両経路で backward に渡す
parity — atomic の影響を受けない byte equality まで証明

(1) 3 variant × FullRange vs LastContributor の勾配 tolerance 一致 (abs/rel 1e-4、既存 C7 体系)。(2) T early-out を確実に踏む synthetic fixture (opacity 0.88 × 24 splat 重ね、境界値 1e-4 を避けた設計) で last_contributor の意味論を直接検証。(3) dldr を 1 pixel だけ非ゼロにした fixture では各 splat への非ゼロ寄与が高々 1 回になり atomic 順序の非決定性が消える — この条件で FullRange と LastContributor の勾配が bit 一致 (`backward_last_contributor_byte_equality_single_pixel`)。打ち切りが「実行されない iteration の静的削除」であることの直接証明。

2. LC 12.5k gate run (baseline 395.59s / 36.183 dB との比較)

metricbaseline (C0, 0abdaa2)last_contributor (510101288c52)Δ
**wallclock (training)**395.59s336.33s**-14.98%**
PSNR (100 views)36.183 dB36.191 dB+0.008 dB (guard ±0.1 内)
final splats407,901408,752+0.21% (atomic 非決定性圏内)
ts_backward_raster160.4s (12.83ms/call, 31.4%)95.8s (7.66ms/call, 21.0%)**-40.3%**
ts_fwd_rasterize41.2s (3.30ms/call)44.9s (3.59ms/call)+8.9% (last_contrib store + run 間変動)
ts_fwd_radix_sort59.8s (4.79ms/call)61.5s (4.92ms/call)+2.8% (変動圏)
verdict: 採用 — `raster_backward_range` default を LastContributor に flip

flip 条件 (-5% & guard) を 3 倍超過。backward -40.3% は期待帯 (-30〜50%) のど真ん中。forward 側の last_contrib 常時書き込みコスト (store 1 回/pixel + 2.56MB/iter buffer) は net -15.0% に織り込み済みで問題にならない。FullRange は敗者 variant として enum に保持 (A/B baseline 用)。

3. STP 再判定 (C0 後 baseline での取り直し)

構成wallclockvs baselinePSNR判定
baseline (resident + original + full_range)395.59s—36.183 dB—
STP 単独 (emit_pairs = stop_the_pop)385.65s**-2.51%**36.183 dBgate -3% **未達**
LC 単独 (last_contributor)336.33s-14.98%36.191 dB採用 (上記)
スタック (LC + STP)343.63s-13.13% (LC 単独比 **+2.2%**)36.138 dBSTP は LC 上で**逆効果**
verdict: STP 棄却 — default Original 維持を確定

Phase 1a の -7.45% (766→709s) の大半は、emit の page fault 削減という C0 と同じ寄与源だったことが分離実証された (C0 で emit share 38.2% → 1.2% に消滅した後の STP 残余効果は -2.51%)。さらに backward が LC で短縮された後は、contribution test の追加コスト > range 削減の利得となり LC スタック上で +2.2% の逆効果。「実証済み -10.2%」から始まった feat.F は、2 段階の baseline 変化 (C0 → LC) を経て効果が消滅する良い事例 — 逐次スタック + 再 bench protocol の必要性を裏付けた。enum は flag として保持 (大 splat regime / 他 scene での再評価余地はある)。

4. msplat gap の現在地と Phase 2 完了判定

時点Lego 12.5kmsplat Lego 30K 比 (220s)備考
Phase 0 baseline (規約適用後)766.07s3.48×p2-gap-sweep-baseline
C0 + C1 (resident arena)395.59s1.80×p2-c0-resident-binning、-48.4%
**+ 2-BWD last_contributor****336.33s****1.53×**本 finding、-15.0% — **目標 ≤2.0× 達成**
Phase 2 完了 — 残 bottleneck はすべて trigger 未達

新 breakdown の上位は forward rasterize 9.8% / radix sort 13.5% / SSIM 7.5% / Adam 6.1% で、いずれも単独 trigger (25%) に遠い。backward_raster も 21.0% に低下し trigger を下回った。profiling が指す dominant がなくなったため Phase 2 はここで完了し、Phase 3 (Lego + materials + 8 scene 再計測、Pareto v3、卒論 §5 への反映) に移行する。累計: 766.07 → 336.33s = -56.1% を数学的同値 (bit-exact C0/C1 + 同値 LC) の施策のみで達成。

02

関連する run

この finding が観測された / 言及している実験 run。

03

関連 finding

© 2026 大竹律輝 — 松田研究室