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>。
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 の静的削除」だけで打ち切れる (数学的同値)。
| 項目 | 内容 |
|---|---|
| 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 に渡す |
(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 の静的削除」であることの直接証明。
| metric | baseline (C0, 0abdaa2) | last_contributor (510101288c52) | Δ |
|---|---|---|---|
| **wallclock (training)** | 395.59s | 336.33s | **-14.98%** |
| PSNR (100 views) | 36.183 dB | 36.191 dB | +0.008 dB (guard ±0.1 内) |
| final splats | 407,901 | 408,752 | +0.21% (atomic 非決定性圏内) |
| ts_backward_raster | 160.4s (12.83ms/call, 31.4%) | 95.8s (7.66ms/call, 21.0%) | **-40.3%** |
| ts_fwd_rasterize | 41.2s (3.30ms/call) | 44.9s (3.59ms/call) | +8.9% (last_contrib store + run 間変動) |
| ts_fwd_radix_sort | 59.8s (4.79ms/call) | 61.5s (4.92ms/call) | +2.8% (変動圏) |
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 用)。
| 構成 | wallclock | vs baseline | PSNR | 判定 |
|---|---|---|---|---|
| baseline (resident + original + full_range) | 395.59s | — | 36.183 dB | — |
| STP 単独 (emit_pairs = stop_the_pop) | 385.65s | **-2.51%** | 36.183 dB | gate -3% **未達** |
| LC 単独 (last_contributor) | 336.33s | -14.98% | 36.191 dB | 採用 (上記) |
| スタック (LC + STP) | 343.63s | -13.13% (LC 単独比 **+2.2%**) | 36.138 dB | STP は LC 上で**逆効果** |
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 での再評価余地はある)。
| 時点 | Lego 12.5k | msplat Lego 30K 比 (220s) | 備考 |
|---|---|---|---|
| Phase 0 baseline (規約適用後) | 766.07s | 3.48× | p2-gap-sweep-baseline |
| C0 + C1 (resident arena) | 395.59s | 1.80× | p2-c0-resident-binning、-48.4% |
| **+ 2-BWD last_contributor** | **336.33s** | **1.53×** | 本 finding、-15.0% — **目標 ≤2.0× 達成** |
新 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) の施策のみで達成。
この finding が観測された / 言及している実験 run。