松田研究室
FindingID: p2-msplat-parity-final
Status: stable / task 2026-08 1× 工程表 v2 — 最終段 (msplat 等価比較 matched 断面込み)
← Findings Index
1× 工程表 v2 · 最終段 · msplat 等価比較 (matched 断面)

最終スタック msplat 等価比較 — wallclock 0.927× / throughput 1.135× / energy 0.906×、matched 断面は convention で割れる

1× 工程表 v2 完了 (S1→W1→W2→S2→S3) 後の最終スタックを msplat wheel v1.1.3 と <strong>同日・同一 M4 Max・同一 init 点群・同一 evaluator</strong> で interleave 比較した。<strong>msplat 30K n=4 = 165.42s / native val 36.563 dB</strong>、本実装 Lego 12.5k n=2 = <strong>152.68s (train elapsed) / 155s (process)</strong> — <strong>wallclock gap は 2026-08-16 の 2.10× から 0.927× へ反転</strong> (gap の分母は interleave pair である block 1 の msplat n=2 mean <strong>164.69s</strong>。msplat 全 4 run の n=4 mean 165.42s を分母にすると 0.923×)し、<strong>per-splat·iter throughput の劣位も 2.62× → 1.135× (ほぼ parity)</strong> に縮んだ。<strong>GPU energy 0.906× / package energy 0.896×</strong> で、counter session が「package では 1.062× で負け」と記録したエネルギー断面も反転した (ただし機構は入れ替わっており、W 比は 0.704× → <strong>0.978×</strong> = ほぼ同電力で短時間、が新しい説明)。PSNR の matched 断面は前回同様 convention で割れる: <strong>brush convention では 6,000 iter (51.60s = 0.313×) で msplat 30K の best (34.243 dB) を +0.67 dB 上回る</strong>一方、<strong>white convention では 30,000 iter (479.91s = 2.888×) まで延ばしても -0.81 dB で matched 点が存在しない</strong>。roadmap v2 が留保していた「12.5k で native 比 -0.34 dB」は <strong>iter 不足ではなく convention 差</strong>であることが 30k の天井 (self 36.455 dB) で確定した。

mixedrank: highwallclock-and-energy-won-psnr-convention-split第 1 軸第 2 軸第 3 軸1x-roadmap-v2msplatparitybaselinecross-evaleval-conventionthermal-interleaveenergythroughputlegom4-maxthesis-ready
Δ PSNR
brush convention (同一 evaluator q8、msplat 30K best 34.243 dB 基準): 本実装 12.5k **+1.97 dB** / 13.3k (matched-wallclock) **+1.94 dB** / 6.0k **+0.67 dB** / 30k **+2.26 dB**。white convention (msplat 30K 最小 36.252 dB 基準): 12.5k **-1.10 dB** / 13.3k **-1.17 dB** / 30k **-0.81 dB** — **matched 点は 30k まで延ばしても存在しない**
Δ Wallclock
12.5k 152.68s vs msplat 30K 164.69s = **0.927×** (train elapsed、**block 1 interleave の n=2 mean 同士**)。msplat の characterization 値は n=4 mean **165.42s** だが、gap の分母には interleave pair である block 1 n=2 (164.69s) を使う (n=4 を分母にすると 0.923×)。process wallclock では 155s vs 168.5s = **0.920×**。matched-wallclock は 13,300 iter = 165.85s (msplat block1 mean 164.69s の **1.007×**)。matched-PSNR (brush) は 6,000 iter = 51.60s = **0.313×**。matched-iteration (30K vs 30K、co-located anchor) は 479.91s vs 166.15s = **2.888×**。前回 (2026-08-16) の 2.10× から反転
Impact
1× 工程表 v2 の最終段を通し、卒論 §5 の direct comparison を確定させた。本実装 Lego 12.5k = 152.68s / msplat 30K = 164.69s (block 1 interleave pair の n=2 mean 同士) で wallclock gap 0.927× — 2026-08-16 の同一 protocol 実測 2.10× から 2.27 倍の改善で、初めて convention 非依存の軸で msplat を下回った。per-splat·iter throughput も 2.62× → 1.135× と near-parity まで詰まっており、「本実装は workload 形状 (少 iter × 多 splats) で勝っているだけで kernel は遅い」という 2026-08-16 時点の解釈はもはや成立しない。エネルギーも GPU 0.906× / package 0.896× と反転したが、機構は counter session (低 W × 長時間) から 同 W × 短時間へ完全に入れ替わっている (W 比 0.704× → 0.978×) — S3 が GPU busy を 77.5 → 91.3% に上げた以上、低 W は原理的に維持できない。一方 PSNR の matched 断面は convention 依存のまま: brush では 6.0k (0.313×) で msplat 30K を上回り、white では 30k (2.888×) でも -0.81 dB。roadmap v2 が「msplat native 比 -0.34 dB」と留保していた差は、30k まで延ばしても self-eval が 36.455 dB で天井になることから iter 予算の不足ではなく評価 convention の差と確定した (Phase H の 36.384 dB 天井とも整合)。よって当該留保は「解消」ではなく撤回し、convention 別の 2 断面に置き換える。
01

