[{"data":1,"prerenderedAt":206},["ShallowReactive",2],{"finding:a-7-icb-batching-plan":3,"finding-runs:a-7-icb-batching-plan":172,"finding-related:a-7-icb-batching-plan":186},{"meta":4,"impact":28,"sections":33},{"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":26},"a-7-icb-batching-plan","A.7 #5.32 ICB \u002F per-iter command buffer commit reduction — 実装プラン","per-iter で 25+ 件の cmd.commit() があり、Apple Silicon GPU の schedule overhead (~0.3-0.7ms × N) が iter 全体の 20-50% を占める可能性。simpler batching (forward chain と backward chain をそれぞれ 1 cmd buffer に集約) を Option\u003C&CommandBuffer> opt-in 形式で実装する計画。","Plan · simpler batching","2026-05-23","draft","spec","neutral",[14],3,[16,17,18,19,20,21,22],"phase-5","icb","command-buffer","batching","metal","apple-silicon","plan","A.7",[25],"lego-sh3-30k",[27],"a-10-kahan-negative",{"summary":29,"rank":30,"verdict":31,"delta_wallclock":32},"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。","mid","investigative","target -10% (未検証)",[34,37,40,43,47,49,51,53,55,61,63,67,69,71,73,76,78,80,82,84,89,91,133,135,137,143,145,147,152,154,159,161,163,165,167],{"type":35,"text":36},"lead","\u003Cstrong>status:\u003C\u002Fstrong> plan 起草 (2026-05-23)、実装 subagent 投入予定 (A.6 完了後)。\u003Cstrong>user 判断:\u003C\u002Fstrong> A.7 は「scope を縮小して simpler batching として実装」 (full ICB は thesis-scope 外)。",{"type":38,"text":39},"heading","観測された問題",{"type":41,"text":42},"paragraph","\u003Ccode>splat-train-v1\u002Fsrc\u002Ftrain_loop.rs\u003C\u002Fcode> の per-iter で、\u003Ccode>projector.project_soa\u003C\u002Fcode>, \u003Ccode>binner.emit_pairs\u003C\u002Fcode>, \u003Ccode>binner.radix_sort\u003C\u002Fcode>, \u003Ccode>binner.extract_offsets\u003C\u002Fcode>, \u003Ccode>rasterize.forward\u003C\u002Fcode>, \u003Ccode>loss.compute_l1_combine_ssim\u003C\u002Fcode> (or l1_only), \u003Ccode>rasterize.backward\u003C\u002Fcode>, \u003Ccode>project_backwards\u003C\u002Fcode>, \u003Ccode>adam.step\u003C\u002Fcode> が \u003Cstrong>すべて個別に\u003C\u002Fstrong> \u003Ccode>new_command_buffer() + commit + wait_until_completed\u003C\u002Fcode> している:",{"type":44,"lang":45,"text":46},"code","bash","grep -rn \"new_command_buffer\\|cmd.commit\" splat\u002Fcrates\u002Fsplat-metal\u002Fsrc\u002Fkernels\u002F\n",{"type":41,"text":48},"で 25+ 件の \u003Ccode>cmd.commit()\u003C\u002Fcode> が確認できる (project: 3, tile_bin: 5, rasterize: 2, ssim: 2 x 2、loss: 多数、adam: 1)。",{"type":41,"text":50},"各 commit に Apple Silicon GPU の schedule overhead (~0.3-0.7 ms M4 Max 実測) が乗るため、iter ~25 ms のうち overhead 寄与は \u003Cstrong>5-12 ms (20-50%)\u003C\u002Fstrong> が見込まれる。これを集約すれば +15-30% wallclock 改善の余地。",{"type":38,"text":52},"scope (simpler batching、full ICB は別案件)",{"type":41,"text":54},"\u003Cstrong>やる\u003C\u002Fstrong>:",{"type":56,"items":57},"list",[58,59,60],"forward path (project → tile_bin chain → rasterize forward) を 1 cmd buffer に統合","backward path (rasterize backward → project_backwards) を 1 cmd buffer に統合","adam を 1 cmd buffer (現状 1 commit なので touch しない)",{"type":41,"text":62},"\u003Cstrong>やらない\u003C\u002Fstrong>:",{"type":56,"items":64},[65,66],"真の ICB (MTLIndirectComputeCommandEncoder で dispatch 配列を pre-encoded buffer に保存して reuse) — 卒研範囲外、変動 splat 数で win が弱い","forward と backward を \u003Cstrong>同 cmd buffer に\u003C\u002Fstrong> する (forward の rendered_buf を host loss path で読む必要がある場合がある、現状 GPU loss path で host readback ない → 可能だが複雑性増える、stretch)",{"type":38,"text":68},"実装方針",{"type":41,"text":70},"各 kernel method に「encode-only variant」を追加する。3 つのスタイルがあり:",{"type":38,"level":14,"text":72},"スタイル A (推奨): Option\u003C&CommandBuffer> parameter",{"type":44,"lang":74,"text":75},"rust","impl Projector {\n    pub fn project_soa(&self, param: &Param, cam: &Camera) -> GpuProjectResult {\n        self.project_soa_in_cmd(param, cam, None)  \u002F\u002F 旧 path\n    }\n    pub fn project_soa_in_cmd(\n        &self,\n        param: &Param,\n        cam: &Camera,\n        cmd: Option\u003C&CommandBufferRef>,  \u002F\u002F None なら内部で作って commit\n    ) -> GpuProjectResult {\n        \u002F\u002F cmd.is_none() → 旧 behavior\n        \u002F\u002F cmd.is_some() → encode のみ、commit は呼び出し側\n    }\n}\n",{"type":41,"text":77},"利点: 既存の test \u002F call site は変更不要、新 path は opt-in。欠点: API surface が増える。",{"type":38,"level":14,"text":79},"スタイル B: enum DispatchMode",{"type":44,"lang":74,"text":81},"pub enum DispatchMode\u003C'a> { Sync, Pipelined(&'a CommandBufferRef) }\n",{"type":41,"text":83},"\u003Ccode>forward()\u003C\u002Fcode> などに \u003Ccode>mode: DispatchMode\u003C\u002Fcode> を渡す。\u003Ccode>Sync\u003C\u002Fcode> で旧 path、\u003Ccode>Pipelined(cmd)\u003C\u002Fcode> で encode のみ。利点: 引数 1 個、call site は明示的に意図を書ける。欠点: 既存 call site に追加が必要。",{"type":85,"label":86,"variant":87,"text":88},"callout","結論","success","\u003Cstrong>A 推奨\u003C\u002Fstrong>。理由: 既存テスト 23 件 (cargo test -p splat-metal --lib) を一切 touch せずに済む。",{"type":38,"text":90},"対象 kernel と作業量",{"type":92,"columns":93,"align":97,"rows":100},"table",[94,95,96],"kernel","現状 commit\u002Fiter","encode-only API 必要",[98,99,98],"left","right",[101,105,108,111,114,116,118,121,123,127,130],[102,103,104],"project::project_soa","1","yes (forward chain)",[106,103,107],"project::project_soa_buf","(将来 stretch)",[109,103,110],"tile_bin::emit_pairs","yes",[112,113,110],"tile_bin::radix_sort","1 (× ~5 passes)",[115,103,110],"tile_bin::extract_offsets",[117,103,110],"rasterize::forward",[119,103,120],"rasterize::backward","yes (backward chain)",[122,103,110],"project::project_backwards",[124,125,126],"ssim::forward_and_grad_buf","2","(将来 stretch、L1Ssim 系で)",[128,129,107],"loss::compute_l1_combine_ssim","多数",[131,103,132],"adam::step","no (1 commit のみ)",{"type":41,"text":134},"forward chain は 4-5 commit \u002F iter → 1 commit に集約見込み。",{"type":38,"text":136},"test 計画",{"type":56,"ordered":138,"items":139},true,[140,141,142],"既存 cargo test (23 件) が全 pass (encode-only path を opt-in にしてあれば自動的に通る)","新 batched path 用の test を追加 (e.g., \u003Ccode>forward_batched_matches_unbatched\u003C\u002Fcode>): 同 input で旧 path と新 path を実行、結果が bit-identical か近似一致","smoke 500-iter (lego sh=3) で loss が変動しない確認 (A.10 Kahan で見たような compiler 最適化挙動の有無を check)",{"type":38,"text":144},"bench 計画",{"type":41,"text":146},"A.4 完了後の GPU 空き時間で:",{"type":56,"ordered":138,"items":148},[149,150,151],"baseline: M-3.x lego 30k = 24.842 dB \u002F 23m40s","ICB ON: 30k = ? \u002F ? (target -10% wallclock or better)","PSNR drift &lt; 0.05 dB (なければ commit OK)",{"type":38,"text":153},"想定リスク",{"type":56,"items":155},[156,157,158],"1 cmd buffer に複数 encoder を入れる場合、各 encoder の \u003Ccode>end_encoding()\u003C\u002Fcode> を忘れると Metal が panic、慎重に","\u003Ccode>wait_until_completed()\u003C\u002Fcode> を呼ぶタイミング: encode-only path では呼ばない、最後の commit で呼ぶ","ssim \u002F loss の中間 readback (host) が必要なら chain breakable、最初は forward \u002F backward 単独 chain に絞る",{"type":38,"text":160},"卒論への含意",{"type":41,"text":162},"第 3 軸 (Apple Silicon 固有最適化) の追加 row。M-3.x baseline 23m40s → ICB ICB X m Y s と書ければ評価表が 1 行充実。",{"type":41,"text":164},"正の効果なら第 3 軸論を補強 (commit overhead は Apple Silicon の特徴)。負の効果なら「commit overhead は M4 Max では既に十分小さく、batching 効果は marginal」という finding として記録 (A.10 と同レベルの honest negative finding)。",{"type":38,"text":166},"関連",{"type":56,"items":168},[169,170,171],"A.10 Kahan Negative finding: \u003Ccode>a-10-kahan-negative.md\u003C\u002Fcode>","A.5 final ablation 表 第 3 軸: \u003Ccode>final-ablation-table.md\u003C\u002Fcode>","A.9 f16 forward prototype 実装済 (env \u003Ccode>SPLAT_F16_FORWARD=1\u003C\u002Fcode> 切替): bench は A.4 完了後",[173],{"id":25,"title":25,"subtitle":174,"date":175,"workspace":176,"tags":177,"verdict":181,"psnr":182,"psnr_unit":-1,"wallclock":183,"splats":184,"summary_url":185,"detail_path":185},"A.8 SH degree ablation — sh_degree=3 (DC only, no view-dependence)","2026-05-22","splat",[178,179,180,16],"sh-ablation","lego-30k","sh-3","partial",24.87872886657715,"23m 13s",83734,"\u002Fruns\u002Flego-sh3-30k\u002F",[187],{"id":27,"title":188,"date":9,"status":189,"polarity":190,"category":191,"axes":192,"tags":193,"task_code":198,"related_runs":199,"delta_psnr":200,"delta_wallclock":201,"rank":202,"verdict":203,"impact_summary":204,"detail_path":205},"A.10 Kahan summation — Metal compiler が compensator を最適化消去","stable","negative","experiment",[14],[16,194,195,196,197],"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",1782449788619]