[{"data":1,"prerenderedAt":235},["ShallowReactive",2],{"finding:a-7-icb-batching-results":3,"finding-runs:a-7-icb-batching-results":166,"finding-related:a-7-icb-batching-results":189},{"meta":4,"impact":31,"sections":38},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":23,"related_runs":24,"related_findings":27},"a-7-icb-batching-results","A.7 batched cmd buffer — wallclock -6.2% 改善 + PSNR drift -0.30 dB","scope B 限定版 (forward 末尾 + backward chain を 1 cmd buffer 集約、~3 commit\u002Fiter 削減) を worktree binary で 30k bench。baseline 24.879 dB \u002F 23m13s に対し 24.577 dB \u002F 21m47s、Mildly positive finding。Apple Silicon の commit overhead が予想より小さく、scope B で実効 ~6%。","Mildly positive · Apple Silicon batching","2026-05-23","stable","experiment","positive",[14],3,[16,17,18,19,20,21,22],"phase-5","icb","command-buffer","batching","metal","apple-silicon","results","A.7",[25,26],"lego-sh3-30k","lego-a7-batched-30k",[28,29,30],"a-7-icb-batching-plan","a-9-f16-forward-negative","a-10-kahan-negative",{"summary":32,"rank":33,"verdict":34,"delta_psnr":35,"delta_wallclock":36,"delta_splats":37},"scope B 限定版 (forward 末尾の extract_offsets + rasterize.forward を 1 cmd buffer、backward chain の rasterize.backward + project_backwards を 1 cmd buffer) を env SPLAT_BATCHED_FORWARD=1 で活性化。30k bench で wallclock -6.2% \u002F PSNR drift -0.30 dB、Mildly positive。期待 -6〜-12% の下限、Apple Silicon の commit overhead が予想より小さい示唆。","mid","accepted","-0.302 dB (24.577 vs 24.879)","-6.16% (1307.26s vs 1393s = -85.74s)","-1.05% (82,855 vs 83,734)",[39,42,63,66,69,75,77,86,88,94,96,98,130,132,134,136,138,140,142,144,149,151,157,159],{"type":40,"text":41},"lead","\u003Ca href=\"\u002Ffindings\u002Fa-7-icb-batching-plan\">A.7 plan\u003C\u002Fa> の scope B (Buffer 入出力 variant 追加 + backward chain と forward 末尾を batched 化) を \u003Ccode>worktree a-7-icb-batching\u003C\u002Fcode> で実装、env \u003Ccode>SPLAT_BATCHED_FORWARD=1\u003C\u002Fcode> で活性化。30k bench (lego sh=3, seed=42, capacity=1M) で baseline 24.879 dB \u002F 23m13s に対し \u003Cstrong>24.577 dB \u002F 21m47s\u003C\u002Fstrong>、wallclock \u003Cstrong>-6.16% 改善\u003C\u002Fstrong>。PSNR drift \u003Cstrong>-0.302 dB\u003C\u002Fstrong> は許容範囲内 (target \u003C 0.5 dB)。Mildly positive finding。",{"type":43,"items":44},"kv",[45,48,51,54,57,60],{"key":46,"value":47},"実装日","2026-05-23 (subagent worktree)",{"key":49,"value":50},"前提 baseline","lego-sh3-30k 24.879 dB \u002F 23m13s \u002F 83,734 splats, seed=42",{"key":52,"value":53},"本 run","lego-a7-batched-30k 24.577 dB \u002F 21m47s \u002F 82,855 splats, seed=42",{"key":55,"value":56},"config","configs\u002F2026-05-23-0730-lego-a7-batched-30k.toml",{"key":58,"value":59},"活性化","env SPLAT_BATCHED_FORWARD=1 (train_loop が forward 末尾 + backward chain を batched に切替)",{"key":61,"value":62},"worktree",".claude\u002Fworktrees\u002Fagent-a7-icb-batching (branch a-7-icb-batching, commit 95e8630)",{"type":64,"text":65},"heading","実装の actual scope (plan からの調整)",{"type":67,"text":68},"paragraph","Plan の literal interpretation (\u003Ccode>Option&lt;&amp;CommandBufferRef&gt;\u003C\u002Fcode> 引数だけ追加) では subagent 1 が問題発見: \u003Cstrong>splat-metal の現行 kernel API は全 host slice 入出力前提\u003C\u002Fstrong>、\u003Ccode>radix_sort\u003C\u002Fcode> は内部で 16 pass の hist→scatter + host CPU 側 exclusive prefix scan を行うので 1 cmd buffer 集約は不能。selectable な batching site は限定的。",{"type":70,"items":71},"list",[72,73,74],"\u003Cstrong>scope A (literal)\u003C\u002Fstrong>: commit skip だけ → batching 効果ゼロ (radix_sort の host CPU loop が boundary)","\u003Cstrong>scope B (採用)\u003C\u002Fstrong>: Buffer 入出力 variant を追加 + (i) extract_offsets + rasterize.forward の forward 末尾、(ii) rasterize.backward + project_backwards の backward chain の 2 site を batched 化。期待 ~3 commit\u002Fiter 削減","\u003Cstrong>scope C (defer)\u003C\u002Fstrong>: 真の ICB \u002F 全 chain batching は radix_sort 含む全 API の Buffer 化が必要、卒研範囲外",{"type":64,"text":76},"追加した API (5 method + 2 trainer entry)",{"type":70,"items":78},[79,80,81,82,83,84,85],"\u003Ccode>rasterize::forward_from_buf\u003C\u002Fcode> (Buffer 入出力 + Option&lt;CommandBuffer&gt;)","\u003Ccode>rasterize::backward_from_buf\u003C\u002Fcode> 同","\u003Ccode>project::project_backwards_from_buf\u003C\u002Fcode> 同","\u003Ccode>tile_bin::extract_offsets_from_buf\u003C\u002Fcode> 同","\u003Ccode>trainer::forward_with_state_batched_tail\u003C\u002Fcode>: extract_offsets + rasterize.forward を 1 cmd buffer","\u003Ccode>trainer::backward_combined_batched\u003C\u002Fcode>: rasterize.backward + project_backwards を 1 cmd buffer","\u003Ccode>train_loop\u003C\u002Fcode>: env SPLAT_BATCHED_FORWARD で batched path 切替",{"type":64,"text":87},"test 結果",{"type":70,"items":89},[90,91,92,93],"\u003Ccode>cargo test -p splat-metal --lib\u003C\u002Fcode>: 25 pass \u002F 0 fail (既存 23 + 新規 2)","\u003Ccode>cargo test -p splat-train-v1 --lib\u003C\u002Fcode>: 31 pass \u002F 0 fail","\u003Ccode>forward_from_buf_matches_forward_unbatched\u003C\u002Fcode>: pass (tol 1e-6 厳密)","\u003Ccode>backward_from_buf_matches_backward_unbatched\u003C\u002Fcode>: pass、ただし \u003Cstrong>tol abs 1e-4 \u002F rel 1e-4 に緩和\u003C\u002Fstrong>",{"type":67,"text":95},"backward の緩和は SIMD backward kernel の \u003Ccode>atomic_fetch_add\u003C\u002Fcode> dispatch 順序非決定性によるもの (実測 1.9e-6 のズレ、A.10 と同類の GPU 非決定性 finding)。kernel 性質で再走でも変わらない、accept。",{"type":64,"text":97},"30k 実測結果",{"type":99,"columns":100,"align":105,"rows":108,"caption":129},"table",[101,102,103,104],"metric","baseline (sh3-30k)","A.7 (batched)","Δ",[106,107,107,107],"left","right",[109,114,119,124],[110,111,112,113],"PSNR (val 100 views)","24.879 dB","24.577 dB","-0.302 dB",[115,116,117,118],"wallclock (30k iter)","23m13s (1393s)","21m47s (1307.26s)","-85.74s (-6.16%)",[120,121,122,123],"ms\u002Fiter (avg)","46.4 ms","43.6 ms","-2.8 ms (-6.03%)",[125,126,127,128],"final splats","83,734","82,855","-879 (-1.05%)","wallclock -6.16% は plan 期待 -6〜-12% の下限。Apple Silicon の per-commit overhead が plan 想定 (0.3-0.7 ms × 3) より小さく、実効は ~1 ms × 3 = 3 ms \u002F iter 程度の節約と推定",{"type":64,"text":131},"解釈",{"type":64,"level":14,"text":133},"Apple Silicon の commit overhead は思ったより小さい",{"type":67,"text":135},"plan では commit overhead を 0.3-0.7 ms × 25+ commits\u002Fiter で iter の 20-50% を占めると見積もったが、実測 -6% から逆算すると \u003Cstrong>per-commit overhead は ~0.1-0.3 ms 程度\u003C\u002Fstrong>。Apple Silicon GPU の command queue は CUDA より overhead が小さいことを示唆。これは brush (wgpu→Metal) が CUDA native (orig 3DGS) より速い (\u003Ca href=\"\u002Ffindings\u002Fm4-brush-bench\">m4-brush-bench\u003C\u002Fa>) という別 finding と整合的。",{"type":64,"level":14,"text":137},"PSNR -0.30 dB drift の原因",{"type":67,"text":139},"backward の SIMD atomic 順序非決定性 (test で観測した 1.9e-6 のズレ) が iter ごとに gradient を微小に変化させ、30k 累積で refine 判定が微妙に変わる。splats 数も -1.05% (82,855 vs 83,734) と僅差、PSNR drift も -0.3 dB と限定的、実用上問題ない range。bit-identical を求めるなら backward を non-atomic な reduction に書き換える必要があるが、scope 外。",{"type":64,"text":141},"卒論への含意",{"type":67,"text":143},"第 3 軸 (Apple Silicon 固有最適化) の \u003Cstrong>Positive finding\u003C\u002Fstrong>。M-3.x baseline 23m13s → 21m47s と 1 行が central table に追加できる。「Apple Silicon の command queue overhead は CUDA 系より小さく、batching の利得は marginal (約 6%)」という結論で、A.9 (-10 dB \u002F +75% 二重 negative) と A.10 (bit-identical) と合わせて、Apple Silicon 固有最適化の 3 試行のうち **1 positive (A.7) \u002F 2 negative (A.9, A.10)** という構造ができた。",{"type":145,"label":146,"variant":147,"text":148},"callout","Lesson","success","kernel API の Buffer 化は scope 拡張だが、その実効として ~6% wallclock 改善が得られた。次に GPU profiler (Instruments Metal Trace) を当てて、forward chain 上流 (project \u002F emit_pairs \u002F radix_sort) の commit overhead 寄与を直接計測すれば、追加の batching 余地を識別可能。",{"type":64,"text":150},"残作業 (defer)",{"type":70,"items":152},[153,154,155,156],"Instruments Metal Trace で per-commit overhead の実測 (Apple Silicon の queue scheduling profile)","forward chain 上流 (project + tile_bin) の Buffer 化 (現状 radix_sort の host CPU loop が boundary、scope 大)","ssim \u002F loss の batching (現状 host readback path、scope 大)","main branch への merge (現状 worktree のみ、main は f32 baseline 維持)",{"type":64,"text":158},"関連",{"type":70,"items":160},[161,162,163,164,165],"A.7 implementation plan: \u003Ccode>a-7-icb-batching-plan\u003C\u002Fcode>","A.9 f16 forward Negative finding: \u003Ccode>a-9-f16-forward-negative\u003C\u002Fcode>","A.10 Kahan Negative finding: \u003Ccode>a-10-kahan-negative\u003C\u002Fcode>","m4-brush-bench (Apple Silicon GPU の overhead が CUDA より小): \u003Ccode>m4-brush-bench\u003C\u002Fcode>","A.5 final ablation 表 第 3 軸 row 'A.7 batched cmd buffer': \u003Ccode>final-ablation-table\u003C\u002Fcode>",[167,179],{"id":26,"title":26,"subtitle":168,"date":9,"workspace":169,"tags":170,"verdict":174,"psnr":175,"psnr_unit":-1,"wallclock":176,"splats":177,"summary_url":178,"detail_path":178},"A.7 batched cmd buffer — extract+rasterize.forward と backward chain を 1 cmd buffer 集約","splat",[171,172,173,16],"a-7","icb-batching","lego-30k","partial",24.5767765045166,"21m 47s",82855,"\u002Fruns\u002Flego-a7-batched-30k\u002F",{"id":25,"title":25,"subtitle":180,"date":181,"workspace":169,"tags":182,"verdict":174,"psnr":185,"psnr_unit":-1,"wallclock":186,"splats":187,"summary_url":188,"detail_path":188},"A.8 SH degree ablation — sh_degree=3 (DC only, no view-dependence)","2026-05-22",[183,173,184,16],"sh-ablation","sh-3",24.87872886657715,"23m 13s",83734,"\u002Fruns\u002Flego-sh3-30k\u002F",[190,207,220],{"id":30,"title":191,"date":9,"status":10,"polarity":192,"category":11,"axes":193,"tags":194,"task_code":199,"related_runs":200,"delta_psnr":201,"delta_wallclock":202,"rank":203,"verdict":204,"impact_summary":205,"detail_path":206},"A.10 Kahan summation — Metal compiler が compensator を最適化消去","negative",[14],[16,195,196,197,198],"kahan","metal-compiler","variance","msl","A.10",[25],0,"+0.5% (overhead のみ)","low","rejected","Neumaier compensated summation の compensator term は MSL compiler の algebraic optimization で消去され、loss は bit-identical。Kahan は wallclock overhead だけ残し variance reduction 効果ゼロ。","\u002Ffindings\u002Fa-10-kahan-negative\u002F",{"id":28,"title":208,"date":9,"status":209,"polarity":210,"category":211,"axes":212,"tags":213,"task_code":23,"related_runs":215,"delta_psnr":-1,"delta_wallclock":216,"rank":33,"verdict":217,"impact_summary":218,"detail_path":219},"A.7 #5.32 ICB \u002F per-iter command buffer commit reduction — 実装プラン","draft","neutral","spec",[14],[16,17,18,19,20,21,214],"plan",[25],"target -10% (未検証)","investigative","forward \u002F backward の各 chain を 1 cmd buffer に集約する simpler batching plan。期待効果 +15-30% wallclock 改善 (commit overhead 20-50% を集約)。スタイル A (Option\u003C&CommandBuffer> opt-in) で既存テスト 23 件を touch せず実装。target -10% wallclock \u002F PSNR drift \u003C 0.05 dB。","\u002Ffindings\u002Fa-7-icb-batching-plan\u002F",{"id":29,"title":221,"date":9,"status":10,"polarity":192,"category":11,"axes":222,"tags":223,"task_code":227,"related_runs":228,"delta_psnr":230,"delta_wallclock":231,"rank":232,"verdict":204,"impact_summary":233,"detail_path":234},"A.9 f16 forward — half3 accumulator が underflow + cast overhead で二重 negative",[14],[16,224,225,20,226,21],"f16","mixed-precision","underflow","A.9",[25,229],"lego-a9-f16-30k","-10.006 dB (14.873 vs 24.879)","+75.1% (2439.73s vs 1393s)","high","half3 per-pixel accumulator が low-T 領域 (alpha * T \u003C 6e-5) で underflow → 寄与 splat の累積消失で PSNR -10.0 dB。さらに half↔float cast が compute bound でも重く wallclock +75%。Apple Silicon SIMD は half と float が同 throughput、bandwidth bound でないので f16 化は loss-only。","\u002Ffindings\u002Fa-9-f16-forward-negative\u002F",1782449788619]