本文

2026-08-16 の parity finding (p2-msplat-parity-lego) と同一 protocol — 同日・同一 M4 Max・同一 dataset・同一 culled init.ply (5207 点)・train 100 view 全量・同一 evaluator・interleave 直列実行 — を、1× 工程表 v2 完了後の最終スタックで再実施した。最終スタック = default 全採用 (binning=resident / raster_backward_range=last_contributor / loss_path=gpu / forward_submission=chained / radix_scan=gpu_hierarchical / pipelining=depth2、profile=false) で、backend block は p2-s3-iteration-pipelining の depth2 arm と完全一致。全 run を同一 config family (refine.stop_iter = max_steps) で回し、6.0k / 12.5k / 13.3k / 30k が単一の Pareto curve として読めるようにしてある。

Headline — 「勝った」と言える断面と言えない断面

convention 非依存で勝った: wallclock (12.5k で 0.927×)、matched-wallclock 断面 (13.3k で 1.007× / brush +1.94 dB)、GPU energy (0.906×) / package energy (0.896×)。near-parity まで詰めた: per-splat·iter throughput (msplat 1.135× — 2026-08-16 の 2.62× から)。勝ったと言えない: white convention の PSNR (12.5k -1.10 dB、30k まで延ばしても -0.81 dB で matched 点なし)、matched-iteration 断面 (30K vs 30K で 2.888× 遅い)、per-splat·iter throughput (まだ 13.5% 負け)。撤回する主張: 「12.5k の 36.202 dB は msplat native 36.539 dB に 0.34 dB 足りない」— これは premultiplied self-eval と white native の異 convention 比較であり、30k の天井 (36.455 dB) がその差を iter 予算で埋められないことを示している。

1. 実測サマリ (M4 Max、同日、wallclock は train loop のみ)

run (実行順)blockitertrain elapsedprocessfinal splats自己 evalbrush cross-eval q8white cross-eval窓内 load1 avg/max
msplat r1130,000165.65s169s194,37036.554 (white, native)33.85736.2713.60 / 4.07
splat 12.5k r1112,500153.03s155s407,50136.215 (brush, trainer)36.25235.1543.82 / 5.28
msplat r2130,000163.73s168s191,20936.559 (white, native)33.03836.2523.09 / 4.42
splat 12.5k r2112,500152.33s155s408,11136.138 (brush, trainer)36.174—2.67 / 3.13
splat 13.3k (matched-wall)213,300165.85s168s414,20536.15436.18235.0823.22 / 3.94
splat 6.0k (matched-PSNR brush)26,00051.60s54s319,45234.89034.91333.7562.63 / 2.98
splat 30k (**破棄**: 窓内汚染)230,000(498.27s)(502s)468,52736.44036.501—**5.61 / 8.81**
splat 12.5k r3 (bracket)212,500164.94s168s411,19236.19036.219—3.33 / 3.77
splat 12.5k r4 (bracket)212,500168.05s171s408,52136.21536.255—~4.5
splat 12.5k r5 (bracket、厳格 quiesce)212,500162.78s165s405,17336.12736.158—2.67 (gate 値)
msplat r3 (co-located anchor)330,000166.33s170s195,98436.565 (white, native)34.11836.2943.22 (gate 値)
splat 30k r2 (**採用**)330,000479.91s483s467,75236.45536.49835.4402.40 (gate 値)
msplat r4 (co-located anchor)330,000165.97s170s196,40436.575 (white, native)34.243—2.77 (gate 値)
実行順そのまま。block 1 = 公式 interleave (msplat → splat → msplat → splat)、block 2 = matched 断面 + Pareto 天井、block 3 = 30k の clean 再測を msplat anchor で挟んだ co-located 比較。「自己 eval」= 各実装が学習と同じ convention で測る値。「brush cross-eval q8」= 両 PLY を splat eval --convention brush --quantize-8bit (val 100 view) に通した同一 evaluator 値。「white cross-eval」= 本実装 renderer で描画 → α 合成 → white GT (前回と同一の妥協点)。本実装の brush no-quant 値は trainer 自己 eval と 4 桁一致 (例 36.2147 vs 36.215) で evaluator 整合性を確認済み。

