[{"data":1,"prerenderedAt":108},["ShallowReactive",2],{"finding:a-10-kahan-negative":3,"finding-runs:a-10-kahan-negative":93,"finding-related:a-10-kahan-negative":107},{"meta":4,"impact":24,"sections":31},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":21,"related_runs":22},"a-10-kahan-negative","A.10 Kahan summation — Metal compiler が compensator を最適化消去","per-pixel RGB 累積に Neumaier 形式を入れたが、MSL compiler に compensator term が消されて loss \u002F PSNR が baseline と bit-identical に。Kahan は wallclock overhead だけ残り variance reduction 効果ゼロ。","Negative finding · MSL compiler","2026-05-23","stable","experiment","negative",[14],3,[16,17,18,19,20],"phase-5","kahan","metal-compiler","variance","msl","A.10",[23],"lego-sh3-30k",{"summary":25,"rank":26,"verdict":27,"delta_psnr":28,"delta_wallclock":29,"delta_loss":30},"Neumaier compensated summation の compensator term は MSL compiler の algebraic optimization で消去され、loss は bit-identical。Kahan は wallclock overhead だけ残し variance reduction 効果ゼロ。","low","rejected",0,"+0.5% (overhead のみ)","bit-identical",[32,35,43,46,53,57,59,83,85,88],{"type":33,"text":34},"lead","\u003Ccode>forward\u002Frasterize.metal\u003C\u002Fcode> の per-pixel RGB 累積に Neumaier compensated summation を入れたが、Metal Shading Language compiler の algebraic optimization で compensator term \u003Ccode>(s - pix_out) - y\u003C\u002Fcode> が完全に消去され、loss \u002F PSNR が baseline と \u003Cstrong>bit-identical\u003C\u002Fstrong> になった。Kahan は wallclock overhead だけ残し、variance reduction 効果ゼロ。",{"type":36,"items":37},"kv",[38,40],{"key":39,"value":9},"実装日",{"key":41,"value":42},"前提 baseline","lego-sh3-30k 24.879 dB \u002F 23m13s \u002F 83,734 splats, seed=42",{"type":44,"text":45},"heading","実験プロトコル",{"type":47,"ordered":48,"items":49},"list",true,[50,51,52],"\u003Ccode>render_splats_f32\u003C\u002Fcode> (Phase 4 training forward) の per-pixel 累積を Neumaier 形式に書き換え","同じ config (\u003Ccode>configs\u002F2026-05-23-0510-kahan-500smoke.toml\u003C\u002Fcode>、500 iter, seed=42, sh=3, lego, capacity=1M) を Kahan ON と OFF で別 binary 実行: ON = \u003Ccode>pix_out\u003C\u002Fcode> を Neumaier 累積、OFF = 元の \u003Ccode>pix_out += term\u003C\u002Fcode>","\u003Ccode>log_every=50\u003C\u002Fcode> で iter 1\u002F50\u002F100\u002F...\u002F500 の loss を比較、val PSNR も比較",{"type":54,"lang":55,"text":56},"code","metal","float3 y = term - pix_out_c;\nfloat3 s = pix_out + y;\npix_out_c = (s - pix_out) - y;\npix_out = s;\n",{"type":44,"text":58},"結果",{"type":60,"columns":61,"align":66,"rows":68,"caption":82},"table",[62,63,64,65],"iter","Kahan ON loss","Kahan OFF loss","Δ",[67,67,67,67],"right",[69,73,76,79],[70,71,71,72],1,"0.34534","0",[74,75,75,72],50,"0.11788",[77,78,78,72],100,"0.09889",[80,81,81,72],500,"0.02683","全 iter で完全一致 — Neumaier の compensator が compile 時に消えていることを示す",{"type":44,"text":84},"原因仮説",{"type":86,"text":87},"paragraph","Metal Shading Language の compiler (Apple LLVM ベース) は浮動小数算術の結合則を仮定して subexpression を簡約する。Neumaier 補正項 \u003Ccode>(s - pix_out) - y\u003C\u002Fcode> は数学的には 0 ではないが、algebraic 変形では \u003Ccode>0\u003C\u002Fcode> と等価扱いされ、最適化で完全に消去された可能性が高い。\u003Ccode>-fno-fast-math\u003C\u002Fcode> 相当の pragma があれば抑止できるが、Metal にはこの粒度の制御がない。",{"type":89,"label":90,"variant":91,"text":92},"callout","Lesson","warn","GPU compiler は数値安定化目的の compensator を保護しない。compile-after の MSL を逆アセンブルして消されていないか確認する手順を、今後の variance 抑制施策では必須にする。",[94],{"id":23,"title":23,"subtitle":95,"date":96,"workspace":97,"tags":98,"verdict":102,"psnr":103,"psnr_unit":-1,"wallclock":104,"splats":105,"summary_url":106,"detail_path":106},"A.8 SH degree ablation — sh_degree=3 (DC only, no view-dependence)","2026-05-22","splat",[99,100,101,16],"sh-ablation","lego-30k","sh-3","partial",24.87872886657715,"23m 13s",83734,"\u002Fruns\u002Flego-sh3-30k\u002F",[],1782449788617]