実 config (K=7) の SSIM forward/backward を対象に、fwd の 3ch 個別 walk (294 load/px) を 1 walk に統合する <code>ssim_forward_float4</code> (stage 1) と、bwd の window あたり 3 divide (441 divide/px) を削減する <code>ssim_backward_rcp</code> (stage 2、441→147 divide/px) を実装した。<strong>stage 1 は K=7/K=11 の単体 test に加え本番規模 (407,267 splats) の <code>splat bench --parity</code> でも byte 一致を確認</strong> — PSNR risk が原理的にゼロの再挑戦候補として残る。stage 2 は REL_TOL を実測ベースで確定 (K=7 max_rel=8.4519e-5 / K=11 6.3679e-5 → REL_TOL=2e-4)、parity は本番規模でも PASS したが、<strong>「採用候補の最終形 = float4_rcp」を対象にした 12.5k Lego 同一 session 交互 A/B n=3 gate で PSNR guard に抵触し不採用</strong>とした (on mean 36.1327 dB vs off mean 36.2133 dB、Δ -0.081 dB、3 pair 全てで on<off の系統的分離)。wallclock 側も Δ -0.055% で有意閾値 (2.53%) に届かない null という結果で、二重に採用基準を満たさなかった。
milestone 本文 (M5a) の要求は「3ch 単一 walk で fwd 294→98 load/px、bwd の除算 441 回/px が本丸、第 1 段 (load 統合) は加算順不変で bit-exact、除算削減で丸めが変わる場合は第 2 段として別 flag 値に分ける」。この構造どおり `SsimWalkKind { PerChannel(default), Float4, Float4Rcp }` を実装した。Float4 は forward のみ新 kernel (`ssim_forward_float4`) を使い backward は既存 `ssim_backward` を共有する (backward には load 統合の余地が実質ない — x/y は channel ごとに window loop の外で 1 回だけ load 済み、window loop 内の load は `stats_in` のみで AoS stride 5 float のため vectorize してもメリットがない)。本 finding は前回 draft (implementation-only、GPU 未検証) からの続きとして、検証 → gate → 結論確定までを完結させる。
| test / 経路 | 何を pin するか | 結果 |
|---|---|---|
| `ssim_walk_float4_is_byte_exact` (K=7, sigma=1.0 / K=11, sigma=1.5) | 24×24 非定数 synthetic RGB で mean ssim + grad buffer 全要素が bit 一致 | **PASS (両 K)** |
| `splat bench --parity` (本番規模、407,267 splats、Lego 12.5k checkpoint、baseline=per_channel vs candidate=float4) | tile_offsets byte 一致 + grad 5 種 tol PASS + loss diff 極小 | **PASS OVERALL** (loss diff=1.770e-8, means_grad max_abs_diff=1.080e-5, 他 4 grad も tol 内) |
加算順を変えない load 統合という設計方針が、24×24 synthetic だけでなく本番規模 (407,267 splats、実データ) でも bit-exact であることを確認した。Float4 単独 (backward は従来のまま) は本 gate では計測していない — stage2 (float4_rcp) を「採用候補の最終形」として一括計測する milestone 方針のためであり、Float4 単独の 12.5k wallclock 効果は未知数だが、byte-exact ゆえに PSNR guard で落ちるリスクは構造的にゼロ。次回 M5a 系を revisit するなら、まず Float4 単独を gate してから stage2 を検討する順序の方が PSNR risk を切り分けやすい。
production default (`submission=chained`, W2) では ssim/l1combine/backward/adam が 1 CB に畳まれ `ts_ssim_fwd_grad` は encode コストしか計れない (train_loop.rs コメント)。ssim kernel 単体の gpu_ms を切り出すため、この節だけ `submission=per_kernel` (W2 gate で敗退・default 交代済みの legacy mode、production では使わない) で計測している — p3-radix-ballot §4 の `forward_submission=per_stage` と同型の位置づけ。`ts_ssim_fwd_grad` は forward+backward を合わせて計測する (`forward_and_grad_buf` 呼び出し全体)。
| arm (`splat bench`, warmup=20, iters=200, repeats=3, submission=per_kernel) | ms/iter 全体 (median) | sigma | ts_ssim_fwd_grad gpu_ms 合計 (600 calls) | gpu_ms/call |
|---|---|---|---|---|
| per_channel (baseline) | 14.415 | 8.55% | 758.917 | 1.265 |
| float4 (stage1 のみ) | 17.558 | **36.01% (使用不可、ambient contention 疑い)** | 780.806 | 1.301 |
| float4_rcp (stage1+stage2、採用候補の最終形) | 13.821 | 0.55% | 601.064 | 1.002 |
float4 arm の 3 repeat (17.558 / 14.397 / 28.174 ms/iter) は ambient load (session 開始時 load1 15.24) との contention が疑われ σ 36% と極端に大きく、per_channel との比較 (全体 ms/iter も ssim label gpu_ms も) は方向性判定にすら使えない。float4_rcp arm は σ 0.55% とクリーンで、ts_ssim_fwd_grad label の gpu_ms が per_channel 比 -20.8% (758.917→601.064ms/600calls) と明確に縮小した — stage2 (逆数共有 backward) の効果が単体では確かに存在することを示す。ただしこの label は forward+backward 合算であり、per_channel と float4 (forward のみ変更) の比較が取れていないため、効果の内訳 (forward 由来 vs backward 由来) は本節だけでは分離できない。
| 実行順 | arm | config | train elapsed (s) | PSNR (dB) | final splats | 備考 |
|---|---|---|---|---|---|---|
| 1 (redo) | off (A) | m5a-12500-off-r1 | 128.529 | 36.256 | 407,399 | 元 run は汚染疑いで破棄 (§5)、load1 2.16→2.85 の窓で再実行 |
| 2 (redo) | on (B) | m5a-12500-on-r1 | 133.186 | 36.156 | 404,901 | 元 run は汚染疑いで破棄 (§5)、load1 2.85→2.48 の窓で再実行 |
| 3 | off (A) | m5a-12500-off-r2 | 127.012 | 36.204 | 408,172 | load1 窓 5.11→3.78 |
| 4 | on (B) | m5a-12500-on-r2 | 124.167 | 36.170 | 407,657 | load1 窓 3.23→2.49 |
| 5 | off (A) | m5a-12500-off-r3 | 125.321 | 36.180 | 405,121 | load1 窓 2.51→2.22 |
| 6 | on (B) | m5a-12500-on-r3 | 123.300 | 36.072 | 408,826 | load1 窓 2.16→1.77、on-r3 は絶対 guard 帯下限 36.102 を割り込む |
| **mean** | **off** | — | **126.954** (σ 1.264%) | **36.2133** | 406,897 | — |
| **mean** | **on** | — | **126.884** (σ 4.314%) | **36.1327** | 407,128 | — |
| **Δ** | — | — | **-0.055%** (null) | **-0.0807 dB** | +0.06% | — |
**wallclock**: Δ -0.055% は有意閾値 max(2σ_off,1%)=2.528% に遠く届かない **null** (効果なしとも効果ありとも言えない、σ_on が大きいことによる検出力不足)。**PSNR guard (決定的)**: on mean 36.1327 dB は off mean 36.2133 dB − 0.05 dB = 36.1633 dB を **下回る** (Δ -0.0807 dB)。3 pair 全てで on
`p3-kernel-share-post-s3` (M1, post-S3 share) は ssim の share を **11.80%** と報告している。§3 の isolated-label screen (submission=per_kernel、float4_rcp の ts_ssim_fwd_grad が per_channel 比 -20.8%) をこの share に単純に適用すると、予測される wallclock 寄与は 11.80% × 20.8% ≈ **-2.45%** — 本 gate の有意閾値 (2.528%) とほぼ同水準である。milestone 本文が挙げた期待 delta (-4〜6%) は、この budget share から見ると約 2 倍楽観的だったことになる。加えて chained (production) 経路では ssim/l1combine/backward が 1 CB に統合され encoder 間 hazard 直列化のオーバーヘッドが乗るため、isolated-label (per_kernel mode) の効果がそのまま production の wallclock に転写されるとは限らない。今後 M5a 系を revisit するなら n=5 (M2 Tier1 の再 gate と同様の理由 — 効果量が gate の検出力ぎりぎりの領域にあるため) を推奨する。
この finding が観測された / 言及している実験 run。