backward Simd に (1) <code>sigma >= 5.55</code> の exp-skip (α = color_a·exp(-σ) ≤ exp(-5.55) ≈ 0.003887 < 1/255 — 既存 α<1/255 分岐で必ず落ちる iteration の前倒し skip) と (2) <code>simd_any(contrib)</code> による all-invalid warp skip (9 simd_sum + lane0 の atomic_fetch_add(+0.0) の静的削除) を追加、forward にも同じ sigma skip (W1b、無条件)。どちらも <strong>bit-exact</strong> (single-pixel fixture の byte equality で証明)。replay bench で <strong>final regime 21.72 → 19.30 ms/iter = -11.2% / iter5000 regime 19.98 → 17.76 = -11.1%</strong>、backward_raster 7.18 → 4.65 ms/call (<strong>-35.2%</strong>、GPU 部 -42〜43%)。12.5k full gate n=3: wallclock mean 261.55 → <strong>241.41s (-7.7%)</strong>、PSNR mean <strong>36.201 dB</strong> (基準 36.148 比 +0.053、guard ±0.1 内) → default flip。msplat 同日等価 gap 1.56× → <strong>1.44×</strong>。
HW 4 軸調査 #1 (他実装 HW 技法比較) で、backward rasterize の inner loop に msplat / Inria 3DGS / brush の 3 実装すべてが持つ 2 つの skip が本実装だけ欠けていると特定した (msplat 実測では evaluation の 94% が non-contributing)。(1) exp-skip: splat の color_a は projection の sigmoid 出力 ∈ (0,1) なので α = color_a·exp(-σ) ≤ exp(-5.55) ≈ 0.003887 < 1/255 ≈ 0.003922 — sigma ≥ 5.55 の iteration は既存の α < 1/255 分岐で v_* = 0 のまま必ず落ちる。これを exp 評価前に落としても実行される演算列は不変 (bit-exact)。(2) warp sparse skip: all-invalid warp では 9 本の simd_sum が全て +0.0 → lane0 の atomic_fetch_add(+0.0) になるため、simd_any(contrib) で reduction ごと省略しても最終 splats_grad は順序非依存で bit-exact。simd_any は simd-uniform を返すので non-divergent、done フラグ遷移と end = simd_max(my_stop) bound (LC) は不変。
| 項目 | 内容 |
|---|---|
| W1a backward (rasterize_backwards.metal) | `rasterize_backwards_simd` のみ。lane ごとに `bool contrib` を立て、状態更新 (pix_acc / T / done) 完了後・reduction 直前に `if (!simd_any(contrib)) continue;`。exp-skip は `sigma >= 0 && sigma < 5.55` への条件強化。Tg variant (#5.33c reject 系) には適用しない |
| variant 解決 | Metal 第 3 条準拠: function constant `USE_WARP_SPARSE_SKIP_FC` (index 1、LC の `USE_LAST_CONTRIBUTOR_FC` と同じ流儀) で PSO specialize。Simd × {off, warp_any} × {full_range, last_contributor} の 2 PSO 追加 (計 8 backward PSO)、kernel 内 runtime 分岐なし |
| W1b forward (rasterize.metal) | `render_splats_f32` / `f16` の `if (sigma < 0)` を `if (sigma < 0 || sigma >= 5.55)` に (同じ論証で bit-exact、stop_idx / final_T も不変)。分岐 1 個の追加なので flag なしの無条件変更 |
| config 配線 | `BackendConfig.raster_backward_sparse = { off, warp_any }`、apply_backend_config の exhaustive destructuring に配線。Simd 専用 (backward = original/tg との併用は validate が stderr warning、PSO は off が選ばれる) |
(1) synthetic fixture (24 splat 重ね) で Off vs WarpAny の勾配 tolerance 一致 (abs/rel 1e-4、C7 体系) — FullRange / LastContributor 両スタック。(2) dldr を 1 pixel だけ非ゼロにした fixture で Off と WarpAny の勾配が bit 一致 (`backward_warp_sparse_byte_equality_single_pixel`、両スタック) — warp skip が「+0.0 atomic add の静的削除」、exp-skip が「必ず落ちる iteration の前倒し」であることの直接証明。(3) trainer-level parity (`splat bench --parity`、production-scale Lego): tile_offsets byte 一致 + 全 grad buffer tolerance PASS (残差 max 1.0e-5 は既知の atomic 順序非決定性)。
| metric | off (baseline) | warp_any | Δ |
|---|---|---|---|
| **final regime total** | 21.724 ms/iter (σ 1.35%) | 19.300 ms/iter (σ 0.17%) | **-11.16%** (閾値 2.7%) |
| final ts_backward_raster | 7.183 ms/call | 4.652 ms/call | **-35.2%** |
| final ts_raster_bwd_gpu | 5.963 ms/call | 3.437 ms/call | **-42.4%** |
| **iter5000 regime total** | 19.984 ms/iter (σ 1.57%) | 17.759 ms/iter (σ 0.69%) | **-11.13%** (閾値 3.1%) |
| iter5000 ts_backward_raster | 6.336 ms/call | 4.106 ms/call | **-35.2%** |
| iter5000 ts_raster_bwd_gpu | 5.237 ms/call | 2.971 ms/call | **-43.3%** |
| 他 kernel (forward/radix/ssim/adam) | — | — | ±3.3% 以内 (noise 圏、期待どおり不変) |
計 8 invocation 中 2 window で全 kernel が一様に +5〜25% 遅くなる slow mode を観測 (off / warp_any の両方に発生、backward だけは slow window 内でも -35% を維持)。config 非依存の系統外 interference と判定し、σ が正常な batch (off σ ≤1.6% / warp_any σ ≤0.7%) を採用した。全 batch の median 帯: off 21.27〜21.72 vs warp_any 19.19〜19.73 (final) / off 19.71〜20.03 vs warp_any 17.76〜18.57 (iter5000) で判定は不変。
| rep | wallclock (training) | PSNR (100 views) | final splats | ts_backward_raster |
|---|---|---|---|---|
| rep1 | 239.74s | 36.209 dB | 410,446 | 4.531 ms/call (13.1%) |
| rep2 | 246.93s | 36.201 dB | 406,770 | 4.721 ms/call (13.2%) |
| rep3 | 237.57s | 36.193 dB | 411,238 | 4.476 ms/call (13.1%) |
| **n=3 mean** | **241.41s** | **36.201 dB** | — | **4.58 ms/call** |
| S1 baseline (n=3 mean) | 261.55s | 36.148 dB | — | — |
| **Δ** | **-7.7%** | +0.053 dB (guard ±0.1 内) | — | — |
replay 有意閾値 max(2σ,1%) を 4 倍超過、PSNR guard は n=3 mean で通過 (S1 の教訓に従い n=1 判定なし、3 rep とも歴代分布 36.05-36.23 の上側で安定)。backward 期待帯 -25〜50% のど真ん中 (-35.2%)、total 期待帯 -5〜10% を上回る -11.2% (replay)。W1b (forward sigma skip) は無条件変更として同梱 — 同日 S1 post replay (22.06 ms/iter) と W1 off baseline (21.27〜21.72) の差 -1.5〜-3.6% が W1b + 日内変動に相当するが、bit-exact のため単独 gate は不要。Off は A/B baseline 用に enum 保持。
| 時点 | Lego 12.5k | msplat 同日実測比 (167.7s) | 備考 |
|---|---|---|---|
| S1 (pipeline 全域 resident 化) | 261.55s | 1.56× | p2-s1-pipeline-resident |
| **+ W1 (warp sparse skip + exp-skip)** | **241.41s** | **1.44×** | 本 finding、-7.7% — 全て数学的同値の施策のみで累計 766.07 → 241.41s = **-68.5%** |
W1 後 breakdown の上位は forward 23.6% / radix_sort 15.0% / backward_raster 13.1% / SSIM ~7% — backward はもはや dominant ではない。1× 工程表 v2 の順序どおり W2 (Stage A: adam CB 統合 + setBytes 化) に進み、W1/W2 着弾後に counter session で limiter を確定する。
この finding が観測された / 言及している実験 run。