2. 公式 gap 断面 (5 断面 + throughput + energy)

断面比較内容比 (指標は行ごと)PSNR (同一 evaluator)判定
**公式 12.5k**splat 12.5k (152.68s、n=2 mean) vs msplat 30K (164.69s、block 1 n=2 mean)**0.927×**brush **+1.97 dB** (36.21 vs 34.24) / white **-1.10 dB** (35.15 vs 36.25)**勝ち (wallclock)** / PSNR は convention 依存
**matched-wallclock**splat 13,300 iter = 165.85s ≒ msplat 164.69s**1.007×** (+0.70%)brush **+1.94 dB** (36.18 vs 34.24) / white **-1.17 dB** (35.08 vs 36.25)同時間・brush では勝ち / white では負け
**matched-PSNR (brush)**splat 6,000 iter (34.913 dB) > msplat 30K best (34.243 dB)**0.313×** (51.60s vs 164.69s)**+0.67 dB****勝ち — 3.2 倍速で同等以上**
**matched-PSNR (white)**msplat 30K 最小 36.252 dB に届く本実装 Pareto 点**存在しない**30k (479.91s) でも 35.440 = **-0.81 dB****負け — 断面が取れない**
**matched-iteration (30K vs 30K)**splat 30k (479.91s) vs msplat 30K (166.15s、block 3 co-located anchor)**2.888×**brush **+2.26 dB** / white **-0.81 dB****負け (wallclock)**
per-splat·iter throughputms/iter ÷ iteration 平均 splats (splat 322k / msplat 165k)**[throughput 比]** msplat **1.135×** 高速37.9 vs 33.4 ns/splat·iternear-parity、まだ 13.5% 負け
GPU energy (参考)steady GPU W × train elapsed**[energy 比]** **0.906×**29.38 W × 152.68s = 4,486 J vs 30.05 W × 164.69s = 4,949 J**勝ち**
package energy (参考)同上 (CPU 込み、SoC-wide のため参考値)**[energy 比]** **0.896×**4,748 J vs 5,298 J**勝ち** (counter session の 1.062× から反転)
wallclock の公式値は 0.927× (12.5k)。matched-PSNR は convention で完全に割れており、brush なら 0.313×、white なら断面自体が存在しない。matched-iteration (30K vs 30K) は本実装が 2.888× 遅く、これは本実装の operating point が 12.5k であって 30k ではないことの裏返し (Phase H で確定した Lego の Pareto sweet spot)。energy の CPU 列は IOReport が SoC-wide なので package 行は参考値扱い (counter session の注記を踏襲)。

3. 2026-08-16 parity finding からの差分表

