[{"data":1,"prerenderedAt":476},["ShallowReactive",2],{"finding:p3-backward-audit":3,"finding-runs:p3-backward-audit":278,"finding-related:p3-backward-audit":279},{"meta":4,"impact":54,"sections":60},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":27,"commit":28,"branch":29,"config_paths":30,"related_runs":44,"related_findings":45},"p3-backward-audit","backward_raster kernel 監査 — per-pixel 構造保持の残余候補 6 件、atomic emit lane 分散 (M8) を実装するも 3\u002F3 pair で小さい regression (NO-GO)","per-splat backward (brush #401 型、M3\u002FM3b) が 2 版とも regression で打ち切られたあと、\u003Ccode>rasterize_backwards.metal\u003C\u002Fcode> の per-pixel 構造を保ったまま \u003Ccode>backward_raster\u003C\u002Fcode> (kernel 内最大 share 40.07%) をさらに削れる余地を audit した。既存の勝者施策 (SIMD reduction \u002F W1a warp sparse skip \u002F last_contributor) と禁忌リスト (Tg staging -79% busy、f16、SIMD prefix、reduction) を踏まえると、\u003Cstrong>bit-exact-class の候補で harness の分解能 (~1%、M2 Tier1 \u002F M5a で確認済みの床) を超えるものは見つからなかった\u003C\u002Fstrong> (bit-inexact な reciprocal division 候補 1 件は AIR レベルで headroom があると確認できたが実測は持ち越し)、というのが本 audit の主結論。最有力候補 (\u003Ccode>rasterize_backwards_simd\u003C\u002Fcode> の 9 atomic emit を lane 0 だけでなく lane 0..8 の 9 lane に分散する M8) を実装し \u003Ccode>BackendConfig.raster_backward_atomic\u003C\u002Fcode> (default \u003Ccode>lane_zero\u003C\u002Fcode>) で flag-gate した。正しさは新規 unit test 2 本 (bit-exact) と実 checkpoint (408,469 splats) の \u003Ccode>splat bench --parity\u003C\u002Fcode> で検証 — 後者は既存 backward が持つ (原因未確定の) self-noise と \u003Cstrong>候補の diff が統計的に見分けがつかない\u003C\u002Fstrong>ことを確認し、spread が新しい誤差源を持ち込んでいないことを示した。\u003Cstrong>性能は whole-iteration・backward kernel 単体 gpu_ms のどちらでも一貫して遅い側\u003C\u002Fstrong> (whole-iteration median ms\u002Fiter: off 13.586 → on 13.765、\u003Cstrong>+1.32%\u003C\u002Fstrong>、GPU busy +2.02%；\u003Ccode>ts_backward_raster\u003C\u002Fcode> gpu_ms\u002Fcall: off 4.2016 → on 4.3670ms、\u003Cstrong>+3.94%\u003C\u002Fstrong>) — \u003Cstrong>NO-GO\u003C\u002Fstrong>、default は \u003Ccode>lane_zero\u003C\u002Fcode> のまま。12.5k full gate 用 config 6 本 (\u003Ccode>2026-08-30-bwd1-12500-{off,on}-r{1,2,3}.toml\u003C\u002Fcode>) は作成のみ (`splat check` で deserialize 確認済み)、明確な regression のため実行はしなかった。","backward_raster kernel 監査 · M8 atomic emit lane 分散","2026-08-30","stable","experiment","negative",[14],1,[16,17,18,19,20,21,22,23,24,25,26],"backward-raster","kernel-audit","atomic-float","simd-sum","parity","self-noise","backend-config","regression","lego","per-pixel","m8","p3-backward-audit (段1: 監査 \u002F 段2: M8 atomic emit lane 分散の実装+gate screen)","4f523c9","worktree-agent-a661641378143bda6",[31,32,33,34,35,36,37,38,39,40,41,42,43],"splat\u002Fconfigs\u002F2026-08-30-bwd1-checkpoint-gen-12500.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-bench-off.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-bench-on.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-bench-off-perkernel.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-bench-on-perkernel.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-parity-on-candidate.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-parity-off-selfcheck.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-off-r1.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-off-r2.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-off-r3.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-on-r1.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-on-r2.toml","splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-on-r3.toml",[],[46,47,48,49,50,51,52,53],"p3-per-splat-backward","p3-per-splat-backward-tg256","p3-kernel-share-post-s3","p2-w1-warp-sparse-skip","p2-last-contributor","p3-tier1-bit-exact","p3-ssim-float4","p2-flag-revisit-sweep",{"summary":55,"rank":56,"verdict":57,"delta_psnr":58,"delta_wallclock":59},"backward_raster (per-kernel share v2 で 40.07%、単独最大) を per-pixel 構造を保ったまま削る候補を 6 件監査した (段 1)。すでに勝者化済みの施策 (SIMD group reduction \u002F W1a warp sparse skip+exp-skip \u002F last_contributor 早期終了) と禁忌リスト (Tg staging、f16、SIMD prefix、reduction) を除くと、残る候補はいずれも大きい Δ を期待できず、harness の実測分解能 (~1%、M2 Tier1 が -1.11% を「判定不能」、M5a が -0.055% を「null」と判定した床) 前後に収まる可能性が高いという見立てになった。最有力候補として選んだのは \u003Cstrong>M8: `rasterize_backwards_simd` の 9 atomic emit を lane 0 の 1 lane だけでなく lane 0..8 の 9 lane に分散発行する\u003C\u002Fstrong>変更 — `simd_sum` が 9 成分の合計を全 32 lane に broadcast する性質を使い、emit する (address, value) の集合を一切変えずに発行 lane だけ変える (新しい算術を持ち込まない「弱い意味で bit-exact」な変更)。`BackendConfig.raster_backward_atomic` (`lane_zero` default \u002F `spread_lanes`) で flag-gate し、専用 PSO は現行 default combo (`Simd` + `LastContributor` + `WarpAny`) にのみ追加した (他 combo は validate warning 付きで silent fallback、既存の `raster_backward_sparse` と同じ規約)。**正しさ**: 24-splat 合成 tile の単一 pixel fixture で bit 一致 (新規 test 2 本、`backward_atomic_spread_byte_equality_single_pixel` \u002F `_parity_simd`)、実 checkpoint (12500 iter 生成、408,469 splats、PSNR 36.202 dB) での `splat bench --parity` は候補比較が FAIL することがあるが、**同じ config を自分自身と比較する self-check でも全く同じ頻度・同じ max_abs_diff (通常時 5.245e-5 \u002F 稀に 1.469e-4) で FAIL\u002FPASS する**ことを確認し、これが M8 固有の誤差でないことを実証した (発生機序自体は atomic 順序 self-noise \u002F `sorted_idx` tie-order 非決定性のどちらとも確定できておらず、§4 callout に切り分けの詳細を記す)。**性能 (whole-iteration)**: 短時間 replay bench (12.5k 相当 checkpoint、iters=50×repeats=3、pipelining=off、production regime = submission\u002Fforward_submission ともに `chained`) を off\u002Fon 交互 3 pair 実施したところ、**3\u002F3 pair で on が遅い**(median ms\u002Fiter: 13.564→13.731 \u002F 13.600→13.812 \u002F 13.595→13.753、平均 13.586→13.765 = **+1.32%**、GPU busy 平均 10.752→10.969 ms\u002Fiter = **+2.02%**)。**性能 (backward kernel 単体 gpu_ms)**: production regime では `ts_backward_raster` の `gpu_ms` が非ブロッキング harvest の帰属漏れで 0 に落ちる (既知の限界、`docs\u002Farchitecture\u002Fbackend-and-compiler-conventions.md` §4) ため、p3-kernel-share-post-s3 C1 と同じ `submission=per_kernel`\u002F`forward_submission=per_stage` regime で同一 checkpoint を計測した。**`ts_backward_raster` gpu_ms\u002Fcall: off 4.2016ms → on 4.3670ms = +3.94%** (150 call = 3 repeats × 50 iters、両 arm とも n=3 の repeat 内 σ ≤0.4%) — whole-iteration の +1.32%\u002F+2.02% が「kernel 自体が遅くなったこと」に直接帰属できることを、share からの推論ではなく実測で確認した。advisor が指摘していた「lane 0 の 9 atomic は既にハードウェアがパイプライン化している可能性があり、spread の win は nil かもしれない」という懸念が的中し、むしろ select chain のオーバーヘッドがわずかに上回った形の **小さいが一貫した regression**。**NO-GO、default は `lane_zero` のまま変更しない**。12.5k full gate 用 config 6 本は `splat check` で deserialize 確認済みだが、bench screen の時点で明確な regression のため実行しなかった。`cargo build --release` + `cargo test --workspace --release` (全 175 test、新規 2 本含む) は全 pass、default 動作 (既存挙動) は無変更。","medium","m8-atomic-spread-correct-but-slower-not-recommended-for-default \u002F audit-finds-no-headroom-above-harness-floor","N\u002FA (bench replay は 1 checkpoint に対する forward+backward+adam 反復であり学習軌道ではない。12.5k gate は regression 判明のため未実施)","**whole-iteration replay bench 3 pair 交互 (実 checkpoint 408,469 splats、800×800、iters=50×repeats=3、pipelining=off、production regime = submission\u002Fforward_submission ともに chained、`configs\u002F2026-08-30-bwd1-bench-{off,on}.toml`)**: median ms\u002Fiter off→on = 13.564→13.731 (+1.23%) \u002F 13.600→13.812 (+1.56%) \u002F 13.595→13.753 (+1.16%)、平均 13.586→13.765ms\u002Fiter = **+1.32%**。GPU busy ms\u002Fiter 平均 10.752→10.969 = **+2.02%**、sync-tax はほぼ不変 (2.83ms\u002Fiter 前後、3 pair とも)。σ は各 repeat 内 n=3 で 0.03〜1.19%。**backward kernel 単体 (`ts_backward_raster` gpu_ms、per_kernel\u002Fper_stage 計測 regime、`configs\u002F2026-08-30-bwd1-bench-{off,on}-perkernel.toml`、150 call = 3 repeats×50 iters)**: off **4.2016 ms\u002Fcall** → on **4.3670 ms\u002Fcall** = **+3.94%**。この regime の wallclock (off 15.191ms\u002Fiter, GPU busy 69.0% \u002F on 15.361ms\u002Fiter, busy 69.4%) は non-production 専用 (busy が低く比較に使えない、上記 production regime の値が主) だが、`ts_backward_raster` gpu_ms は kernel 単体の直接計測として有効。",[61,64,67,88,90,152,157,159,170,172,197,200,202,246,259,262,264,269,271],{"type":62,"text":63},"lead","per-splat backward (brush PR #401 型) の 2 版 (M3\u002FM3b) が per-kernel share GO 判定 (backward_raster ≥25%) を受けて実装されたにもかかわらず、いずれも default (per_pixel: Simd+WarpAny+LastContributor) 比 +33〜39% の regression で打ち切られた (finding: p3-per-splat-backward \u002F -tg256)。post-M4\u002FA7 の per-kernel share v2 でも backward_raster は 40.07% まで share を伸ばしており (分母の radix 縮小による相対効果が主、絶対 gpu_ms 自体はほぼ不変)、依然として単独最大ブロックである。本 finding は「transpose (per-splat 化) 抜きで、per-pixel 構造を保ったまま backward_raster を削れる余地はまだあるか」を監査し (段 1)、最有力候補 1 件を実装して gate screen まで行った (段 2) 記録である。",{"type":65,"text":66},"heading","1. 監査 — 観点別 (a)〜(f) の考察",{"type":68,"items":69},"kv",[70,73,76,79,82,85],{"key":71,"value":72},"(a) atomic 発行数削減","`rasterize_backwards_simd` は既に `simd_sum` で 32 lane を 1 SIMD group 単位に集約してから 1 atomic (256→8 atomic\u002Fsplat、#5.33 M-2 採用) + W1a `simd_any` による all-invalid warp の静的 skip、を実施済み。threadgroup 全体まで畳む `_tg` variant (1 atomic\u002Fsplat) は `threadgroup_barrier` コストが上回り既に敗退 (#5.33c 禁忌)。残っていた余地は「9 atomic を lane 0 だけで発行している低占有」で、これが M8 (段 2 で実装、後述)",{"key":74,"value":75},"(b) 再計算 vs. 保存","forward の中間値 (per-splat per-pixel の alpha\u002FT) を保存して backward の再計算を減らす案は、必要な保存量が `O(pixels × splats-per-tile)` — 800×800 image で tile あたり数百 splat が典型のこの workload では GB 級になり非現実的。msplat \u002F Inria 3DGS 原典も同じ理由で replay 方式を採る。**却下 (infeasible)**、候補として立てない",{"key":77,"value":78},"(c) last_contributor 早期終了の粒度","現行 default は 2 層構造で既にほぼ最適: `Simd` kernel は `simd_max(my_stop)` で SIMD group 単位に loop bound を縮め (lockstep 維持のため per-pixel には出来ない)、その上で W1a `simd_any(contrib)` が「bound と実際の stop の間、全 lane が寄与ゼロの iteration」を静的に skip する。これより細かい粒度 (sub-warp) にするには SIMD reduction の lockstep を諦めて atomic-per-smaller-group に戻る必要があり、これは `Original` 系への回帰 (#5.33 で敗退済み) と同型。**追加の候補なし、現状が実質的な天井**",{"key":80,"value":81},"(d) memory layout (AoS\u002FSoA)","`Splat2D` を「sigma\u002Falpha 計算に要る hot field (xy\u002Fconic\u002Fcolor_a)」と「v_rgb にしか要らない cold field (rgb)」に分割する案を検討したが、**期待 Δ は低いと判断し候補から外した**: `range`\u002F`end` は threadgroup (`range`) または SIMD group (`end`、lockstep 用) 単位で uniform なので、ある iteration `i` において loop 内の全 lane は**同じ** `sorted_idx[i]` と**同じ** `splats[splat_idx]` を読む — 1 threadgroup あたり 1 回の 36-byte L1 読み出しが全 lane に broadcast されるだけで、AoS→SoA 分割で削れるのは「broadcast 済みの L1 read が 36→24 byte になる」程度であり、GPU の L1 transaction 粒度 (通常 32\u002F64\u002F128 byte 単位) を考えると実質的な transaction 数は変わらない可能性が高い。producer (`project.rs`) と consumer (forward kernel) 両方に触る高 effort に対して見合わない",{"key":83,"value":84},"(e) register pressure \u002F occupancy","静的ツールでの検証には限界があった。`xcrun metal -O3 -std=metal3.1 -c` でのオフライン compile はエラー・warning 無しで通ったが (function constant 未解決のため specialization 前の状態)、AIR は register 割り当て前の LLVM IR であり、実際の register 割り当ては driver JIT が on-device で行うため、**この環境 (Xcode GPU Frame Capture 不可) では spill \u002F occupancy の直接観測ができない**。既存 `[backend] profile = true` の PSO reflection ログ (`maxTotalThreadsPerThreadgroup`) は 256-thread floor の充足有無しか見せず、これも `docs\u002Farchitecture\u002Fbackend-and-compiler-conventions.md` 自身が既知の射程漏れ (D-2) として記録済みの限界と同じ。**ツール限界として記録、追加候補は立てられなかった**",{"key":86,"value":87},"(f) dL\u002Fdcolor の SH 次数依存分岐","`rasterize_backwards.metal` は SH 評価済みの RGB (`Splat2D.color_r\u002Fg\u002Fb`、project 段階で SH 係数から評価済み) を受け取るだけで、SH 自体の勾配 (`sh_coeffs_grad`) は `project_backwards` (per-kernel share 3.61%) 側の責務。**本 kernel には該当なし (N\u002FA)**",{"type":65,"text":89},"2. 候補表 (上位 5 件 + 既存の敗退\u002F禁忌の参考枠)",{"type":91,"columns":92,"align":99,"rows":101},"table",[93,94,95,96,97,98],"候補","観点","期待 Δ (backward 単体)","bit-exact 性","工数","既知の敗因との衝突",[100,100,100,100,100,100],"left",[102,109,116,123,130,137,142,146],[103,104,105,106,107,108],"**M8: atomic emit lane 分散** (実装・gate screen 済み)","(a)","不明瞭 — lane 0 の 9 atomic は既に HW がパイプライン化している可能性 (advisor 指摘)。実測: **+1.3%〜+2.0% regression**","弱い意味で bit-exact (同一 (addr,value) 集合、発行 lane と順序のみ変化、既存の atomic 順序非決定性の範疇)","低 (shader 1 file + Rust 配線)","衝突なし (Tg staging\u002Freduction とは別物) だが実測 NO-GO",[110,111,112,113,114,115],"`one_m_alpha` 除算 2 回 → reciprocal 1 回 + 乗算","(e) ALU throughput","**headroom 確認済み、gain は未実測**。function constant を default 値 (lc=true, sparse=true, spread=false) に固定した AIR (`xcrun -sdk macosx metal -O3 -std=metal3.1 -ffast-math -S`) を確認したところ、`rasterize_backwards_simd` 本体に `fdiv fast \u003C3 x float>` (= `after_me \u002F one_m_alpha`) と `fdiv fast float` (= `dL_dA * T_final \u002F one_m_alpha`) の **2 命令が残っており、同一 denominator への CSE (reciprocal 共有) は起きていない** — 「fast-math が既にやっているので no-op」という当初の懸念は LLVM IR レベルでは反証された。ただし最終 GPU ISA への lowering は on-device compiler 依存でこの環境では観測不能なため、**理論的な headroom はあるが実測 gain は未確認**","bit-inexact (rounding が変わる、rel ~1e-5 オーダー想定)","低","**p3-ssim-float4 と同型の衝突**: `float4_rcp` は ssim 単体 -20.8% でも 12.5k PSNR guard に抵触 (3\u002F3 分離、rel 8e-5 が効いた) して不採用。backward は Adam に直結するので同種リスクがより重い",[117,118,119,120,121,122],"splat read の software prefetch (次 splat を先読みしつつ現 splat を計算)","(e) memory latency hiding","不明瞭 — 256-thread\u002Ftile で occupancy は既に高く (busy 79〜91%)、TLP がレイテンシを隠せている可能性が高い","bit-exact (loop-carried な T\u002Fpix_acc の演算順序は不変、読み出しの順序だけ変更)","低〜中(loop 構造の手動 unroll)","衝突なし、ただし priori に効果を見積もれず prototyping が要る",[124,125,126,127,128,129],"`Splat2D` AoS→SoA 分割 (hot\u002Fcold field 分離)","(d)","低 (§1(d) の broadcast-read 論証参照 — L1 は既に broadcast 済みで削減余地が薄い)","bit-exact","**高** (producer `project.rs` + forward kernel consumer の両方に触る)","衝突なし、ただし工数\u002F期待 Δ 比が悪い",[131,132,133,134,135,136],"last_contributor の粒度を sub-warp まで細分化","(c)","無し — 現行 (simd_max + warp_any) が既に理論上の天井に近い。細分化には SIMD lockstep 放棄 = atomic-per-small-group への回帰が必要","N\u002FA (実装しても Original 系への逆行)","N\u002FA","**#5.33 (Original 敗退) と同型の衝突** — 追加候補として立てず",[138,104,139,127,140,141],"(参考) threadgroup 全体 reduction (`_tg` variant の再挑戦)","既知: +63.6% (S2 後再判定)","—","**#5.33c 禁忌、再挑戦せず**",[143,125,144,127,140,145],"(参考) backward への Tg staging (splat を threadgroup memory に事前ロード)","既知: busy -79%","**禁忌リスト明記 (bwd-tg)、再挑戦せず**",[147,148,149,150,140,151],"(参考) per-splat transpose (brush #401 型、M3\u002FM3b)","構造転換","既知: +34.1% \u002F +32.8%","PASS (abs\u002Frel 1e-4)","**M3\u002FM3b で 2 回敗退、探索打ち切り済み**",{"type":153,"label":154,"variant":155,"text":156},"callout","audit の主結論 — bit-exact-class の候補で harness 分解能を超えるものは残っていない (bit-inexact な候補 1 件は理論的な headroom があるが未実測)","warning","M2 Tier1 (A1-A4 まとめ) は 12.5k n=5 で Δ -1.11% を「wallclock 効果量 ≤1% で分解能未満、判定不能」として棄却し、M5a (SSIM float4_rcp) は 12.5k で Δ -0.055% を「null」と判定した。この 2 つの実測が、本 harness (12.5k Lego、n=3〜5) が確実に検出できる下限が概ね 1% 前後であることを示している。段 1 の 6 候補のうち、(b)(c)(f) は候補として成立せず、(d) は broadcast-read 論証により低 payoff、(a) (M8) は実測で harness の床未満どころか **逆方向 (+1.3% whole-iteration \u002F +3.94% backward kernel 単体)** だった。**(e) reciprocal division は唯一「headroom が無いこと」を実測で反証できなかった候補** — AIR レベルで 2 fdiv が残っていることを確認したが (未 CSE)、bit-inexact な変更であり p3-ssim-float4 と同型の PSNR guard 抵触リスクを持つため、実装・gate までは本 session のスコープ外とした。**正確には「per-pixel 構造を保ったまま bit-exact-class で大きく効く候補はもう残っていない」が本 audit の実測的な結論** (bit-inexact な候補は未走査のまま 1 件残る)。次に有意な Δ を狙うなら per-pixel 構造そのものを離れる (= per-splat 系、既に 2 回敗退) か、reciprocal division の実測 (bit-inexact、PSNR guard リスクあり) か、禁忌リストの改訂 (8-bit radix 再挑戦の J1 判断待ちと同型の意思決定) のいずれかが必要になる。",{"type":65,"text":158},"3. 実装した候補 — M8 atomic emit lane 分散",{"type":68,"items":160},[161,164,167],{"key":162,"value":163},"変更箇所","`splat\u002Fshaders\u002Fbackward\u002Frasterize_backwards.metal` (`rasterize_backwards_simd` のみ、function constant `USE_ATOMIC_SPREAD_FC` index 2 で specialize)、`splat\u002Fcrates\u002Fsplat-metal\u002Fsrc\u002Fkernels\u002Frasterize.rs` (`RasterBackwardAtomicKind` enum + PSO 1 本追加 + `backward`\u002F`backward_from_buf` シグネチャ拡張)、`splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002F{config.rs,trainer.rs}`、`splat\u002Fcrates\u002Fsplat-cli\u002Fsrc\u002Futil.rs` (配線)",{"key":165,"value":166},"発想","`simd_sum` は reduction 結果を**全 32 lane に broadcast**する (partial sum を返す `simd_prefix_*` とは異なる) ため、9 成分の合計値はどの lane も既にレジスタに持っている。従来 (`LaneZero`) は 9 回の `atomic_fetch_add` をすべて `simd_lane_id == 0` の 1 lane が発行する — SIMD グループは常に 32 lane 分の発行資源を lockstep で持つので、これは「1\u002F32 lane しか active でない SIMD 命令」を 9 回連続発行するのと同義。`SpreadLanes` は 9 成分を lane 0..8 の 9 lane に 1 個ずつ割り当て、9 回の低占有発行を 1 回の (9\u002F32 lane active な) 発行に畳む",{"key":168,"value":169},"PSO 行列の範囲","`(BackwardKind::Simd, RasterBackwardRangeKind::LastContributor, RasterBackwardSparseKind::WarpAny)` — 現行 default combo — にのみ spread 版 PSO を追加した。他の combo (FullRange や sparse=Off) には広げていない (default combo の A\u002FB 以外に使う予定がないため、PSO 行列を 4→8 に倍化するコストに見合わないと判断)。他 combo で `spread_lanes` を指定すると `BackendConfig::validate` が warning を出し、黙って `lane_zero` 相当の PSO にフォールバックする (`raster_backward_sparse` の Simd 専用扱いと同じ規約)",{"type":65,"text":171},"4. 正しさの証拠",{"type":91,"columns":173,"align":177,"rows":178},[174,175,176],"test \u002F 手法","何を pin するか","結果",[100,100,100],[179,183,186,189,193],[180,181,182],"`backward_atomic_spread_byte_equality_single_pixel`","dldr を 1 pixel だけ非ゼロにして atomic 順序の影響を消した条件で `LaneZero` vs `SpreadLanes` が bit 一致","**PASS**",[184,185,182],"`backward_atomic_spread_parity_simd`","24 splat 重畳 fixture (multi-pixel) で `abs\u002Frel 1e-4` dual-threshold (既存 W1a parity test と同一形式)",[187,188,182],"`rasterize_psos_compile`","MSL コンパイル + 全 PSO 構築 (新規 `pso_backward_simd_lc_sparse_spread` 含む)",[190,191,192],"workspace 全体 (`cargo test --workspace --release`)","splat-core 7 + splat-io 1 + splat-metal 93 (新規 2 本含む) + splat-train-v1 76、default 挙動 (LaneZero) が無変更であること","**PASS \u002F failure 0 (2 件 ignore は既存の baseline 専用 test で本変更と無関係)**",[194,195,196],"`splat bench --parity` (実 checkpoint 408,469 splats、`configs\u002F2026-08-30-bwd1-bench-off.toml` vs `-parity-on-candidate.toml`)","means\u002Flog_scales\u002Frot_quats\u002Fraw_opacities\u002Fsh_coeffs の全 grad tensor、tolerance は既存 backward variant 比較と同一の `abs=1e-4 rtol=1e-4`","**intermittent FAIL (means_grad, 1\u002F1,225,407 要素)** — 下記 callout 参照、既存 self-noise と同型と判明",{"type":153,"label":198,"variant":155,"text":199},"`splat bench --parity` の intermittent FAIL は M8 固有の誤差ではない — ただし正確な発生機序 (atomic 順序 vs sorted_idx tie-order) は未確定","実 checkpoint (408,469 splats) での `--parity` は複数回実行すると \u003Cstrong>PASS することも FAIL することもある\u003C\u002Fstrong> (`means_grad` の max_abs_diff が通常時 5.245e-5 で PASS、稀に厳密に \u003Cstrong>1.469e-4\u003C\u002Fstrong> まで跳ねて `abs=1e-4` を超え FAIL)。原因を切り分けるため \u003Ccode>configs\u002F2026-08-30-bwd1-parity-off-selfcheck.toml\u003C\u002Fcode> (baseline = \u003Ccode>lane_zero\u003C\u002Fcode> と\u003Cstrong>全く同一\u003C\u002Fstrong>の `[backend]`) を candidate に指定し、\u003Cstrong>同一 config を自分自身と比較\u003C\u002Fstrong>する self-check を実施したところ、\u003Cstrong>M8 (spread vs lane_zero) と全く同じ頻度・全く同じ max_abs_diff (通常時 5.245e-5 \u002F 稀に 1.469e-4) で FAIL\u002FPASS した\u003C\u002Fstrong> — \u003Cstrong>これは M8 固有の誤差ではない\u003C\u002Fstrong>ことの直接証拠になる (同一 kernel を自分自身と比較しても同じ現象が起きるため)。\u003Cstrong>ただし発生機序は 2 通り考えられ、切り分けられていない\u003C\u002Fstrong>: 6 回の試行 (self-check 3 回、spread-check 3 回) は {PASS: 5.245e-5} か {FAIL: 1.469e-4} という \u003Cstrong>離散的な 2 値\u003C\u002Fstrong>しか観測せず、連続的な summation-order noise (atomic 加算の実行順序が run ごとに変わることによる浮動小数点非結合性、file 冒頭 C7 注記) が単独の原因なら本来は連続的な分布になるはずで、ちょうど 2 値に固定されるのは不自然。一方、`--parity` の出力は毎回 `sorted_idx` が 2086〜2321 要素 (0.21〜0.24%) で \u003Cstrong>INFO (not gated) の tie-order 非決定性\u003C\u002Fstrong>を報告しており、これは既知の radix sort tie-break の非決定性 (p3-per-splat-backward 等で既出) で、atomic 加算順序より\u003Cstrong>大きな摂動\u003C\u002Fstrong> (ある splat の compositing 順序そのものが変わりうる) になり得る。tie flip で特定の splat が `raw_alpha \u003C 0.999` や `alpha >= 1\u002F255` の分岐境界を跨げば、離散的な 2 値(「境界を跨いだ run」と「跨がなかった run」)が生まれても不思議ではない。**本 finding は発生機序を atomic 順序 self-noise と sorted_idx tie-order のどちらか (あるいは両方) に確定できていない** — どちらであっても self-check が同じ現象を再現している以上 \u003Cstrong>M8 の correctness には影響しない\u003C\u002Fstrong>という結論は変わらないが、「atomic 順序 self-noise の tail が 1e-4 を超える」という主張は unit-level の bit-exact test (developer が完全に制御できる fixture、こちらは正しさのより強い直接証拠) ほど確立していない点に注意 (§7 に次段の切り分け手順を記載)。",{"type":65,"text":201},"5. 性能 — replay bench 3 pair、3\u002F3 で regression",{"type":91,"columns":203,"align":211,"rows":213},[204,205,206,207,208,209,210],"pair","off (lane_zero) median ms\u002Fiter","on (spread_lanes) median ms\u002Fiter","Δ wallclock","off busy ms\u002Fiter","on busy ms\u002Fiter","Δ busy",[100,212,212,212,212,212,212],"right",[214,222,230,238],[215,216,217,218,219,220,221],"1","13.564","13.731","+1.23%","10.736","10.953","+2.02%",[223,224,225,226,227,228,229],"2","13.600","13.812","+1.56%","10.756","10.991","+2.18%",[231,232,233,234,235,236,237],"3","13.595","13.753","+1.16%","10.765","10.963","+1.84%",[239,240,241,242,243,244,245],"**平均**","**13.586**","**13.765**","**+1.32%**","**10.752**","**10.969**","**+2.02%**",{"type":91,"columns":247,"align":252,"rows":253},[248,249,250,251],"計測 (backward kernel 単体、`ts_backward_raster`)","off (lane_zero)","on (spread_lanes)","Δ",[100,212,212,212],[254],[255,256,257,258],"gpu_ms\u002Fcall (150 call = 3 repeats × 50 iters)","4.2016","4.3670","**+3.94%**",{"type":153,"label":260,"variant":155,"text":261},"NO-GO — spread は whole-iteration でも backward kernel 単体 gpu_ms でも一貫して遅い、default は lane_zero のまま","advisor は実装前に「lane 0 の 9 atomic は既に個別に (依存関係の無い independent instruction として) パイプライン化されている可能性があり、spread の win は nil かもしれない」と明示的に caveat していた。実測はさらに一歩進み、\u003Cstrong>nil どころか 3\u002F3 pair で一貫した小さい regression\u003C\u002Fstrong> (whole-iteration wallclock +1.32%、GPU busy +2.02%) になった。これが「backward 以外の何かが遅くなった」ことによる見かけの regression でないことは、\u003Ccode>ts_backward_raster\u003C\u002Fcode> 単体の gpu_ms を per_kernel\u002Fper_stage 計測 regime で直接測ることで確認した (\u003Cstrong>+3.94%\u003C\u002Fstrong>、上表) — whole-iteration の delta は backward_raster share (40.07%) からの推論ではなく、kernel 自体の直接計測に帰属できる。推測される原因: `simd_lane_id \u003C 9u` の select chain (8 段の三項演算子) を \u003Cstrong>32 lane 全員が\u003C\u002Fstrong> (23 lane は結果を使わないマスク済み実行として) 評価する必要があり、この命令列コストが「lane 0 だけが 9 回 atomic を発行する」ことの低占有コストを上回った可能性がある (未検証の仮説、§7 参照)。\u003Cstrong>`RasterBackwardAtomicKind` の default は `LaneZero` のまま変更しない\u003C\u002Fstrong>。",{"type":65,"text":263},"6. gate config (作成のみ、未実行)",{"type":265,"items":266},"list",[267,268],"`splat\u002Fconfigs\u002F2026-08-30-bwd1-12500-off-r{1,2,3}.toml` \u002F `-on-r{1,2,3}.toml` — `splat\u002Fconfigs\u002F2026-08-30-final-12500-r{1,2,3}.toml` (M7 最終スタック gate) をベースに `[backend] raster_backward_atomic` を明示しただけの差分 (他の全 flag は完全に同一)。6 本とも `splat check --config \u003Cpath>` で deserialize + validate PASS 確認済み","**実行はしなかった** — 段 2 の短時間 replay bench (n=3 alternating) の時点で 3\u002F3 pair 一貫した regression が出ているため、12.5k full run (各 arm 2 分強 × 6 run = 12〜15 分の GPU 専有) を追加で消費する前に本 finding を残す方を優先した。regression の符号が覆る可能性は低いと考えるが、main が念のため 12.5k で再確認したい場合はこの 6 config でそのまま `splat train` を回せる状態にしてある",{"type":65,"text":270},"7. 未解決点・次段への引き継ぎ",{"type":265,"items":272},[273,274,275,276,277],"**候補 2 (reciprocal division) は fdiv 命令数を確認済み・実測は未実施** — function constant を default 値に固定した AIR (`xcrun -sdk macosx metal -O3 -std=metal3.1 -ffast-math -S`) で `rasterize_backwards_simd` 本体を確認したところ `fdiv fast` が 2 命令残っており (CSE 未実施)、理論的な headroom は確認できた。次の一手は実装 (`one_m_alpha` の reciprocal を 1 回計算して 2 箇所で乗算に置換) + unit parity + 12.5k gate (PSNR guard、p3-ssim-float4 と同じ懸念があるため要注意) — 本 session のスコープ外として持ち越し","**候補 3 (splat read の software prefetch) は未 prototype** — GPU busy が既に 79〜91% と高く TLP がレイテンシを隠せている可能性が高いという定性的な予想はあるが、実装して bench するまで gain の符号すら分からない","**register spill \u002F occupancy の直接観測ができる環境が無い** — Xcode GPU Frame Capture 相当のツールがこの (headless) 環境には無く、AIR (LLVM IR、register 割り当て前) の静的検査では (e) の audit を完了できなかった。GUI 環境がある session であれば `rasterize_backwards_simd` の実際の register 使用数・occupancy% を直接見て (e) を再監査する価値がある","**`splat bench --parity` の intermittent FAIL の発生機序が未確定** (§4 callout) — atomic 順序 self-noise と `sorted_idx` tie-order 非決定性のどちらが (あるいは両方が) 離散的な 2 値 (5.245e-5 \u002F 1.469e-4) を作っているかを切り分けられていない。切り分け方法の一案: tie-order の影響を消すため単一 pixel だけ非ゼロにした dldr で同じ full-scale checkpoint を比較する (unit test の `_byte_equality_single_pixel` と同じ手法をこの規模に適用)。もし tie-order が主因なら、これは M8 と無関係な既存の radix sort 非決定性の問題として別 finding に切り出す価値がある","**M8 の実装・flag・test は資産として残す** — default は変更していないので既存挙動への影響はゼロ。将来 (e) の register 分析や別ハードウェア世代で再評価する場合の土台として `RasterBackwardAtomicKind::SpreadLanes` はそのまま使える",[],[280,308,324,340,368,409,435,456],{"id":48,"title":281,"date":9,"status":10,"polarity":282,"category":283,"axes":284,"tags":286,"task_code":298,"related_runs":299,"delta_psnr":302,"delta_wallclock":303,"rank":304,"verdict":305,"impact_summary":306,"detail_path":307},"M1\u002Fv2 — post-S2\u002FS3 per-kernel share 再計測: backward_raster 33.9%→40.1% (M4\u002FA7 後)、radix 26.4%→12.0% (M4 の絶対削減を反映) → M3 GO 判定は不変。C2 残差 4.54s は driver latency \u002F CB gap に分解不能 (計装欠如、file:line 提案のみ)","mixed","measurement",[14,285],3,[287,288,289,290,291,16,292,293,294,24,295,296,297],"m1","m7","seminar05-milestones","kernel-share","per-kernel-gpu-ms","m3-go-gate","residual-bubble","gputime","post-s2-s3","v2","post-m4-a7","2026-09-seminar05-milestones M1 (C1 per-kernel 再計測 + C2 残差 bubble 帰属)",[300,301],"c1-12500-off-prof","c1v2-12500-off-prof","n=1: 36.087 dB (self-eval val mean, 100 views)。p2-s3 の off\u002Fdepth2 n=3 mean (36.185 \u002F 36.202 dB) の guard 内。本 run は submission=per_kernel\u002Fforward_submission=per_stage という別 regime なので PSNR の直接比較は非対象 (kernel は bit-exact のため理論上は同水準になるはず、というだけの参考値)","train elapsed 205.78s (n=1)。**production baseline (depth2 default, 151.70s) や S3 off baseline (185.21s) と直接比較しない** — per_kernel\u002Fper_stage submission は CB 数が既定の 15〜27\u002Fiter → 15 CB\u002Fiter 超 (最終 15,001 cb from iter1 window 相当) に増え、busy% が 68.9% まで下がる**測定専用 regime**であり、本 run の wallclock 自体に意味はない。意味があるのは kernel 単体の gpu_ms とその share のみ","high","m3-go-backward-raster-33.9pct \u002F c2-instrumentation-gap-proposal-only","M3 (per-splat backward, brush PR #401 型) の GO\u002FNO-GO 閾値「backward_raster share ≥ 25%」を判定した。post-S2\u002FS3 kernel (hierarchical radix scan \u002F resident binning) を submission=per_kernel\u002Fforward_submission=per_stage\u002Fpipelining=off (per-kernel breakdown が測れる唯一の regime) で 1 run 実測した結果 \u003Cstrong>backward_raster (+project_back 統合) share 33.86%\u003C\u002Fstrong> で \u003Cstrong>閾値を大きく超過 → M3 は GO\u003C\u002Fstrong>。\u003Cstrong>share × 0.25 (brush の -25% 主張をそのまま適用したナイーブな期待値) = 8.47%\u003C\u002Fstrong>。ただしこれは本 run の GPU busy (68.9%、production の 91.3% とは別 regime) に対する share であり、production (depth2 default) の wallclock に対する期待 Δ は \u003Cstrong>33.86% × 91.3% × 0.25 ≈ 7.7%\u003C\u002Fstrong> とみるほうが妥当 (kernel 自体の gpu_ms は submission wrapping にほぼ不変という counter-session の事後検証はあるが、n=1 点推定であることと合わせて上限値として扱う)。\u003Cstrong>pre-S2\u002FS3 (counter-session) との比較では share 構成はほぼ不変\u003C\u002Fstrong> (backward_raster 33.6%→33.86%、radix 26.3%→26.40%、rasterize 11.9%→11.64%、adam 13.8%→12.68%、ssim 10.0%→10.95%) — S2 のhierarchical scan は「radix の CB\u002Fwait 数」を畳んだだけで kernel 自体の GPU 時間配分は変えていない、という roadmap の当初の想定を実測で裏づけた。C2 は M0 の並行会計訂正 (encode(B) 4.66→3.41s、残差 3.28→4.54s、nested label 二重計上の是正) を踏まえ、\u003Cstrong>残差 4.54s (depth2 sync-tax の 32%) を driver 投入 latency と CB 間 gap に分解しようとしたが、既存計装 (`gputime.rs`) は `kernelStartTime`\u002F`kernelEndTime` を objc bind しているのみで収集しておらず、per-CB の生 interval 列も外部に露出していない\u003C\u002Fstrong> ため\u003Cstrong>分解不能\u003C\u002Fstrong>と判明した。file:line 付きの追加案を §C2 に残す (実装はしていない、GPU run はこれ以上起動していない)。","\u002Ffindings\u002Fp3-kernel-share-post-s3\u002F",{"id":46,"title":309,"date":9,"status":10,"polarity":282,"category":11,"axes":310,"tags":311,"task_code":317,"related_runs":318,"delta_psnr":319,"delta_wallclock":320,"rank":304,"verdict":321,"impact_summary":322,"detail_path":323},"M3 per-splat backward (brush PR #401 型) — 正しさ PASS (full-scale parity) だが wallclock +34.1% regression",[14,285],[289,312,313,314,315,316,18,20,22,23,24],"m3","per-splat-backward","brush-pr-401","diagonal-scheduling","rasterize-backward","2026-09-seminar05-milestones.md — M3 per-splat backward (brush PR #401 型)",[],"N\u002FA (bench replay は 1 checkpoint に対する forward+backward+adam の反復であり学習軌道ではない。12.5k trainer gate は regression 判明のため未実施)","**bench replay 3-way (Lego final checkpoint 409,660 splats、800×800、iters=50×repeats=3、pipelining=off 固定)**: per_pixel(default: simd+warp_any+lc) **15.354** ms\u002Fiter → per_pixel(unopt: original+full_range+off) **17.681** ms\u002Fiter → per_splat **20.594** ms\u002Fiter。**per_splat vs default = +34.1%、per_splat vs unopt = +16.5%**。GPU busy ms\u002Fiter: 12.499 → 14.914 → 17.753 (per_splat が unopt 比でも +19.0%)。sync-tax ms\u002Fiter は 3 arm とも 2.79〜2.87 でほぼ不変。σ: default 1.08% \u002F unopt 0.31% \u002F per_splat 0.17% (n=3、いずれも安定)。**per_splat 自身の self-noise: max_rel 5.1e-6 (32×32 unit fixture) \u002F 0 (24×24、bit-exact) — atomic 版 Original の self-noise 4.5e-5 の 1\u002F9 以下**","m3-per-splat-backward-correct-but-slower-not-recommended-for-default","M3 の実装フェーズ (spec: docs\u002Fstrategy\u002F2026-09-seminar05-milestones.md) を完了した。**新 kernel `rasterize_backwards_per_splat` を既存 3 kernel (Original\u002FSimd\u002FTg) と並存する別 entry として追加**し、`BackendConfig.backward_scheme` (`per_pixel` default \u002F `per_splat`) で配線した。**正しさの証拠は 2 層で強い**: (1) unit-level — 単一 pixel fixture で `Original`(FullRange,Off) と bit 一致、multi-pixel fixture (32×32\u002F24×24) で `abs\u002Frel 1e-4` dual-threshold PASS (milestone spec の 1e-5 は `Original` 自身の run-to-run self-noise 4.54e-5 より厳しく、達成不能と判明したため 1e-4 に補正)。(2) **trainer 統合レベル** — `splat bench --parity` で実 checkpoint (Lego final、409,660 splats、sh_degree=3) の 1 iteration を実行し、`means\u002Flog_scales\u002Frot_quats\u002Fraw_opacities\u002Fsh_coeffs` の全 grad tensor が **既存 backward variant (Original vs Simd\u002FTg) と同じ `abs=1e-4 rtol=1e-4` tolerance で PASS** (max_abs_diff は 5.8e-8 〜 2.8e-5 の範囲、既存 Tg の文書化済み値 2.811e-5 と同オーダー)。**性能は逆方向の結果、しかも「比較が不公平」では説明できない** — bench replay を **3-way** で取った: per_splat (20.594 ms\u002Fiter) は現行 default (per_pixel = Simd+WarpAny+LastContributor、15.354 ms\u002Fiter) 比 **+34.1%** 遅いだけでなく、**W1a\u002FLastContributor 等の最適化を一切持たない per_pixel (Original+FullRange+Off、17.681 ms\u002Fiter) 比でも +16.5% 遅い**。GPU busy ms\u002Fiter は per_splat 17.753 に対し per_pixel(unopt) 14.914 で、sync-tax はどの arm も ~2.8〜2.9ms\u002Fiter で揃っている — つまり待ち時間の付け替えではなく **transposed loop nest 構造そのものが Apple GPU 上で不利**という決定的な結果になった。brush が報告する backward -25% とは逆方向。**副次効果 (atomic 順序依存の消失) は実証できた** — per_splat 自身の self-noise は max_rel 5.1e-6 (32×32) \u002F 完全 bit-exact (24×24) で、atomic 版 `Original` の self-noise (4.5e-5) の 1\u002F9 以下。**この regression で 12.5k trainer 統合 gate (wallclock Δ \u002F PSNR guard) を見送る判断をした** — gate 用 config 6 本は作成済み (`splat check` で deserialize 確認済み) だが、bench 3-way の時点で明確な regression が出ているため、main が別途 12.5k で確認を望む場合のみ実行すればよい状態で残す。`cargo build --release` + `cargo test --release` (全 workspace 80+70+8 test) は全 pass、per_pixel default (既存挙動) は無変更。","\u002Ffindings\u002Fp3-per-splat-backward\u002F",{"id":47,"title":325,"date":9,"status":10,"polarity":282,"category":11,"axes":326,"tags":327,"task_code":332,"related_runs":333,"delta_psnr":334,"delta_wallclock":335,"rank":336,"verdict":337,"impact_summary":338,"detail_path":339},"M3b per-splat backward 第 2 版 (256-thread threadgroup) — NO-GO 確定 (occupancy 仮説は方向的に正しいが不十分)",[14,285],[289,328,313,329,330,315,316,331],"m3b","occupancy","threadgroup-size","gpu-pending","2026-09-seminar05-milestones.md — M3 追補 (per-splat backward 第 2 版、occupancy 仮説検証)",[],"N\u002FA (bench のみ、12.5k gate 未実施。trainer 統合 parity は5 grad tensor 全て tol 内で PASS — correctness は確認済み)","tg256 vs default per_pixel: **+32.8%** (劣後、bench median 17.994ms vs 13.548ms, n=3)。tg256 vs per_splat v1: -4.22% (occupancy 仮説の方向は正しい)。12.5k gate 未実施 (bench 時点で NO-GO 確定のため)","mid","no-go-confirmed","第 1 版 finding (`p3-per-splat-backward.toml` §5) の occupancy 仮説を検証するため、`rasterize_backwards_per_splat_tg256` (`BackwardSchemeKind::PerSplatTg256`、flag `per_splat_tg256`) を追加した。**アルゴリズム面では第 1 版と一字一句同一** (diagonal scheduling、pixel 側 state 復元、last_contributor を使わない理由、gradient 式) で、変えたのは `PER_SPLAT_BATCH` (= threadgroup thread 数) の 1 パラメータのみ (32→256)。GPU 検証: (1) `rasterize_psos_compile` PASS — `pso_min256` の 256-thread occupancy floor をレジスタ圧迫なしに達成。(2) parity 3 本 (`backward_per_splat_tg256_matches_per_pixel_original` [32×32\u002F24×24]、`_multi_round` [n=600, rounds=3]、`_byte_equality_single_pixel`) 全 PASS。(3) trainer 統合レベル `splat bench --parity` (実 checkpoint 409,660 splats) — 5 grad tensor 全て tol (atol\u002Frtol=1e-4) 内で PASS、`sorted_idx` は既知の非決定性 (0.222% 差、非 gate)。(4) 4-way bench (median ms\u002Fiter, n=3, warmup=10\u002Fiters=50\u002Frepeats=3): per_pixel (default, σ0.59%) **13.548** \u002F per_pixel unopt (σ0.34%) 15.701 \u002F per_splat v1 (σ0.12%) 18.787 \u002F **per_splat_tg256 (σ0.35%) 17.994**。tg256 は v1 比 **-4.22%** — §3 が予告した 3 効果 (barrier 総数 4.5 分の 1 \u002F thread-iteration 効率 1.78 分の 1 悪化 \u002F barrier 単価上昇) の net が僅かに改善方向に振れたことを示し、occupancy 仮説は**方向としては裏付けられた**。しかし default per_pixel 比では **+32.8%** で依然として大幅に劣後しており、M3 系列 (per-splat backward、atomic なし構造) はこの bench harness 上で **NO-GO 確定**。12.5k gate は実施していない (bench の時点で `max(2σ,1%)` の閾値を大幅に超えて劣後することが明白なため、instructions の「遅ければ gate せず終了」に従った)。`BackwardSchemeKind` の default は `PerPixel` のまま、`.rs` は無変更。","\u002Ffindings\u002Fp3-per-splat-backward-tg256\u002F",{"id":52,"title":341,"date":9,"status":10,"polarity":12,"category":11,"axes":342,"tags":343,"task_code":352,"related_runs":353,"delta_psnr":362,"delta_wallclock":363,"rank":364,"verdict":365,"impact_summary":366,"detail_path":367},"M5a A6 SSIM float4 化 — stage1 (float4) は byte-exact 確認済み・PSNR riskゼロ、stage2 (float4_rcp) は 12.5k gate で PSNR guard 抵触・不採用",[14,285],[344,289,345,346,347,348,127,349,350,351,24],"m5a","ssim","float4","reciprocal-sharing","fast-math","gpu-gate","rejected","psnr-guard-fail","2026-09-seminar05-milestones M5a (A6 SSIM float4 化、3ch 単一 walk)",[354,355,356,357,358,359,360,361],"m5a-12500-off-r1 (contaminated, discarded, re-run once)","m5a-12500-on-r1 (contaminated, discarded, re-run once)","m5a-12500-off-r1 (redo, used)","m5a-12500-on-r1 (redo, used)","m5a-12500-off-r2","m5a-12500-on-r2","m5a-12500-off-r3","m5a-12500-on-r3","12.5k 同一 session 交互 A\u002FB n=3 (1 pair 再実行後): on **36.1327 dB** (36.156 \u002F 36.170 \u002F 36.072) vs off **36.2133 dB** (36.256 \u002F 36.204 \u002F 36.180) = **Δ -0.081 dB**。task 指定 guard (on mean ≥ off mean − 0.05 dB) に **fail** (-0.081 \u003C -0.05)。3 pair とも on\u003Coff で完全分離、方向一致。on-r3 (36.072 dB) は config header の絶対 guard 帯 [36.102, 36.302] の下限を割り込む唯一の値","12.5k full run 同一 session 交互 A\u002FB n=3 (r1 は汚染疑いで 1 回再実行): **off mean 126.954s (σ 1.264%) → on mean 126.884s (σ 4.314%) = Δ -0.055%**。有意閾値 max(2σ_off,1%) = 2.528%、実測 Δ はこれに遠く届かない **null 結果**。3 pair 個別 Δ は +3.62% (r1, redo) \u002F -2.24% (r2) \u002F -1.61% (r3) と符号が一致しない。σ 非対称比 3.41× (on>off) は p3-tier1-bit-exact の汚染署名域に近いが、r1 は既に 1 回再実行済みのため追加再実行はしていない (§4 参照、PSNR guard が既に不採用を決定づけているため追加の GPU 消費は不要と判断)","low","rejected-psnr-guard-float4rcp-null-wallclock-float4-standalone-untested","SSIM の walk 方式を選べる BackendConfig `[backend] ssim_walk` (`per_channel` default \u002F `float4` \u002F `float4_rcp`) を実装し、shader (`ssim_forward_float4`, `ssim_backward_rcp`) と Rust 配線 (`SsimEvaluator`, `Trainer`, `apply_backend_config`, result.toml item) を完結させた。\u003Cstrong>stage 1 (float4 化 forward) は K=7\u002FK=11 の単体 test + 本番規模 (407,267 splats) `splat bench --parity` の両方で byte-exact\u003C\u002Fstrong> — PSNR risk がゼロの再挑戦候補として残す。\u003Cstrong>stage 2 (逆数共有 backward) の REL_TOL は実測ベースで 2e-4 に確定\u003C\u002Fstrong> (K=7 max_rel=8.4519e-5 \u002F K=11 6.3679e-5、旧 2-divide 実装の 8.28e-5 とほぼ同水準 — fast math 近似逆数の精度floorが支配的で除算回数削減の理論的優位はほぼ観測できなかった)。3-way replay bench (`submission=per_kernel` で ssim label を分離) では float4_rcp の ssim label gpu_ms が per_channel 比 -20.8% (758.92→601.06ms\u002F600calls) と明確に縮小したが、\u003Cstrong>12.5k Lego 同一 session 交互 A\u002FB n=3 gate (「採用候補の最終形 = float4_rcp」を一括計測) では PSNR guard に抵触し不採用\u003C\u002Fstrong>: on mean 36.1327 dB (36.156\u002F36.170\u002F36.072) vs off mean 36.2133 dB (36.256\u002F36.204\u002F36.180)、Δ -0.081 dB は guard 閾値 -0.05 dB を超過、3 pair 全てで on\u003Coff の完全分離という系統的な質低下だった。wallclock は Δ -0.055% (off mean 126.954s → on mean 126.884s) で有意閾値 max(2σ_off,1%)=2.53% に届かず null。§5 で示す通り、ssim の budget share (11.80%、p3-kernel-share-post-s3) と isolated-label 効果 (-20.8%) から予測される wallclock 寄与は ~-2.5% で、この gate の解像度限界とほぼ同水準だった — milestone の期待 delta (-4〜6%) はこの意味で楽観的すぎた。config.rs \u002F ssim.rs の `SsimWalkKind::default()` は `PerChannel` のまま変更していない。","\u002Ffindings\u002Fp3-ssim-float4\u002F",{"id":51,"title":369,"date":9,"status":10,"polarity":12,"category":11,"axes":370,"tags":371,"task_code":384,"related_runs":385,"delta_psnr":404,"delta_wallclock":405,"rank":56,"verdict":406,"impact_summary":407,"detail_path":408},"M2 Tier1 (A1-A4 bit-exact) 12.5k gate v1+v2 — 棄却維持 (v1: Δ-5.0%だが2σ未達+PSNR guard抵触 \u002F v2 n=5 radix ballot上: PSNR分離は反証、wallclockは効果量≤1%で判定不能)",[14,285],[372,373,374,375,376,377,349,24,350,378,379,380,381,382,383],"m2","tier1","ssim-clear","raster-grad-clear","backward-uniform","lazy-c3-scratch","atomic-nondeterminism","psnr-guard","v2-regate","n5","radix-ballot-baseline","contamination-retry","2026-09 第 5 回ゼミ milestones — M2 Tier1 (A1-A4)",[386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403],"t1-12500-off-r1","t1-12500-on-r1","t1-12500-off-r2","t1-12500-on-r2","t1-12500-off-r3","t1-12500-on-r3","t1v2-12500-off-r1 (CONTAMINATED, discarded)","t1v2-12500-on-r1 (CONTAMINATED, discarded)","t1v2-12500-off-r2","t1v2-12500-on-r2","t1v2-12500-off-r3","t1v2-12500-on-r3","t1v2-12500-off-r4","t1v2-12500-on-r4","t1v2-12500-off-r5","t1v2-12500-on-r5","t1v2-12500-off-r6 (retry replacing r1)","t1v2-12500-on-r6 (retry replacing r1)","v1 (n=3): on **36.140 dB** (36.165\u002F36.097\u002F36.157) vs off **36.205 dB** (36.201\u002F36.195\u002F36.219) = **-0.065 dB**、n=3 全 pair で on \u003C off の完全分離、task 指定 guard (on mean ≥ off mean - 0.05 dB) に **抵触**。config header の絶対 guard (36.202 ± 0.1 dB) では両 arm とも帯内で pass — 2 guard の定義差は本文 §1 参照。final splats は on 407,775 \u002F off 408,721 (-0.23%)。\u003Cbr>\u003Cstrong>v2 (n=5、r1→r6 置換後)\u003C\u002Fstrong>: on **36.1982 dB** (36.218\u002F36.159\u002F36.196\u002F36.221\u002F36.197) vs off **36.1704 dB** (36.112\u002F36.220\u002F36.102\u002F36.237\u002F36.181) = **+0.0278 dB**、guard に **pass**。5 pair の符号は on&gt;off (r1,r3,r5) \u002F on&lt;off (r2,r4) の**混在**で系統性なし — off 側の散らばり (36.102-36.237) が on 側 (36.159-36.221) より大きく、v1 の系統分離とは対照的。v2 の結果は「PSNR 散らばりは atomic 非決定性の床であり flag 由来ではない」という読みを支持し、v1 の「静かな壊れ」仮説を反証する","v1 (n=3) mean (train elapsed, internal timer): **155.40 → 147.64s = -4.99%**、σ off 2.56% \u002F on 0.55% (比 4.66×)、有意閾値 max(2σ_off,1%) = 5.11%、実測 Δ は**閾値の 97.7%、0.12 pt 差で未達**。\u003Cbr>\u003Cstrong>v2 (n=5、新 baseline 127.4s 上、r1→r6 置換後)\u003C\u002Fstrong>: off **127.386s** (σ 0.527%) → on **125.972s** (σ 0.956%) = **-1.11%**、有意閾値 max(2σ_off,1%) = 1.054%、実測 Δ は**閾値の 105%、0.06 pt 差で形式上通過**。ただし感度分析 3 通り (汚染 r1 込み生データ Δ-0.30%\u002F不通過、r1→r6 置換後 n=5 Δ-1.11%\u002F通過、両試行を n=6 として残す Δ-0.15%\u002F不通過) のうち\u003Cstrong>通過するのは 1 通りのみ\u003C\u002Fstrong>で判定が 1 点の去就に依存する。σ 非対称は v1 が off 側 4.66× だったのに対し v2 は on 側 (n=5 で 1.81×、r1 の両試行を含む n=6 で見ると **5.40×**) と\u003Cstrong>逆転しており、両 gate とも分散構造が clean ではない\u003C\u002Fstrong>。v1 (-7.76s) と v2 (-1.41s) の絶対削減量が 5.5× 食い違う点は、A1-A4 が host 側 memset\u002Falloc 除去 (per-iter 削減量はほぼ一定のはず) である以上、\u003Cstrong>v1 の -4.99% は off arm の汚染 (σ2.56%) で膨らんでいた可能性が高く、真の効果量は ~1% 前後 = 本 harness の n=5 分解能未満\u003C\u002Fstrong>という解釈と整合する","rejected-v2-wallclock-inconclusive-psnr-guard-resolved","M2 Tier1 の 4 flag (A1 SSIM memset 除去 \u002F A2 work_grad blit 化 \u002F A3 backward uniform set_bytes 化 \u002F A4 lazy C3 scratch) を全 ON\u002F全 OFF の 2 arm にまとめ gate した。\u003Cstrong>v1 (n=3, 旧 baseline)\u003C\u002Fstrong>: train elapsed (internal timer) off 155.40s (σ 2.56%) → on 147.64s (σ 0.55%) = -4.99%、3 pair 全てで on が速い一貫した方向を示したが有意閾値 max(2σ\u003Csub>off\u003C\u002Fsub>, 1%) = 5.11% を 0.12 pt 差で下回り不通過。同時に PSNR は on 側で完全分離 (mean Δ -0.065 dB) し task 指定 guard に抵触した。\u003Cstrong>v2 (n=5, 2026-08-30 M4 radix ballot 採用後の新 baseline 127.4s 上で再 gate)\u003C\u002Fstrong>: PSNR は mean **+0.028 dB**、5 pair 中 on&gt;off 3 \u002F on&lt;off 2 の符号混在で \u003Cstrong>v1 の系統分離は再現せず、「A1\u002FA2 chained path の静かな壊れ」仮説は反証\u003C\u002Fstrong>された。wallclock は r1 pair の load 汚染 (on-r1 走行中に load1 が 9.09 まで spike) を検知し 1 回だけ再実行 (r6 で置換、元 log は `*-CONTAMINATED-*` として保存) した後の値で Δ **-1.11%**、有意閾値 1.05% を 0.06 pt 差で形式上通過する。しかし①汚染 r1 を生のまま使うと Δ-0.30% (不通過)、②両方の r1 試行を n=6 として残すと Δ-0.15% (不通過) と\u003Cstrong>1 点の去就で判定が反転する脆い pass\u003C\u002Fstrong>であり、さらに③置換先の r6 自身が事前登録した再実行条件 (自 arm 他値から3σ超) を独立 load 証拠の裏付けなしに 10.3σ で踏む (条件だけでは停止しない除外連鎖になる設計上の欠陥が判明)。advisor レビューの指摘により、0.06pt の脆い pass を根拠に default flip して M7 最終スタック・卒論数値の土台にするのは不適切と判断し、\u003Cstrong>棄却を維持\u003C\u002Fstrong>した (根拠は v1 の「PSNR guard 抵触」から v2 の「wallclock 効果量 ≤1% で本 harness (n=5) の分解能未満、判定不能」に変わった)。両 gate とも `cargo test --workspace` (A1 sentinel probe \u002F A2+A3 4 組合せ parity \u002F A4 self-heal 含む) は全 pass — 実装レベルの correctness bug は一貫して否定的。\u003Cstrong>結論: 棄却維持、4 flag の default は変更しない、config.rs は一切触らない\u003C\u002Fstrong>。","\u002Ffindings\u002Fp3-tier1-bit-exact\u002F",{"id":53,"title":410,"date":411,"status":10,"polarity":412,"category":413,"axes":414,"tags":415,"task_code":423,"related_runs":424,"delta_psnr":-1,"delta_wallclock":431,"rank":304,"verdict":432,"impact_summary":433,"detail_path":434},"保持 flag 全数再 gate sweep — 8 維持 \u002F 1 flip (loss_path -26.5%) + bench validate 抜けを発見","2026-08-16","positive","performance",[14,285],[416,417,418,22,419,420,24,421,422],"flag-revisit","gate-sweep","loss-path","validate","regression-guard","stop-the-pop","default-flip","保持 flag 全数再 gate sweep (2026-08-16 GPU 専有タスク)",[425,426,427,428,429,430],"revisit-losspath-host-12500-r1","revisit-losspath-host-12500-r2","revisit-losspath-host-12500-r3","revisit-losspath-gpu-12500-r1","revisit-losspath-gpu-12500-r2","revisit-losspath-gpu-12500-r3","loss_path flip: replay -26.5% (final) \u002F -29.6% (iter5000)、12.5k gate -35.3% — ただし公式 config は既に gpu 明示のため公表値は不変 (hygiene flip)","accepted","\u003Ccode>BackendConfig\u003C\u002Fcode> 全 16 field を機械走査し、default 以外の variant を全数再判定。実測 9 件のうち \u003Cstrong>8 件は verdict 維持\u003C\u002Fstrong>、\u003Cstrong>1 件 (\u003Ccode>loss_path\u003C\u002Fcode>) が flip\u003C\u002Fstrong>。\u003Ccode>loss_path = \"gpu\"\u003C\u002Fcode> は replay final regime \u003Cstrong>21.210 → 15.591 ms\u002Fiter (-26.5%)\u003C\u002Fstrong> \u002F iter5000 \u003Cstrong>-29.6%\u003C\u002Fstrong>、12.5k full gate (同一 session 交互 A\u002FB、n=3) で \u003Cstrong>283.00 → 183.00s (-35.3%)\u003C\u002Fstrong>・PSNR \u003Cstrong>36.142 → 36.188 dB (+0.047、guard ±0.1 内)\u003C\u002Fstrong>。ただし \u003Cstrong>この flip は公式数値を 1 つも動かさない hygiene\u003C\u002Fstrong> — 全 237 config が \u003Ccode>loss_path\u003C\u002Fcode> を明示指定済みで 12.5k gate 系は例外なく \u003Ccode>\"gpu\"\u003C\u002Fcode>、enum default だけが 2026-04-30 以来実運用から取り残されていた。残り 7 件は validate hard error による構造的非互換 (5) \u002F 禁忌リスト (2) \u002F harness 非対応 (1) \u002F 非 perf variant (3) として理由付きで判定不能を記録。副産物として \u003Ccode>splat bench\u003C\u002Fcode> の \u003Ccode>validate()\u003C\u002Fcode> 抜け (無効組合せが exit 0 で silent 別経路実行) を発見・修正した。","\u002Ffindings\u002Fp2-flag-revisit-sweep\u002F",{"id":50,"title":436,"date":411,"status":10,"polarity":412,"category":11,"axes":437,"tags":438,"task_code":445,"related_runs":446,"delta_psnr":451,"delta_wallclock":452,"rank":304,"verdict":453,"impact_summary":454,"detail_path":455},"P2 gap sweep Phase 2 — 2-BWD last_contributor で -15.0% (数学的同値)、STP 再判定は棄却",[14],[439,440,441,442,421,443,444,24],"gap-sweep","phase-2","2-bwd-last-contributor","backward","re-eval","function-constant","2026-08 msplat gap sweep Phase 2 2-BWD \u002F STP 再判定",[447,448,449,450],"lego-lc-smoke-1k","lego-p2lc-12500","lego-stp-c0-12500","lego-stack-lc-stp-12500","LC 12.5k gate: 36.183 → 36.191 dB = +0.008 dB (数学的同値実装、atomic 非決定性 guard ±0.1 内)","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%)","lc-adopted-minus-15-percent-stp-rejected-final","C0 (-48.4%) に続く Phase 2 第 2 弾で、backward 31.4% の新 bottleneck を kernel 側から -40.3% 削減。\u003Cstrong>Lego 12.5k = 336.33s で msplat 30K (220s) 比 1.53× まで縮小\u003C\u002Fstrong>し、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% \u002F radix 13.5% \u002F SSIM 7.5% でいずれも trigger 25% 未達 — Phase 2 はここで完了、Phase 3 (再計測 + Pareto v3) へ。","\u002Ffindings\u002Fp2-last-contributor\u002F",{"id":49,"title":457,"date":411,"status":10,"polarity":412,"category":11,"axes":458,"tags":459,"task_code":466,"related_runs":467,"delta_psnr":471,"delta_wallclock":472,"rank":304,"verdict":473,"impact_summary":474,"detail_path":475},"W1 warp sparse skip + exp-skip — backward -35% \u002F replay -11.2% (bit-exact)",[14],[460,461,462,463,442,464,465,444,127,24],"1x-roadmap-v2","w1","warp-sparse-skip","exp-skip","forward","simd-any","2026-08 1× 工程表 v2 W1",[468,469,470],"lego-w1-warpany-12500","lego-w1-warpany-12500-rep2","lego-w1-warpany-12500-rep3","12.5k gate n=3: 36.209 \u002F 36.201 \u002F 36.193 dB → mean 36.201 dB = 基準 36.148 (S1 n=3 mean) 比 +0.053 dB (guard ±0.1 内、n=3 mean 判定 — S1 の教訓に従い n=1 判定なし)","replay bench final regime: 21.724 → 19.300 ms\u002Fiter = **-11.16%** (閾値 max(2σ,1%)=2.7%)。iter5000 regime: 19.984 → 17.759 = **-11.13%** (閾値 3.1%)。backward_raster: 7.183 → 4.652 ms\u002Fcall (**-35.2%**、GPU 部 5.963 → 3.437 = -42.4%)。12.5k full run n=3: 239.74 \u002F 246.93 \u002F 237.57s → mean **241.41s** (S1 基準 261.55s 比 **-7.7%**)","w1-adopted-default-flip-warp-any","1× 工程表 v2 の第 1 波。msplat \u002F Inria \u002F brush の 3 実装が持ち本実装だけ欠落していた backward の 2 つの skip を、bit-exact の等価性論証つきで移植した。backward_raster は LC (2-BWD) 後の 7.2ms\u002Fcall から 4.65ms\u002Fcall へ -35.2% (kernel share 13.1% に低下)、replay 全体で -11.2%。12.5k full run は 261.55 → 241.41s で msplat 同日等価 gap は 1.56× → 1.44× に縮小。数学的同値の施策のみの累計は 766.07 → 241.41s = -68.5% になった。次の律速は forward (23.6%) \u002F radix (15.0%) で、W2 (encoder\u002FCB 統合) と計測 (counter session) が次段。","\u002Ffindings\u002Fp2-w1-warp-sparse-skip\u002F",1790227327646]