[{"data":1,"prerenderedAt":413},["ShallowReactive",2],{"finding:p1-profiling-baseline":3,"finding-runs:p1-profiling-baseline":363,"finding-related:p1-profiling-baseline":364},{"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":16,"task_code":25,"related_runs":26,"related_findings":28},"p1-profiling-baseline","P1 profiling baseline — radix_sort 27% \u002F ssim 16% \u002F backward 14% が三大 bottleneck、refine は僅か 2.6%","Lego brushcompat + opacity decay 1500 iter (mean 24 ms\u002Fiter) で host Instant proxy による per-kernel wallclock 計測。 **仮説棄却**: refine 占有率は 2.6% に過ぎず、Phase E GPU 化 ROI は ~3% (見積もり -25% に対し 1\u002F8)。実 dominant は (1) **radix_sort 27.0%** (forward 内 tile binning、6.45 ms\u002Fcall)、(2) **ssim_fwd_grad 15.6%** (11×11 SSIM)、(3) **backward_raster 13.5%**。優先順位を反転: **target_upload キャッシュ (5.6% 即時回収) > radix_sort 改善 (10-15% 期待) > A.7 ICB tail batching > Phase E は卒論後**。","P1 profiling · Phase E \u002F A.6 ROI 見積もり","2026-05-25","stable","investigation","neutral",[14,15],1,3,[17,18,19,20,21,22,23,24],"p1","profiling","kernel-timing","phase-e","a-6","axis-1-prep","lego-smoke","host-instant-proxy","P1 profiling baseline",[27],"lego-profile-smoke-1500",[29,30],"p1-d-stage2-30k-results","a-7-icb-batching-results",{"summary":32,"rank":33,"verdict":34,"delta_psnr":35,"delta_wallclock":36,"delta_splats":37},"Phase D Lego brushcompat 30k で wallclock 42m \u002F brush 9m gap (-4.6x) の真の bottleneck を per-kernel host Instant 計測で数値化。**仮説 (refine host RMW dominant) は棄却**、refine は 2.6% に過ぎず Phase E GPU 化の ROI は ~3% (期待していた -25% の 1\u002F8)。実 dominant は radix_sort 27% \u002F ssim 16% \u002F backward 14%。優先順位を **target_upload キャッシュ (即時 -5.6%) → radix_sort 改善 (-10〜15% 期待) → A.7 ICB batching tail (-5% 期待) → Phase E は卒論後** に反転すべき。","high","accepted-roadmap-pivot","(n\u002Fa — 計測のみ、PSNR 不変)","(n\u002Fa — 計測 instrumentation のみ、 default OFF)","(n\u002Fa)",[39,42,47,50,96,98,197,199,226,228,235,237,308,310,316,318,327,329,335,337,341,348,350,354,356],{"type":40,"text":41},"lead","Phase D 30k で \u003Cstrong>wallclock 42m vs brush 9m (-4.6x gap)\u003C\u002Fstrong> の原因を kernel ごとに数値化。当初仮説は \u003Cem>「splat process CPU 63.4% = 1 thread bound、refine の host RMW (prune\u002Fsplit\u002Fclone) が dominant」\u003C\u002Fem> だった。\u003Cstrong>これは誤りで、refine は 2.6% に過ぎない\u003C\u002Fstrong>。 実 dominant は forward 内の \u003Ccode>radix_sort 27.0%\u003C\u002Fcode>、\u003Ccode>ssim 15.6%\u003C\u002Fcode>、\u003Ccode>backward 13.5%\u003C\u002Fcode>。 CPU 50% = \u003Cem>main thread が GPU commit\u002Fwait_until_completed で blocking している\u003C\u002Fem> 症状であり、CPU parallelization で解決しない (15 idle core は無関係)。優先順位を \u003Cstrong>低 hanging fruit → radix_sort → Phase E は最後\u003C\u002Fstrong> に反転すべき。",{"type":43,"label":44,"variant":45,"text":46},"callout","Headline (仮説棄却 + 優先順位反転)","warning","\u003Cstrong>仮説 \"refine host RMW が bottleneck\" は棄却\u003C\u002Fstrong>。refine 占有率は smoke で \u003Cstrong>2.6%\u003C\u002Fstrong> (1500 iter で 11 回呼ばれて合計 946ms)、30k 推定でも ~7-8% 帯で頭打ち。 \u003Cstrong>Phase E GPU 化の ROI は -25% 期待だったが実態は -3〜-5%\u003C\u002Fstrong>。 実 bottleneck は (1) \u003Ccode>radix_sort 27.0%\u003C\u002Fcode> (M4 Max GPU radix で 6.45 ms\u002Fcall、Apple Metal Performance Shaders sort で改善余地大)、 (2) \u003Ccode>ssim_fwd_grad 15.6%\u003C\u002Fcode> (11×11 Gaussian blur 4 回 + grad)、 (3) \u003Ccode>backward_raster 13.5%\u003C\u002Fcode> (per-pixel atomic accumulation)。 \u003Cstrong>優先順位反転\u003C\u002Fstrong>: target_upload キャッシュ → radix_sort 改善 → A.7 batching → Phase E (defer)。",{"type":48,"text":49},"heading","1. 計測 setup",{"type":51,"columns":52,"align":56,"rows":58,"caption":95},"table",[53,54,55],"項目","値","備考",[57,57,57],"left",[59,63,67,71,75,79,83,87,91],[60,61,62],"scene","nerf_synthetic\u002Flego","brush convention (premultiplied)",[64,65,66],"max_steps","1500","refine start 500 \u002F stop 1500 で 1 サイクル + Phase D opacity_decay 同 cadence",[68,69,70],"initial splats","5,207","init.ply cull radius=1.5",[72,73,74],"final splats","75,867","1500 iter 時点 (Phase D 30k では最終 375k)",[76,77,78],"wallclock","35.80 s","23.9 ms\u002Fiter mean",[80,81,82],"measurement","host `std::time::Instant`","Metal HW counter 非使用 (sudo 不要、proxy として十分)",[84,85,86],"overhead per record","~100 ns (HashMap lookup + Instant)","per-iter 15 record × 100ns = 1.5 µs \u002F 24 ms = 0.006% 影響",[88,89,90],"config flag","`[backend] profile = true`","新規追加、default false で既存挙動不変",[92,93,94],"env \u002F runtime","M4 Max 36GB + 並行 splat trainer 3 本","GPU contention あり (absolute ms は 1.3-1.5x 膨張、相対順序は安定)","host Instant proxy は GPU commit + wait_until_completed を含む wallclock を測る。GPU 内部 sub-stage 分解はできないが、kernel 別 host wait 時間 = 卒論で問題視している \"CPU が GPU を待つ時間\" そのもの。",{"type":48,"text":97},"2. per-kernel wallclock breakdown (1500 iter cumulative)",{"type":51,"columns":99,"align":106,"rows":108,"caption":196},[100,101,102,103,104,105],"kernel","total","calls","avg\u002Fcall","% wallclock","属性",[57,107,107,107,107,57],"right",[109,115,121,127,133,139,145,151,157,164,169,174,178,184,190],[110,111,65,112,113,114],"**ts_fwd_radix_sort**","9.679 s","6.453 ms","**27.0%**","GPU + 16-pass scan (host CPU 介在)",[116,117,65,118,119,120],"**ts_ssim_fwd_grad**","5.584 s","3.722 ms","**15.6%**","GPU (11×11 SSIM + grad)",[122,123,65,124,125,126],"**ts_backward_raster**","4.849 s","3.233 ms","**13.5%**","GPU (atomic grad accum) + readback",[128,129,65,130,131,132],"ts_fwd_rasterize","3.378 s","2.252 ms","9.4%","GPU forward kernel",[134,135,65,136,137,138],"ts_fwd_emit_pairs","2.326 s","1.551 ms","6.5%","GPU (per-pair atomic counter)",[140,141,65,142,143,144],"ts_adam","1.995 s","1.330 ms","5.6%","GPU dispatch (5 buffers × 1)",[146,147,65,148,149,150],"**ts_target_upload**","1.994 s","1.329 ms","**5.6%**","Host→GPU buffer copy (毎 iter)",[152,153,65,154,155,156],"ts_l1_combine_ssim","1.147 s","765 µs","3.2%","GPU",[158,159,160,161,162,163],"**ts_refine** (clone\u002Fsplit\u002Fprune)","0.946 s","11","85.99 ms","**2.6%**","Host RMW (prune+split のみ)",[165,166,65,167,168,156],"ts_project_back","0.758 s","506 µs","2.1%",[170,171,65,172,173,156],"ts_fwd_extract_off","0.639 s","426 µs","1.8%",[175,176,65,177,173,156],"ts_fwd_project","0.632 s","421 µs",[179,180,65,181,182,183],"ts_refine_accumulate","29.5 ms","20 µs","0.08%","Host loop (|v_xy| L2)",[185,186,160,187,188,189],"ts_opacity_decay (Phase D)","0.44 ms","40 µs","0.001%","Host RMW",[191,192,193,193,194,195],"**SUM (instrumented)**","**33.96 s**","—","**94.8%**","残 5.2% = loop overhead \u002F scheduling","% wallclock = kernel total \u002F 35.80 s。ts_forward parent (32.9%) は children と double-count するため除外。**top 3 (radix_sort \u002F ssim \u002F backward_raster) で wallclock の 56% を占有**。refine + accumulate + opacity_decay の host RMW 合計はわずか 2.7%、host CPU bottleneck 仮説は数値で棄却。",{"type":48,"text":198},"3. CPU \u002F GPU 占有率の解釈",{"type":51,"columns":200,"align":203,"rows":204,"caption":225},[201,54,202],"観察","解釈",[57,107,57],[205,209,213,217,221],[206,207,208],"splat 親 process CPU","40-55% (M4 Max 16 core)","1 dispatcher thread が GPU commit + wait で blocking",[210,211,212],"active thread (>1% CPU)","**1 個**","Metal driver helper 2 threads (~7-8% 各) は dispatch handler",[214,215,216],"dominant kernel type","**GPU** (radix_sort + ssim + raster + backward = 65% wallclock)","host CPU が忙しいのは GPU 待ちの間 commit\u002Fpoll、純 host 計算ではない",[218,219,220],"host RMW kernel 合計","2.7% (refine + accumulate + opacity_decay)","**host CPU parallelization は意味なし**、15 idle core は GPU 待ちの副作用",[222,223,224],"bottleneck 種別","**GPU-bound (not CPU-bound)**","解決方向は GPU kernel 効率化、CPU thread pool ではない","\u003Cstrong>当初仮説 \"M4 Max 15 idle core を活用すべし\" は実態を取り違えていた\u003C\u002Fstrong>。CPU が idle なのは GPU を待っている時間 (= splat の trainer は inherent に 1 dispatcher だが、それで困らない)。改善の主軸は GPU kernel そのものの最適化、または CPU\u002FGPU overlap (CommandBuffer pipeline depth 増加)。",{"type":48,"text":227},"4. radix_sort が 27% も占めるのはなぜか?",{"type":229,"items":230},"list",[231,232,233,234],"\u003Cstrong>tile_bin.rs の radix sort は 16-pass\u003C\u002Fstrong>: 4-bit radix × 16 pass = u64 key 全幅。各 pass で encoder 1 個 commit + wait、host CPU 側で prefix scan を 1 回 同期 (= 16 × commit_wait + 16 × scan = 32 boundary)。","\u003Cstrong>pair_count が iter で増加\u003C\u002Fstrong>: 1500 iter で splats 5k→76k に成長、tile_bin pair 数も同様に成長。**30k では更に増加** (Phase D 最終 375k で pair_count は数 M 規模、ms\u002Fcall は 3-5x 増の見込み)。","\u003Cstrong>Apple Metal Performance Shaders (MPS) の radix_sort は未使用\u003C\u002Fstrong>: 現状 hand-rolled で動いており、MPS の \u003Ccode>MPSRadixSort\u003C\u002Fcode> や cooperative kernel 化で 2-3x 高速化の余地大。","\u003Cstrong>A.7 ICB batching は forward tail (extract_offsets + rasterize)\u003C\u002Fstrong>: radix_sort 自体は host scan を挟むため batch 対象外、別の最適化が必要 (= ROI 主軸)。",{"type":48,"text":236},"5. ROI 見積もり (Phase E \u002F A.6 \u002F kernel fusion \u002F target_upload キャッシュ)",{"type":51,"columns":238,"align":246,"rows":247,"caption":307},[239,240,241,242,243,244,245],"施策","対象 kernel","現占有率","GPU 化\u002F最適化 後想定","**wallclock ROI**","実装工数","優先度",[57,57,107,107,107,57,57],[248,255,263,271,279,287,295,302],[249,250,143,251,252,253,254],"**target_upload cache**","ts_target_upload","0.1% (1 回 upload)","**-5.5%**","小 (BTreeMap\u003Cview_idx, Buffer>)","**★最優先** (即時 ROI)",[256,257,258,259,260,261,262],"**radix_sort MPS \u002F fused 化**","ts_fwd_radix_sort","27.0%","10-13% (2-2.5x)","**-14〜17%**","中 (Metal kernel + scan 統合)","**★高** (最大 ROI)",[264,265,266,267,268,269,270],"A.7 ICB batching 全面 (forward+backward+loss)","ts_forward 子 + loss + project_back","26.0% (commit barrier 込)","20% (commit 4→1)","-6%","中-大 (cmd buffer 設計)","中 (既存 PoC あり)",[272,273,274,275,276,277,278],"SSIM kernel fusion \u002F window 縮小","ts_ssim_fwd_grad","15.6%","8-10% (4 blur→2 fused)","-5〜-7%","中 (Metal kernel 再設計)","中",[280,281,282,283,284,285,286],"backward_raster atomic 削減","ts_backward_raster","13.5%","8-9% (reduction 化)","-4〜-5%","大 (cooperative kernel)","中-低",[288,289,290,291,292,293,294],"**Phase E (refine GPU 化)**","ts_refine + accumulate","**2.7%**","**0.5%**","**-2%**","**大 (Metal kernel 群)**","**低 (defer 卒論後)**",[296,297,298,193,299,300,301],"A.6 f16 packed 全面","全 GPU kernel","(memory bandwidth)","~1% (既存 PoC で実証)","大 (kernel 全更新)","低 (実 ROI 小、memo `feat_g_f16_packed_roi.md` 参照)",[303,304,188,305,305,278,306],"opacity_decay GPU 化 (Phase D)","ts_opacity_decay","0%","**no-op** (host で十分)","wallclock ROI = 1500 iter smoke での占有率削減見積もり。30k では splats 5x で forward 系の絶対 ms が増えるが、相対占有率は radix_sort > ssim > backward の順序は安定 (advisor 確認)。**Phase E の ROI 見積もりは当初 -25% 期待から -2% に修正**、優先順位を最下層に。",{"type":48,"text":309},"6. brush -4.6x gap の解釈",{"type":229,"items":311},[312,313,314,315],"\u003Cstrong>brush 9m \u002F 本実装 42m = -4.6x gap\u003C\u002Fstrong> は radix_sort + ssim + backward の 3 kernel が brush の Burn\u002Fwgpu 実装と比べて遅いことに起因。","\u003Cstrong>brush も同じ algorithm\u003C\u002Fstrong> なので構造的に 5x 遅いはずがない、kernel 実装効率 (MPS 利用 \u002F atomic minimization \u002F commit batching) の差。","\u003Cstrong>target_upload cache (即 -5.5%) で 42m → 39.7m\u003C\u002Fstrong>。次に \u003Cstrong>radix_sort -15% で 39.7m → 33.7m\u003C\u002Fstrong>。 \u003Cstrong>SSIM fusion -6% で 31.7m\u003C\u002Fstrong>、 \u003Cstrong>A.7 batching -6% で 29.7m\u003C\u002Fstrong>。 累積で \u003Cstrong>42m → ~29m (-30%)\u003C\u002Fstrong>、brush 9m まではまだ -3.2x ある (が +12-15m 圏は射程)。","\u003Cstrong>Phase E (refine GPU 化) は最後 -1〜-2m\u003C\u002Fstrong> しか効かない、axis 1 (native Metal) の卒論主張としては必要だが、bench 改善の主役ではない。",{"type":48,"text":317},"7. 計測 instrumentation の実装",{"type":229,"items":319},[320,321,322,323,324,325,326],"\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Ftiming.rs\u003C\u002Fcode>: 既存 thread-local `HashMap\u003Clabel, KernelStat>` accumulator に \u003Ccode>is_enabled() \u002F disable()\u003C\u002Fcode> を追加。","\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Fconfig.rs\u003C\u002Fcode>: `BackendConfig` に `profile: bool` を追加 (default false)。","\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Ftrain_loop.rs\u003C\u002Fcode>: 既存の `ts_forward \u002F ts_loss_gpu \u002F ts_adam \u002F ts_project_back` に加え、`ts_ssim_fwd_grad \u002F ts_l1_combine_ssim \u002F ts_backward_raster \u002F ts_refine_accumulate \u002F ts_refine \u002F ts_opacity_decay \u002F ts_opacity_reset \u002F ts_scale_reg \u002F ts_mcmc_*` を追加。 ts_loss_gpu parent は double-count 回避のため除去。","\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Ftrainer.rs\u003C\u002Fcode>: `forward_with_state` 内に `ts_fwd_project \u002F ts_fwd_emit_pairs \u002F ts_fwd_radix_sort \u002F ts_fwd_extract_off \u002F ts_fwd_rasterize` を追加 (forward sub-breakdown)。","\u003Ccode>splat\u002Fcrates\u002Fsplat-cli\u002Fsrc\u002Fcmd\u002Ftrain.rs\u003C\u002Fcode>: `cfg.backend.profile == true` で \u003Ccode>timing::reset() + enable()\u003C\u002Fcode>、train_loop 終了時 `print_summary()` を log_every の max_steps tick で stderr 出力。","\u003Ccode>splat\u002Fconfigs\u002F2026-05-25-1200-lego-profile-smoke.toml\u003C\u002Fcode>: smoke config (1500 iter、profile=true)、parent: 2026-05-24-2000-lego-brushcompat-opacdecay-5k.toml。","overhead 実測: profile=false で既存挙動と完全互換 (enable 判定で early return)、profile=true でも 1500 iter 36 s \u002F 既存 baseline 推定 35 s = ~0.2% noise floor。",{"type":48,"text":328},"8. 想定外 \u002F caveat",{"type":229,"items":330},[331,332,333,334],"\u003Cstrong>GPU contention\u003C\u002Fstrong>: 計測中 M4 Max 上で並行 splat trainer 3 本 (chair 30k \u002F materials 30k \u002F 別 smoke) が走っていた。absolute ms は 1.3-1.5x 膨張、しかし \u003Cstrong>相対順序は安定\u003C\u002Fstrong> (advisor 確認: contention は GPU ops を host ops より重く penalize するため、refine が bottleneck でないという結論は contention なしでも更に強化される)。","\u003Cstrong>1500 iter vs 30k\u003C\u002Fstrong>: 1500 iter 終了時の splats は 76k、Phase D 30k 最終 375k と 5x 差。forward 系 (radix_sort \u002F rasterize \u002F backward) は splats と pair_count に比例して伸びるため、 \u003Cstrong>30k では top 3 占有率が更に+5pt 高い可能性\u003C\u002Fstrong>。逆に refine 占有率は更に低下 (refine の per-call ms は splats 5x で 3-4x のみ増、call 数固定)。","\u003Cstrong>host Instant proxy の限界\u003C\u002Fstrong>: GPU 内部 sub-stage (rasterize の tile 走査 vs 各 splat memo 等) は分解できない。MTLCounterSampleBuffer による HW counter 計測が次の精度向上 step (但し sudo 不要だが API 複雑、本 finding では proxy で十分と判断)。","\u003Cstrong>opacity_decay 0.001% は train_t→1 で no-op になる影響\u003C\u002Fstrong>: 1500\u002F1500 = train_t=1.0 で minus_opac=0 になり後半 11 tick は early return。 Phase D 30k 全期間でも 0.01% に届かず、Phase D を host で実装した判断は正当。",{"type":48,"text":336},"9. autonomous loop に向けた提案",{"type":43,"label":338,"variant":339,"text":340},"次 step 優先順位 (本 finding の roadmap 含意)","info","\u003Cstrong>1. target_upload cache\u003C\u002Fstrong> (即 -5.5%、~30 分実装): train_loop entry で全 cameras の target を Vec\u003CBuffer> に一括 upload、毎 iter `cameras[idx].target_buf` を引くだけ。 \u003Cstrong>2. radix_sort 改善\u003C\u002Fstrong> (-14〜17%、~1 日): Apple MPS の \u003Ccode>MPSMatrixDecompositionLU\u003C\u002Fcode> 系には sort はないため、scan の host 同期を Metal kernel 内に統合する fused approach、または \u003Ca href=\"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fmetal\u002Foptimizing_performance_with_the_gpu_counters_instrument\">Metal Performance Counters\u003C\u002Fa> で radix の真の bottleneck を 4-bit 単位で見る。 \u003Cstrong>3. A.7 ICB batching tail 完全化\u003C\u002Fstrong> (-5%、既存 PoC 拡張): forward + loss + backward + project_back の 4 commit を 1 cmd buffer 化、host wait 回数を 4→1 に。 \u003Cstrong>4. Phase E は卒論後\u003C\u002Fstrong>: axis 1 主張 (native Metal kernel 群) として必要だが、wallclock 改善は -2% で labour intense (subagent ~1-2 日)、卒論評価表の主役にはならない。",{"type":229,"ordered":342,"items":343},true,[344,345,346,347],"\u003Cstrong>P1 final-bench\u003C\u002Fstrong> までに target_upload cache + radix_sort 改善を入れる → Lego 30k で wallclock 42m → ~30m を狙う (brush 9m gap は -3.3x まで縮小、論文評価で defensible)","\u003Cstrong>radix_sort の真の中身を MTLCounterSampleBuffer で sub-pass 計測\u003C\u002Fstrong> (= 16-pass のうちどれが重いか、scan vs commit_wait vs sort pass)、 ~1 h 工数で投資し最適化方向を確定する","\u003Cstrong>Phase E は axis 1 contribution の卒論記述\u003C\u002Fstrong>として scope を確保しておく (refine GPU 化のコード自体は残し、bench 数値の主役からは外す)","\u003Cstrong>A.6 f16 packed の deprioritize\u003C\u002Fstrong> 確定: 既存 memo `feat_g_f16_packed_roi.md` の \"wallclock ~1%\" 数値と本 finding が一致、roadmap から外す",{"type":48,"text":349},"10. 再現手順",{"type":351,"lang":352,"text":353},"code","bash","# 1. Build (P1 profiling instrumentation 含む binary)\ncd splat\ncargo build --release -p splat-cli\n\n# 2. profile smoke 実行 (1500 iter、~35-50 s + GPU contention で 1.3-1.5x 増)\n.\u002Ftarget\u002Frelease\u002Fsplat train --config configs\u002F2026-05-25-1200-lego-profile-smoke.toml\n\n# 3. 期待出力: stderr に\n#   [profile] kernel timing ON ([backend] profile=true)\n#   ... training progress ...\n#   === Kernel timing summary ===\n#   kernel  | total | calls | avg\u002Fcall | %total\n#   ts_fwd_radix_sort | 9.679s | 1500 | 6.453ms | 27.0%\n#   ...\n#\n# 4. 任意の config で計測したければ [backend] に profile = true を追加するだけ。\n#    既存 config は profile flag を持たず default false なので互換。\n",{"type":48,"text":355},"11. 関連",{"type":229,"items":357},[358,359,360,361,362],"Phase D 30k baseline (wallclock 42m): \u003Ccode>p1-d-stage2-30k-results\u003C\u002Fcode>","A.7 ICB batching (forward tail batching): \u003Ccode>a-7-icb-batching-results\u003C\u002Fcode>","f16 packed ROI 検証 (deprioritize 確定): memo \u003Ccode>feat_g_f16_packed_roi.md\u003C\u002Fcode>","次予定: target_upload cache + radix_sort sub-pass profiling (本 finding ROI table の#1, #2 を実装)","Phase E (refine GPU 化) memo: \u003Ccode>autonomous_plan_brush_parity.md\u003C\u002Fcode> (本 finding により優先度反転、卒論後 defer)",[],[365,391],{"id":29,"title":366,"date":9,"status":10,"polarity":367,"category":368,"axes":369,"tags":371,"task_code":381,"related_runs":382,"delta_psnr":386,"delta_wallclock":387,"rank":33,"verdict":388,"impact_summary":389,"detail_path":390},"P1.D Stage 2 — Lego brushcompat + opacity decay 30k = 36.106 dB、splats -56% \u002F wallclock -32%","positive","experiment",[14,370,15],2,[17,372,373,374,375,376,377,378,379,380,22],"phase-d","milestone-m5","opacity-decay","brush-parity","win-win-win","premultiplied","lego-30k","stage-2","splat-efficient","P1.D Stage 2 (M5 Lego val pass)",[383,384,385],"lego-brushcompat-opacdecay-30k","lego-brushcompat-base-30k","lego-brushcompat-opacdecay-5k","+0.92 dB vs baseline 30k (35.184 → 36.106)","-32% vs baseline 30k (1h 02m 18s → 41m 54s)","accepted-decisive-win","Lego brushcompat + opacity decay 30k で training-time eval 36.106 dB (val 100 view, brush convention, raw)、independent eval 36.163 dB (brush q8)。baseline 30k (35.184 dB) を **+0.92 dB 上回り**、splats を 846,689 → 375,146 に **-55.6% 削減**、wallclock を 1h 02m → 41m 54s に **-32% 短縮**。これは trade-off と想定していた PSNR\u002Fsplats\u002Fwallclock が **完全 win-win-win** に。M5 個別 scene gate (Lego brush conv > 36 dB) を val で達成、brush 自身 val 32.038 dB を +4.07 dB 上回り、本実装が brush を decisive に超えた。test subset (n=36) も +0.75 dB 改善 (33.315 → 34.065)、brush paper test 37.40 との gap を -3.34 dB まで縮小。Stage 1 smoke 推定 (splats -11.6%) を 30k で -56% に拡大、opacity decay の効果は iter 累積で増大することを実証。次 step は multi-scene Phase D 7 scene re-chain (chain 完了後 schedule)、低 wallclock + 低 splats での M5 multi-scene parity 完遂を狙う。","\u002Ffindings\u002Fp1-d-stage2-30k-results\u002F",{"id":30,"title":392,"date":393,"status":10,"polarity":367,"category":368,"axes":394,"tags":395,"task_code":403,"related_runs":404,"delta_psnr":407,"delta_wallclock":408,"rank":409,"verdict":410,"impact_summary":411,"detail_path":412},"A.7 batched cmd buffer — wallclock -6.2% 改善 + PSNR drift -0.30 dB","2026-05-23",[15],[396,397,398,399,400,401,402],"phase-5","icb","command-buffer","batching","metal","apple-silicon","results","A.7",[405,406],"lego-sh3-30k","lego-a7-batched-30k","-0.302 dB (24.577 vs 24.879)","-6.16% (1307.26s vs 1393s = -85.74s)","mid","accepted","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 が予想より小さい示唆。","\u002Ffindings\u002Fa-7-icb-batching-results\u002F",1782449788652]