指標2026-08-16 (Phase 2 default スタック)2026-08-17 (最終スタック)差
**wallclock gap @ 12.5k**2.10× (352.3s vs 167.7s)**0.927×** (152.68s vs 164.69s)**2.27 倍改善 / 1.0× を跨いだ**
本実装 12.5k train elapsed352.27s**152.68s** (n=2 mean)**-56.7%**
**per-splat·iter throughput**msplat 2.62× (88.9 vs 33.9 ns)msplat **1.135×** (37.9 vs 33.4 ns)**劣位 2.62× → 1.135×**
matched-wallclock 点7,500 iter (181.4s = 1.08×)**13,300 iter (165.85s = 1.007×)**同時間で回せる iter が **1.77 倍**
matched-PSNR (brush) 点7,500 iter = 1.08×**6,000 iter = 0.313×****3.4 倍速い断面へ**
matched-PSNR (white) 点存在しない (12.5k で -1.09 dB)存在しない (**30k で -0.81 dB**)30k まで検証して不在を確定
msplat 30K wallclock167.7s (n=2)165.42s (n=4)-1.4% (日内再現、同一 wheel)
msplat 30K native PSNR36.53 dB (n=2)36.563 dB (n=4)+0.03 dB (再現)
GPU 平均 W (splat / msplat)18.95 / 26.92 = 0.704× (counter session)29.38 / 30.05 = **0.978×****低 W の優位は消滅** (busy 77.5→91.3% の帰結)
GPU energy 比0.897× (counter session)**0.906×**ほぼ同値だが**機構が入れ替わった**
package energy 比1.062× (**負け**)**0.896×** (勝ち)**反転**
wallclock gap の 2.10× → 0.927× は S1 (-22.2%) → W1 (-7.7%) → W2 (-9.1%) → S2 (-9.9%) → S3 (-18.1%) の積み上げ (1× 工程表 v2)。energy の 0.897× → 0.906× は「変わっていない」ように見えるが説明が完全に入れ替わっている: counter session では「低 W (0.704×) × 長時間 (1.273×)」で辛うじて 0.9 だったのが、今は「ほぼ同 W (0.978×) × 短時間 (0.927×)」で 0.9 になっている。S3 が bubble を潰した以上、低 W は原理的に維持できない — エネルギー優位の根拠は『GPU を遊ばせているから省電力』ではなく『早く終わるから』に書き換える必要がある。

4. roadmap v2 の留保「-0.34 dB」の決着 — iter 予算ではなく convention 差

結論: 当該留保は「解消」ではなく撤回する

p2-s3-iteration-pipelining と roadmap v2 は「等価 gap 0.907× は matched 断面ではない — 本実装 12.5k の 36.202 dB に対し msplat 30K native は 36.539 dB で 0.34 dB 低い」と留保していた。本 finding はこれを 2 方向から潰した。(a) その 0.34 dB は異 convention 比較である — 36.202 は premultiplied (brush) 学習/評価、36.539 は white-bg 学習/評価であり、同一 evaluator に揃えると brush では本実装 +1.97 dB、white では -1.10 dB と符号が反転する。(b) iter 予算では埋まらない — 同一 config family で 30,000 iter まで延ばした本実装の self-eval は 36.455 dB で天井 (Phase H の 36.384 dB と整合)、white cross-eval でも 35.440 dB にしか届かず msplat の 36.252 dB に -0.81 dB 残る。12.5k → 30k は wallclock 3.14 倍 (152.68 → 479.91s) を払って white で +0.29 dB しか買えないので、外挿しても matched 点には到達しない。よって roadmap v2 の caveat box は convention 別の 2 断面 (brush: 0.313× で勝ち / white: 断面不在) に置き換える。

itertrain elapsedself-eval (brush)brush cross-eval q8white cross-evalwhite で msplat 36.252 との差
6,00051.60s34.89034.91333.756-2.50 dB
12,500152.68s (n=2 mean)36.177 (n=2 mean)36.213 (n=2 mean)35.154-1.10 dB
13,300165.85s36.15436.18235.082-1.17 dB
30,000479.91s36.45536.49835.440**-0.81 dB**
本実装の Pareto curve (全て同一 config family、refine.stop_iter = max_steps)。brush 側は 12.5k 以降ほぼ飽和 (12.5k → 30k で +0.28 dB に対し wallclock 3.14 倍)、white 側も 30k で -0.81 dB 残る。13.3k が 12.5k をわずかに下回るのは run 間分散の範囲 (12.5k は 5 run で 36.127〜36.215)。

