per-pixel RGB 累積に Neumaier 形式を入れたが、MSL compiler に compensator term が消されて loss / PSNR が baseline と bit-identical に。Kahan は wallclock overhead だけ残り variance reduction 効果ゼロ。
forward/rasterize.metal の per-pixel RGB 累積に Neumaier compensated summation を入れたが、Metal Shading Language compiler の algebraic optimization で compensator term (s - pix_out) - y が完全に消去され、loss / PSNR が baseline と bit-identical になった。Kahan は wallclock overhead だけ残し、variance reduction 効果ゼロ。
render_splats_f32 (Phase 4 training forward) の per-pixel 累積を Neumaier 形式に書き換えconfigs/2026-05-23-0510-kahan-500smoke.toml、500 iter, seed=42, sh=3, lego, capacity=1M) を Kahan ON と OFF で別 binary 実行: ON = pix_out を Neumaier 累積、OFF = 元の pix_out += termlog_every=50 で iter 1/50/100/.../500 の loss を比較、val PSNR も比較float3 y = term - pix_out_c;
float3 s = pix_out + y;
pix_out_c = (s - pix_out) - y;
pix_out = s;
| iter | Kahan ON loss | Kahan OFF loss | Δ |
|---|---|---|---|
| 1 | 0.34534 | 0.34534 | 0 |
| 50 | 0.11788 | 0.11788 | 0 |
| 100 | 0.09889 | 0.09889 | 0 |
| 500 | 0.02683 | 0.02683 | 0 |
Metal Shading Language の compiler (Apple LLVM ベース) は浮動小数算術の結合則を仮定して subexpression を簡約する。Neumaier 補正項 (s - pix_out) - y は数学的には 0 ではないが、algebraic 変形では 0 と等価扱いされ、最適化で完全に消去された可能性が高い。-fno-fast-math 相当の pragma があれば抑止できるが、Metal にはこの粒度の制御がない。
GPU compiler は数値安定化目的の compensator を保護しない。compile-after の MSL を逆アセンブルして消されていないか確認する手順を、今後の variance 抑制施策では必須にする。
この finding が観測された / 言及している実験 run。