[{"data":1,"prerenderedAt":346},["ShallowReactive",2],{"finding:p1-e-refine-gpu-smoke":3,"finding-runs:p1-e-refine-gpu-smoke":263,"finding-related:p1-e-refine-gpu-smoke":264},{"meta":4,"impact":35,"sections":42},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":25,"related_runs":26,"related_findings":30},"p1-e-refine-gpu-smoke","P1.E refine GPU 化 hypothesis を SPLAT_TIMING profile で falsified — refine 寄与は \u003C1%、真の bottleneck は forward 60% + loss 28%","task の前提「refine の host RMW = CPU 1-thread bound = wallclock -5x の余地」を `SPLAT_TIMING=1` を導入して 5k smoke で実測したところ、refine 系 ops (compact + accumulate + opacity_decay) の合計 wallclock 寄与は **\u003C1%** と判明。真の bottleneck は forward (60.1%) + loss_gpu (28.0%) + adam\u002Ftarget_upload (~10%) で、refine を完璧に GPU 化しても全体 wallclock は **誤差レベル** しか変わらない。Phase E は方針を切替えて (1) `SPLAT_TIMING=1` env で kernel timing を有効化する instrumentation を追加、(2) forward を 5 sub-kernel に分割計測して bottleneck の解像度を上げ、(3) **demo kernel として `refine_opacity_decay.metal` を実装** (kernel + Rust pipeline + `refine.gpu_path` flag の plumbing pattern を validate)、(4) GPU\u002FCPU 経路の bit-close 検証 (max diff \u003C 1e-3、5k full PSNR delta -0.21 dB = 許容内) を実証。卒論 narrative としては「Metal kernel 直叩きの limit を測定した負の finding」として価値あり (memory `autonomous_plan_brush_parity.md` の P1.E 想定通り)。次 step (Phase F) は forward subdivision で判明した `ts_fwd_sort` 15.5% \u002F `ts_fwd_emit` 12.8% の tile-binning chain と、5x sequential `cmd.wait` の Adam batching が target。","P1 Phase E · refine GPU profile · hypothesis falsified","2026-05-25","stable","experiment","negative",[14],1,[16,17,18,19,20,21,22,23,24],"p1","phase-e","refine-gpu","negative-finding","kernel-profile","axis-1-limit","opacity-decay-gpu","kernel-plumbing","lego-5k","P1.E refine GPU 化 (axis 1 core contribution)",[27,28,29],"p1-e-profile-1k","p1-e-profile-5k","p1-e-gpu-decay-5k",[31,32,33,34],"p1-d-stage2-30k-results","p1-d-opacity-decay-smoke","p1-b-f-stage2-30k-results","m4-brush-bench",{"summary":36,"rank":37,"verdict":38,"delta_psnr":39,"delta_wallclock":40,"delta_splats":41},"Phase D 30k 実測 wallclock 41m54s vs brush 9m08s = -4.6x gap の原因について、task は `splat process CPU 63.4% = 1 core only` → 「refine の host RMW loop が CPU 1-thread bound」と仮説立てた。本 Phase E ではこの仮説を SPLAT_TIMING profile で実測。5k smoke (84k splats、p1-e-profile-5k.toml) の kernel breakdown: **ts_forward 60.1% (123s) \u002F ts_loss_gpu 28.0% (57s) \u002F ts_adam 4.8% (9.9s) \u002F ts_target_upload 3.9% (8.1s) \u002F ts_project_back 2.3% (4.75s) \u002F ts_refine_compact 0.6% (1.14s, 103ms\u002Fcall × 11) \u002F ts_refine_accumulate 0.3% (605ms) \u002F ts_opacity_decay 0.0046% (957µs)**。**refine 全体で \u003C1%** = refine を完璧に GPU 化しても全体 wallclock は -1% も短縮されない。代わりに demo kernel として `refine_opacity_decay.metal` を実装し、kernel + Rust pipeline + `refine.gpu_path` flag plumbing pattern を validate (CPU vs GPU max diff 1.5e-5、5k full PSNR delta -0.21 dB = 許容内)。Phase F の真の target は (a) forward subdivision で判明した tile-binning chain (`ts_fwd_sort 15.5% + ts_fwd_emit 12.8%`)、(b) Adam の 5x sequential `cmd.wait_until_completed` (1 cmd buffer 化で ~5% 削減期待)、(c) target_upload preload (~4% 削減期待) の 3 つ。","high","accepted-negative-redirect-phase-f","-0.21 dB (CPU 31.92 → GPU 31.71、5k smoke、bit-close 内 RNG cascade)","+1.4% (CPU 144.32s → GPU 146.32s、5k smoke、opacity_decay は 0.005% で誤差)","-0.5% (CPU 84629 → GPU 84236、bit-close 内 refine prune cascade 差)",[43,46,51,54,139,141,175,177,189,191,226,228,232,234,240,242,246,248,255,257],{"type":44,"text":45},"lead","本 Phase E は task framing「refine の host RMW loop が wallclock -5x の余地」を \u003Cstrong>SPLAT_TIMING profile で falsified\u003C\u002Fstrong> させた。5k smoke の breakdown で refine 系 ops の合計寄与は \u003Cstrong>\u003C1%\u003C\u002Fstrong>、真の bottleneck は forward 60% + loss 28%。代わりに demo kernel として `refine_opacity_decay.metal` を実装し kernel plumbing pattern を validate、Phase F (真の bottleneck) に向けた forward subdivision profile を残した。卒論 axis 1 narrative の「Metal kernel 直叩きの limit」を測定値として確定する負の finding。",{"type":47,"label":48,"variant":49,"text":50},"callout","Headline — refine GPU 化 hypothesis falsified","warning","\u003Cstrong>SPLAT_TIMING profile (5k smoke, 84k splats) で refine 系 ops の wallclock 寄与は \u003C1%\u003C\u002Fstrong>: \u003Ccode>ts_refine_compact 0.6%\u003C\u002Fcode> \u002F \u003Ccode>ts_refine_accumulate 0.3%\u003C\u002Fcode> \u002F \u003Ccode>ts_opacity_decay 0.005%\u003C\u002Fcode>。一方 \u003Ccode>ts_forward 60.1%\u003C\u002Fcode> + \u003Ccode>ts_loss_gpu 28.0%\u003C\u002Fcode> が dominant。\u003Cstrong>refine を fully GPU 化しても全体 wallclock は誤差レベル (~-1%) しか変わらない\u003C\u002Fstrong>。axis 1 contribution は方針転換: (a) Phase F で tile-binning chain (sort 15.5% + emit 12.8% = 28%) を target、(b) demo kernel `refine_opacity_decay.metal` で kernel plumbing pattern を validate (CPU vs GPU bit-close 1.5e-5、PSNR delta -0.21 dB \u002F 許容内)。",{"type":52,"text":53},"heading","1. SPLAT_TIMING profile (5k smoke、Lego brushcompat opacity_decay 0.004)",{"type":55,"columns":56,"align":62,"rows":65,"caption":138},"table",[57,58,59,60,61],"kernel","total wallclock","calls","avg \u002F call","% total",[63,64,64,64,64],"left","right",[66,72,77,82,87,92,97,102,107,112,117,123,128,133],[67,68,69,70,71],"**ts_forward (total)**","**123.146s**","5000","24.629ms","**60.1%**",[73,74,69,75,76],"  — ts_fwd_sort","33.839s","6.768ms","15.6%",[78,79,69,80,81],"  — ts_fwd_emit","27.511s","5.502ms","12.7%",[83,84,69,85,86],"  — ts_fwd_rasterize","11.598s","2.320ms","5.4%",[88,89,69,90,91],"  — ts_fwd_project","3.179s","635µs","1.5%",[93,94,69,95,96],"  — ts_fwd_offsets","2.072s","414µs","1.0%",[98,99,69,100,101],"**ts_loss_gpu**","57.374s","11.475ms","**28.0%**",[103,104,69,105,106],"**ts_adam**","9.893s","1.979ms","**4.8%**",[108,109,69,110,111],"ts_target_upload","8.053s","1.611ms","3.9%",[113,114,69,115,116],"ts_project_back","4.750s","950µs","2.3%",[118,119,120,121,122],"**ts_refine_compact**","**1.137s**","11","103.4ms","**0.6%**",[124,125,69,126,127],"**ts_refine_accumulate**","**605ms**","121µs","**0.3%**",[129,130,120,131,132],"**ts_opacity_decay (CPU)**","**957µs**","87µs","**0.005%**",[134,135,136,136,137],"TOTAL (sum)","204.958s","—","100%","Lego 5k smoke (84,329 final splats, 31.99 dB)、`SPLAT_TIMING=1 .\u002Ftarget\u002Frelease\u002Fsplat train --config configs\u002F2026-05-25-p1-e-profile-5k.toml`。**refine 系 ops の合計は 1.74s \u002F 204s ≈ 0.85%**。forward 内訳の tile-binning chain (sort + emit) が 28% で次の Phase F target。 (sum) は再帰 inclusion で実 wallclock 144.32s より大きい — sub-kernel が parent ts_forward に二重計上されているため。",{"type":52,"text":140},"2. 仮説 vs 実測 (refine GPU 化 ROI)",{"type":55,"columns":142,"align":147,"rows":148,"caption":174},[143,144,145,146],"項目","task 仮説","実測 (5k smoke)","判定",[63,63,63,63],[149,154,159,164,169],[150,151,152,153],"refine の host RMW = bottleneck","wallclock の主因","0.85% (compact + accumulate + decay)","**falsified**",[155,156,157,158],"CPU 63.4% = 1 core only","refine RMW で 1-thread bound","実測 ~42-51% (M4 Max 16 core 中 0.4-0.5 core)","**GPU dispatch wait** で thread block 中 (CPU 使ってない)",[160,161,162,163],"refine fully GPU 化 → wallclock -5x","42m → 9m (brush parity)","上限 -1% (refine 全体が 0.85% のため)","**not achievable**",[165,166,167,168],"axis 1 contribution = refine kernel","split \u002F clone \u002F decay の Metal 化","demo `refine_opacity_decay.metal` のみ","**方針転換** (Phase F へ)",[170,171,172,173],"axis 1 真の target","(未定義)","forward tile-binning chain 28%","**Phase F の中心**","task 仮説は `axis 1 contribution = refine kernel` を前提としていたが、SPLAT_TIMING の実測で **refine は wallclock の 1% 未満** = どれだけ最適化しても全体への影響は誤差レベル。Phase F で tile-binning chain (sort 15.5% + emit 12.8%) を target にすべき。`ps -o pcpu` 実測で splat process CPU% は 42-51% (M4 Max 16 core 中 0.4-0.5 core) で task 説明の 63.4% と整合。ただしこれは「1 thread が CPU を専有」ではなく **GPU dispatch 待ちで thread が `wait_until_completed()` ブロックしている状態** で、CPU 並列化では解決しない。",{"type":52,"text":176},"3. 実装内容 (demo kernel + instrumentation)",{"type":178,"ordered":179,"items":180},"list",true,[181,182,183,184,185,186,187,188],"\u003Ccode>shaders\u002Fopt\u002Frefine_opacity_decay.metal\u003C\u002Fcode>: brush 互換 opacity decay (sigmoid-space) を element-wise kernel として実装。30 行 MSL、1 thread \u002F 1 splat。","\u003Ccode>crates\u002Fsplat-metal\u002Fsrc\u002Fkernels\u002Frefine.rs\u003C\u002Fcode>: `RefineOps` struct (Library + PSO 保持) + `dispatch_opacity_decay()` (adam.rs と同 pattern)。3 unit tests (CPU と max diff 1.5e-5、minus_opac=0 no-op、100 splat ramp 検証) all pass。","\u003Ccode>crates\u002Fsplat-metal\u002Fsrc\u002Fkernels\u002Fmod.rs\u003C\u002Fcode>: `pub mod refine;` 追加。","\u003Ccode>crates\u002Fsplat-train-v1\u002Fsrc\u002Fconfig.rs\u003C\u002Fcode>: `RefineConfig.gpu_path: bool` 追加 (default false で backward compat)。","\u003Ccode>crates\u002Fsplat-train-v1\u002Fsrc\u002Ftrainer.rs\u003C\u002Fcode>: `Trainer.refine_ops: RefineOps` field 追加、`forward_with_state` に 5 つの timing::record 挿入 (`ts_fwd_project \u002F _emit \u002F _sort \u002F _offsets \u002F _rasterize`)。","\u003Ccode>crates\u002Fsplat-train-v1\u002Fsrc\u002Ftrain_loop.rs\u003C\u002Fcode>: `SPLAT_TIMING=1` env で `timing::enable()` + 終了時 `print_summary()`、refine cadence ブロックに `ts_refine_accumulate \u002F ts_refine_compact \u002F ts_opacity_decay[_gpu] \u002F ts_opacity_reset \u002F ts_mcmc_noise` を追加、`refine.gpu_path` flag で opacity_decay GPU 経路に分岐。","\u003Ccode>configs\u002F2026-05-25-p1-e-profile-{1k,5k}.toml\u003C\u002Fcode>: SPLAT_TIMING 計測用 config (gpu_path = false)。","\u003Ccode>configs\u002F2026-05-25-p1-e-gpu-decay-5k.toml\u003C\u002Fcode>: gpu_path = true smoke。CPU baseline 31.92 dB vs GPU 31.71 dB (-0.21 dB \u002F 許容 ±0.5 dB)、wallclock 144→146s (+1.4% noise)、final splats 84629→84236 (-0.5% \u002F bit-close prune cascade)。",{"type":52,"text":190},"4. GPU\u002FCPU bit-close 検証 (unit tests + 5k smoke)",{"type":55,"columns":192,"align":196,"rows":197,"caption":225},[193,194,195,146],"test","条件","結果",[63,63,63,63],[198,203,207,212,217,221],[199,200,201,202],"`opacity_decay_gpu_matches_cpu_formula`","3 splat (σ=0.5\u002F0.9\u002F0.001), minus=0.1","|GPU - 期待| \u003C 1e-4","✅ pass",[204,205,206,202],"`opacity_decay_gpu_zero_is_noop`","2 splat, minus_opac=0","|before-after| \u003C 1e-4",[208,209,210,211],"`opacity_decay_gpu_vs_cpu_100splats`","100 splat ramp, minus=0.05","max |CPU - GPU| 1.5e-5","✅ pass (bit-close)",[213,214,215,216],"5k smoke PSNR delta","Lego, gpu_path on\u002Foff","-0.21 dB","✅ 許容 ±0.5 dB 内",[218,214,219,220],"5k smoke wallclock delta","+1.4% (144.32 → 146.32s)","✅ ~unchanged (noise)",[222,214,223,224],"5k smoke final splats delta","-0.5% (84629 → 84236)","✅ bit-close RNG cascade","GPU \u002F CPU の数値差は f32 sigmoid\u002Flogit の last-bit 程度 (1e-5 帯)。1500 iter で 15 回 cadence 適用すると refine prune の選択が微妙にずれて final splat 数が ±0.5% 変動するが PSNR への影響は ±0.5 dB の許容内。**bit-close 検証としては完全に合格**。",{"type":52,"text":227},"5. 卒論 narrative としての価値 (negative finding の axis 1 限界)",{"type":47,"label":229,"variant":230,"text":231},"axis 1 (native Metal kernel) の正直な limit","info","memory \u003Ccode>autonomous_plan_brush_parity.md\u003C\u002Fcode> は \u003Cstrong>「失敗してもデータ自体は卒論『Metal kernel 直叩きの限界 \u002F 成功例』として価値あり」\u003C\u002Fstrong> を Phase E 設計時に明記。本 Phase E はまさにその「限界の測定」であり、\u003Cstrong>「卒論軸 1 の core contribution は refine の Metal 化ではなく、forward の tile-binning chain (Phase F target、28%) と Adam の cmd buffer batching (5%)」\u003C\u002Fstrong> という方向修正を **実測値ベース** で提示する。SPLAT_TIMING instrumentation + 5 forward sub-kernel timing + demo kernel pattern は、Phase F 以降の「真の bottleneck の最適化」のための **infrastructure 整備** として 100% 流用可能。",{"type":52,"text":233},"6. Phase F target (refine GPU から切り替える)",{"type":178,"ordered":179,"items":235},[236,237,238,239],"\u003Cstrong>tile-binning chain (forward 内 28%)\u003C\u002Fstrong>: `ts_fwd_emit 12.7% + ts_fwd_sort 15.6% = 28.3%` が 5k smoke で wallclock の 1\u002F3 弱。brush は radix sort を GPU 完結 (CPU 16-pass exclusive prefix scan を 1 cmd buffer に統合) しているとされ、本実装は radix の 16 pass 間で CPU 介在あり (trainer.rs:154 周辺、A.7 ICB batching の対象外区間)。Phase F の中心 target。","\u003Cstrong>Adam 5x sequential cmd.wait_until_completed\u003C\u002Fstrong>: `adam.rs::step_buf` line 200 で 5 component それぞれに `cmd.commit() + wait_until_completed()`。1 cmd buffer に統合すれば 5x → 1x wait で `ts_adam 4.8%` の 50-80% 削減見込み (-2〜-4% wallclock)。","\u003Cstrong>ts_target_upload preload (3.9%)\u003C\u002Fstrong>: 毎 iter で同じ GT image を host → GPU に upload。100 view × 800×800×4 = 256 MB と shared memory 上の cache に乗る規模、起動時 1 回の upload に変更で -4% 期待。brush も同様の preload を実装している (要確認)。","\u003Cstrong>Phase E で残した負の finding を卒論 axis 1 章の冒頭に配置\u003C\u002Fstrong>: 「Metal kernel 直叩きの limit を測定する」セクションで \u003Ccode>p1-e-refine-gpu-smoke\u003C\u002Fcode> profile table を引用、Phase F の選択肢を実測値で justify する narrative 構成。",{"type":52,"text":241},"7. 再現手順",{"type":243,"lang":244,"text":245},"code","bash","# 1. Build (Phase E 実装含む)\ncd splat\ncargo build --release -p splat-cli\n\n# 2. 5k smoke CPU baseline (gpu_path = false) + timing\nSPLAT_TIMING=1 .\u002Ftarget\u002Frelease\u002Fsplat train --config configs\u002F2026-05-25-p1-e-profile-5k.toml\n# → ts_refine_compact 0.6% \u002F ts_opacity_decay 0.005% \u002F ts_forward 60.1%\n# → val PSNR 31.92 dB, wallclock 144s\n\n# 3. 5k smoke GPU path (gpu_path = true, opacity_decay GPU 経由)\nSPLAT_TIMING=1 .\u002Ftarget\u002Frelease\u002Fsplat train --config configs\u002F2026-05-25-p1-e-gpu-decay-5k.toml\n# → ts_opacity_decay_gpu 182µs\u002Fcall (CPU 87µs より遅い、dispatch overhead で逆転)\n# → val PSNR 31.71 dB, wallclock 146s, splats 84236\n\n# 4. unit tests (kernel bit-close)\ncargo test --release -p splat-metal --lib refine\n# → 3 tests pass (max diff 1.5e-5)\n",{"type":52,"text":247},"8. 想定外 \u002F 教訓",{"type":178,"items":249},[250,251,252,253,254],"\u003Cstrong>仮説検証ステップを skip して kernel コードを書き始めなかった\u003C\u002Fstrong>: advisor の初回助言で「SPLAT_TIMING で profile してから kernel 選定すべき」と指摘され実行、結果として `refine fully GPU 化` の前提が崩れることを 30 分で確認できた。実装を 1-2 日かけてから「効かない」と気付くより 1 桁効率的。","\u003Cstrong>negative finding は積極的に文書化する\u003C\u002Fstrong>: 卒論 narrative では「Metal kernel 直叩きの limit を測定値で示す」セクションがあると、axis 1 の正当性が「無闇に GPU 化」ではなく「実測根拠ベースの選択」として強化される。","\u003Cstrong>GPU dispatch overhead は 100µs オーダー\u003C\u002Fstrong>: opacity_decay (84k splat の element-wise op) でも CPU host loop 87µs より GPU dispatch 182µs の方が遅い。`cmd.commit + wait` の往復で ~100µs かかるため、N が小さい op や少呼び出しの op は CPU の方が有利。Adam (1.7ms\u002Fcall) は dispatch 量に対して compute が十分大きいので GPU 妥当だが、refine_accumulate (90µs\u002Fcall) は GPU 化しても改善余地が薄い。","\u003Cstrong>CPU% ~42-51% は \"1 core bound\" ではなく \"GPU dispatch wait で thread block\"\u003C\u002Fstrong>: top で splat process の CPU% を測ったところ 42-51% (M4 Max 16 core 中 0.4-0.5 core)。これは「1 thread が CPU を専有」ではなく、**`cmd.wait_until_completed()` で thread が休眠している状態** (GPU 結果待ち)。15+ core idle なのは正しいが、原因は CPU 計算ではなく **GPU dispatch chain の sequential 同期** (Phase F の Adam 5x wait + radix sort 16-pass などが該当)。CPU 並列化では解決せず、cmd buffer batching か kernel fusion が真の対策。","\u003Cstrong>plumbing pattern validation は demo kernel として有効\u003C\u002Fstrong>: 本 Phase E では `refine_opacity_decay.metal` 1 個の demo kernel で `RefineOps` struct, `gpu_path` flag, bit-close unit test の 3 点セットを確立。Phase F で tile-binning kernel を書く際にも同じ pattern を流用できる。",{"type":52,"text":256},"9. 関連",{"type":178,"items":258},[259,260,261,262],"Phase D 30k 結果 (本 Phase の前提となる wallclock 41m54s): \u003Ccode>p1-d-stage2-30k-results\u003C\u002Fcode>","Phase D 5k smoke (opacity_decay 数値検証): \u003Ccode>p1-d-opacity-decay-smoke\u003C\u002Fcode>","brush bench (target -4.6x gap source): \u003Ccode>m4-brush-bench\u003C\u002Fcode>","autonomous loop spec (Phase E 設計含む): memory \u003Ccode>autonomous_plan_brush_parity.md\u003C\u002Fcode>",[],[265,292,310,326],{"id":31,"title":266,"date":9,"status":10,"polarity":267,"category":11,"axes":268,"tags":271,"task_code":282,"related_runs":283,"delta_psnr":287,"delta_wallclock":288,"rank":37,"verdict":289,"impact_summary":290,"detail_path":291},"P1.D Stage 2 — Lego brushcompat + opacity decay 30k = 36.106 dB、splats -56% \u002F wallclock -32%","positive",[14,269,270],2,3,[16,272,273,274,275,276,277,278,279,280,281],"phase-d","milestone-m5","opacity-decay","brush-parity","win-win-win","premultiplied","lego-30k","stage-2","splat-efficient","axis-1-prep","P1.D Stage 2 (M5 Lego val pass)",[284,285,286],"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":33,"title":293,"date":294,"status":10,"polarity":267,"category":11,"axes":295,"tags":296,"task_code":301,"related_runs":302,"delta_psnr":305,"delta_wallclock":306,"rank":37,"verdict":307,"impact_summary":308,"detail_path":309},"P1.B+F Stage 2 — Lego 30k brushcompat で 35.184 dB、brush 自身を +3.20 dB 上回り","2026-05-24",[14,269,270],[16,297,298,275,299,277,300,278,279],"phase-b-f","milestone-m3","brush-超え","convention-bridge","P1.B+F Stage 2 (M3 gate)",[285,303,304],"lego-brushcompat-base-5k","lego-sh3-30k (legacy 30k 24.879 dB)","+10.30 dB vs legacy 30k (24.879 → 35.184、convention 変更後の真の現状)","+2.7x vs legacy 30k (1h 2m 18s vs 22m18s、splats 10x で per-iter time 増、ただし brush 自身 282k より 3 倍多い)","accepted-stretch-goal-met","Lego sh3 30k で gt_convention=premultiplied (brush 互換) を立てると、4-way eval で legacy=1.60 \u002F brush=35.24 dB。**brush 自身 val 32.0 dB を +3.20 dB 上回る** 結果。M3 lifeline (30 dB) を +5.24 dB 突破、M5 (36 dB) まで -0.76 dB に到達。Phase A 主仮説 (apparent gap -3〜-6 dB) は falsify されたが、coupling 解消の真の効果は **+33.6 dB shift (1.67 → 35.24)**、想定 (+10 dB) の 3 倍。実装は configs 1 行 (gt_convention) + dataset.rs (load_rgba_premultiplied path 追加、既に Stage 1 で merge 済) のみ、既存 30k legacy bench との apples-to-apples comparison が可能。brush の wallclock 38% 高速化は 30k でも継続 (splats 1M-cap で 846k 到達、refine が攻撃的 split)、ただし brush 自身 282k に比べて 3 倍、本実装が capacity を未活用 (refine を絞る余地あり、Phase D で検証可能)。次 Step は multi-scene 8 シーン展開で universal claim 確定、brush mean 33.32 dB 超えで multi-scene parity 完全達成を狙う。","\u002Ffindings\u002Fp1-b-f-stage2-30k-results\u002F",{"id":32,"title":311,"date":294,"status":10,"polarity":267,"category":11,"axes":312,"tags":313,"task_code":317,"related_runs":318,"delta_psnr":321,"delta_wallclock":322,"rank":37,"verdict":323,"impact_summary":324,"detail_path":325},"P1.D opacity decay 5k smoke — splats -11.6%、PSNR +0.38 dB の同時改善",[14,270],[16,272,274,314,315,24,316],"splat-count-reduction","brush-compat","smoke","P1.D opacity-decay (Phase D core)",[286,319,320],"lego-brushcompat-base-5k (Stage 1 baseline 31.31 dB \u002F 93,948 splats)","lego-brushcompat-base-30k (Stage 2 35.18 dB \u002F 846,689 splats)","+0.38 dB vs Stage 1 baseline 5k (31.308 → 31.689)","+23% vs Stage 1 5k (2m 5s → 2m 34s、host RMW overhead、N で線形)","accepted-go-30k","brush の `refine_splats()` (train.rs:611-619) と同じ sigmoid-space formula で opacity decay を refine cadence に統合: `new_opac = sigmoid(raw) - rate*(1-train_t)` → `clamp(1e-12, 1-1e-12)` → `inv_sigmoid`。5k Lego smoke で PSNR は維持以上 (31.31 → 31.69 dB、+0.38 dB)、splats は **-11.6%** 削減 (93,948 → 83,093)、wallclock は +23% (1500 iter で全 splat 触る host loop が支配的、N=83k で問題ない範囲)。これにより 30k に進めば brush 282k 帯 (Stage 2 の 846k からの大幅削減) + PSNR ≥ 34 dB の同時達成が射程に入る。axis 1 (native Metal) ではなく axis 3 (unified memory CPU RMW) を活用した実装で、refine 周辺の O(N)\u002Frefine_every オペレーションには合理的選択 (Metal dispatch overhead > 実 work)。","\u002Ffindings\u002Fp1-d-opacity-decay-smoke\u002F",{"id":34,"title":327,"date":328,"status":10,"polarity":329,"category":11,"axes":330,"tags":331,"task_code":338,"related_runs":339,"delta_psnr":341,"delta_wallclock":342,"rank":37,"verdict":343,"impact_summary":344,"detail_path":345},"M4 Max 上 brush (wgpu→Metal) の 30k baseline — wgpu 抽象は自作より速かった","2026-05-23","mixed",[269],[332,333,334,335,336,337],"phase-2","brush","wgpu","baseline","m4-max","abstraction-cost","A.3",[340],"lego-sh3-30k","+11.13 dB (brush 比優位)","−65.6% (brush の方が速い)","investigative","wgpu 抽象は自作 native より遅いはず、という想定が逆。同一 M4 Max 上で brush (wgpu) が 9m08s \u002F 37.40 dB、自作 (Metal 直) が 26m32s \u002F 26.27 dB。第 2 軸 (抽象コスト定量化) の主張を再 framing する必要が確定。","\u002Ffindings\u002Fm4-brush-bench\u002F",1782449788650]