5. throughput の劣位が near-parity まで縮んだ

  • ns/splat·iter は 88.9 → 37.9 (msplat 33.4)。2026-08-16 時点の 2.62× 劣位が 1.135× に。当時の解釈「本実装は少 iter × 多 splats という workload 形状で勝っているだけで、単位仕事あたりでは 2.6 倍遅い」はもはや成立しない — kernel/実行形状レベルでも実質 parity 帯に入った。
  • workload 形状の非対称は残る: 本実装は 12,500 iter × iteration 平均 322k splats、msplat は 30,000 iter × 平均 165k splats。iter 数も splat 数も全断面で非対称であり、この非対称そのものは refine スケジュールの設計差 (本実装は早期に密に grow して早く止める) に由来する。
  • 30k 断面では 36.5 ns (splat 30k r2) と 12.5k (37.9 ns) よりむしろ良い — splat 数が増えるほど per-splat 効率は上がる (fixed cost の償却)。裏を返すと msplat の 33.4 ns との残差 ~9% は fixed cost ではなく kernel 効率の差である可能性が高く、1× 工程表 v2 の残工程 (W3/W4/W5) の期待値と整合する。
  • 参考: 別途取得した Activity Monitor GPU history の digitize (docs/findings/data/gpu-util-histogram-20260817/) では、msplat 側に深い dip が 8 本 (block 幅の 40.5%)、本実装側は 3 本 (2.8%) と出ており、本実装のほうが GPU を連続的に埋めていることを定性的に裏づける。ただしこれは screenshot の pixel 解析なので数値としては引用せず、傾向の傍証に留める。

6. エネルギー — 勝ったが、機構が入れ替わっている

runsteady GPU W±sdsteady CPU W (参考)package W (参考)train elapsedGPU Jpackage JP15 residency
msplat r130.422.782.0632.48165.65s5,0405,38174.0%
splat 12.5k r128.671.731.8630.53153.03s4,3884,67294.6%
msplat r229.682.032.1831.87163.73s4,8595,21865.7%
splat 12.5k r230.092.051.5831.67152.33s4,5834,82494.4%
**mean 比 (splat/msplat)****0.978×**—0.811×0.967×**0.927×****0.906×****0.896×**—
splat power-sample --interval 5 を workload と併走させ (sampler duration = splat 135s / msplat 150s)、GPU W が peak の 50% を超えた最初のサンプル以降を steady 区間として時間加重平均 (counter session と同一の判定)。測定の限界 (要開示): sampler は run の先頭側しか覆っておらず coverage は splat 88.4% / msplat 91.1% と非対称、J は steady W を train elapsed 全長に外挿して算出している (n=2)。両実装とも W は run 後半で上昇する (末尾 3 サンプル: splat 29.5/32.5 W、msplat 30.8/31.5 W) ためこの外挿は両者の W を過小評価し、coverage の非対称ぶんだけ splat 側を余計に過小評価する = 比を良く見せる向きのバイアス。末尾 3 サンプルで未覆区間を補正し直すと GPU energy 0.909× (補正前 0.906×) で、結論は動かない。なお prologue 側の懸念 (Python import で msplat の W が下がる) は該当せず — 両者とも第 1 サンプルから 20〜28 W に乗っており、むしろ最も低い第 1 サンプル (20.72 W) は splat 側にある。idle 床は GPU 0.03〜0.04 W で clean。CPU / package 列は IOReport が SoC-wide なので参考値。P-state residency は本実装が P15 に 94.4〜94.6% 居座り、msplat は 65.7〜74.0% (残りは P14 = 電力上限による降格) — counter session の H3 判定 (DVFS で損をしているのは msplat 側) は最終スタックでも維持。
エネルギー主張の書き換え (counter session からの申し送りの更新)

counter session は「W 比 0.704× でも wallclock が 1.273× 長いので GPU energy 0.897× / package energy 1.062× に留まり、卒論 §5 で電力効率を主張軸にはできない」と結論していた。最終スタックでは W 比が 0.978× (ほぼ同電力) に上がった代わりに wallclock が 0.927× になり、GPU energy 0.906× / package energy 0.896× と両方とも勝ちに転じた。数値だけ見ると GPU energy は 0.897× → 0.906× でほぼ動いていないが、成立機構は「GPU を遊ばせているぶん低電力」から「同じ電力で早く終わる」へ完全に入れ替わっている。S3 が busy を 77.5 → 91.3% に上げた以上、低 W 側の説明は今後も復活しない。卒論では 「W が低いから省エネ」ではなく「同電力枠で早く終わるから省エネ」と書く。なお energy は n=2 の参考値であり、gate 値ではない。

7. 計測 protocol — 何が clean で何を破棄したか

  • block 1 (公式断面) は完全に clean: 4 run すべて窓内 load1 avg 2.67〜3.82 / max ≤5.28。かつ 12.5k n=2 mean 152.68s は前 session (S3 gate) の depth2 n=3 mean 151.70s を +0.65% で再現しており、session を跨いだ健全性が確認できている。
  • 破棄 1 件: block 2 の 30,000 iter r1 (498.27s) は窓内 load1 avg 5.61 / max 8.81 で汚染。block 3 で厳格 quiesce (LOAD_LIMIT=3.4) 下に再測し 479.91s (-3.7%) を採用。PSNR は 36.440 → 36.455 とほぼ不変で、load 汚染は wallclock のみを殴ることが確認できた。
  • session 後半の drift を検出: block 2 末尾以降の 12.5k bracket は 164.94 / 168.05 / 162.78s と block 1 の 152.68s より +6.6〜10.1% 遅い。原因は (a) 途中で背景に Discord 通話が乗り (Discord Helper 32% CPU + WindowServer 24% + coreaudiod 14%)、(b) 8 分連続 GPU 稼働 (30k run) 後の thermal。厳格 quiesce 下の r5 でも +6.6% 残ったので thermal 寄与が主。
  • drift は msplat をほとんど殴らない: msplat は 165.65 / 163.73 / 166.33 / 165.97s と全 session で σ 0.6% に収まる。本実装は P15 に 94% 居座る (= thermal headroom を使い切っている) のに対し、msplat は既に電力上限で P14 に落ちているぶん thermal に鈍い。後半 thermal 帯での gap は 162.78 / 166.15 = 0.979× — 0.927× は cold-ish start 条件の値であり、連続稼働下では優位が ~5 pt 縮む。卒論では 0.927× を公式値としつつこの脚注を付ける。
  • protocol 教訓: LOAD_LIMIT=4.5 の事前 gate は今回の汚染を通してしまった (汚染が gate 通過後に始まったため)。捕まえたのは run 窓内 load1 の連続記録のほうで、S3 gate round 1 の破棄と同じ形。事前 gate だけでは不十分、窓内記録が必須という規約を維持する。

8. eval convention coupling — 前回の結論は最終スタックでも不変

  • 各実装は自分の学習 convention で勝つ: msplat native (white) 36.563 → brush cross-eval q8 33.04〜34.24 で -2.3〜-3.5 dB。本実装 brush 36.18 → white cross-eval 35.15 で -1.03 dB。同一 evaluator・同一 renderer でもこの符号反転は消えない (p1-a-3 の再実証)。
  • msplat の brush 値は q8 (clamp 込み) が公式: no-quant では raw float の overshoot で 21.2〜21.6 dB まで崩壊する (前回と同様)。本実装は overshoot がほぼなく q8 差 +0.03 dB。
  • msplat の brush cross-eval は run 間分散が大きい: n=4 で 33.038 / 33.857 / 34.118 / 34.243 (幅 1.21 dB)。native では 36.554〜36.575 (幅 0.02 dB) なので、convention mismatch 下の cross-eval が分散を増幅するという前回の観察が n=4 で確認された。matched-PSNR (brush) の判定は保守側に倒して max (34.243) を基準にしてある。
  • white cross-eval の測定条件: 本実装 renderer で両 PLY を描画し 8-bit RGBA PNG 経由で α 合成 → white GT と比較。msplat native (msplat renderer、float) 36.563 に対し同 PLY で 36.272 — renderer 差 + 8-bit 量子化で -0.29 dB。この penalty は両実装の PLY に同じ経路を通すことで対称化されている。

9. 再現手順

# msplat 環境 (wheel v1.1.3、torch 不要)
uv venv msplat-venv --python 3.12
uv pip install --python msplat-venv/bin/python "msplat==1.1.3" numpy pillow

# dataset 変換 (blender lego → nerfstudio 形式、white-bg composite + culled init.ply 5207 点)
LEGO=/Users/otkrickey/dev/3dgs-workspace/datasets/nerf_synthetic/lego
python docs/strategy/msplat_parity_lego.py convert --lego $LEGO --out /tmp/lego-ns

# block 1: interleave ABAB (各 run の前に load quiesce、窓内 load1 を 5s 間隔で記録)
python docs/strategy/msplat_parity_lego.py train --dataset /tmp/lego-ns --lego $LEGO \
  --iters 30000 --out-ply msplat-30k-r1.ply            # → 165.65s / 36.554 dB
( cd splat && ./target/release/splat train \
  --config configs/2026-08-17-final-parity-12500-r1.toml )   # → 153.03s / 36.215 dB
# (msplat r2, splat 12500-r2 を同様に)

# block 2/3: matched 断面 (13300 / 6000) と Pareto 天井 (30000-r2、厳格 quiesce)
# 電力は workload と併走: ./target/release/splat power-sample --duration 135 --interval 5 --output pw.toml

# cross-eval (同一 evaluator)
python docs/strategy/msplat_parity_lego.py convert-ply --inp msplat-30k-r1.ply --out msplat-30k-r1-brush.ply
splat/target/release/splat eval --ply msplat-30k-r1-brush.ply --dataset $LEGO \
  --split val --convention brush --quantize-8bit
splat/target/release/splat eval --ply splat/runs/final-parity-12500-r1/final.ply \
  --dataset $LEGO --split val --convention brush
# white-bg cross-eval は 3dgs-workspace/msplat-parity-20260817/white_eval.py

10. 卒論への反映と申し送り

  1. §5 direct comparison 表を本 finding の数値で確定: msplat Lego 30K = 165.42s / native 36.563 dB (n=4)、本実装 Lego 12.5k = 152.68s / brush 36.177 dB (n=2)。gap 0.927×。2026-08-16 の 2.10× と 2026-06 spike の 219.8s は「実行条件が異なる過去値」として脚注化。
  2. 「速い」と書けるようになった: wallclock は convention 非依存の指標であり、matched-wallclock 断面 (13.3k = 1.007×) も取れているので、『同一 wallclock 予算で brush convention の PSNR が +1.94 dB 高い』という書き方が可能。ただし matched-iteration (30K vs 30K で 2.888× 遅い) を隠さず併記すること — 本実装の主張は「同じ iter を速く回す」ではなく「少ない iter で同じ品質に届く Pareto 点を持つ」である。
  3. 品質軸の主張は据え置き: PSNR の単純優位は依然 convention 依存 (brush +1.97 / white -1.10) なので主張軸にしない。品質側の contribution は materials robustness (msplat 8.80 dB 破綻 vs 本実装 29.97 dB、convention 非依存) と convention 明示性のままとする。
  4. エネルギー節を書き換える: counter session の「主張軸にできない」は最終スタックで覆った (GPU 0.906× / package 0.896×) が、機構は『低 W』から『短時間』へ入れ替わっている。この入れ替わり自体が「bubble を潰すと W は上がるが energy は下がる」という Apple Silicon 固有の設計トレードオフの実測例として §5 に書ける。
  5. throughput の脚注を更新: 「per-splat·iter で 2.6 倍遅い」は撤回し、1.135× (near-parity) に差し替える。残る ~13.5% は 1× 工程表 v2 の未着手工程 (W3/W4/W5) の余地。
  6. Pareto plot v3 の再生成: docs/strategy/make_msplat_pareto.py の入力を本 finding の 4 点 (6.0k / 12.5k / 13.3k / 30k) + msplat n=4 mean に更新する (未実施)。
  7. thermal 脚注: 0.927× は interleave 直後 (相対的に cool) の値で、連続稼働帯では 0.979× まで縮む。卒論に載せる際はこの帯域を脚注に置く。
02

関連する run

この finding が観測された / 言及している実験 run。

03

関連 finding

© 2026 大竹律輝 — 松田研究室