[{"data":1,"prerenderedAt":447},["ShallowReactive",2],{"finding:p2-s1-pipeline-resident":3,"finding-runs:p2-s1-pipeline-resident":297,"finding-related:p2-s1-pipeline-resident":345},{"meta":4,"impact":51,"sections":57},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":16,"task_code":28,"commit":29,"branch":30,"config_paths":31,"related_runs":39,"related_findings":45},"p2-s1-pipeline-resident","S1 pipeline 全域 resident 化 — replay bench -22.9% (final regime) で採用 (Tier A\u002FB\u002FC)","worktree (\u003Ccode>worktree-agent-afb59d93b2c731864\u003C\u002Fcode>) で実装済みの S1 (pipeline 全域 resident 化: Tier A resident work buffers \u002F Tier B ForwardState Buffer handle + *_from_buf 直結 \u002F Tier C zero_grads スコープ化 + AdamUniforms 統合) を main へ統合し GPU gate を完遂。C3 統合 (32070c4) との conflict は tile_bin.rs を手 merge し、C3 (rejected flag) 併用時は S1 buffer 直結を legacy 経路へフォールバックさせる regression test 込みで解決。fixed-workload replay bench で \u003Cstrong>final regime 28.630→22.059 ms\u002Fiter = -22.9%\u003C\u002Fstrong> \u002F iter5000 regime -21.9% (閾値 max(2σ,1%) の 10 倍超の有意差)、attribution 計測で alloc 成分の消滅 (ts_raster_fwd_alloc 0.2 µs\u002Fcall 等) を確認。12.5k full gate は rep1 PSNR 36.051 dB が guard 外に出たため n=3 escalation → rep2 36.168 \u002F rep3 36.224 dB で tail variance と判定し PASS。wallclock は 12.5k rep mean 261.55s (rep1 272.36 \u002F rep2 257.55 \u002F rep3 254.73s、公式 336.33s 比 -22.2%) で replay 判定と整合。\u003Cstrong>採用 — flag なしの無条件 default\u003C\u002Fstrong>。msplat 同日等価 gap は 2.10× → \u003Cstrong>1.56×\u003C\u002Fstrong>。","P2 gap sweep · S1 GPU gate · 採用","2026-08-16","stable","experiment","positive",[14,15],1,3,[17,18,19,20,21,22,23,24,25,26,27],"gap-sweep","phase-2","s1","resident","alloc-audit","unified-memory","gpu-gate","adopted","bench-harness","lego","attribution","S1 pipeline 全域 resident 化 worktree 統合 + GPU gate (2026-08-16 GPU 専有タスク)","90225b9","main",[32,33,34,35,36,37,38],"splat\u002Fconfigs\u002F2026-08-16-s1-bench-final-pre.toml","splat\u002Fconfigs\u002F2026-08-16-s1-bench-final-post.toml","splat\u002Fconfigs\u002F2026-08-16-s1-bench-iter5000-pre.toml","splat\u002Fconfigs\u002F2026-08-16-s1-bench-iter5000-post.toml","splat\u002Fconfigs\u002F2026-08-16-lego-s1-resident-12500.toml","splat\u002Fconfigs\u002F2026-08-16-lego-s1-resident-12500-rep2.toml","splat\u002Fconfigs\u002F2026-08-16-lego-s1-resident-12500-rep3.toml",[40,41,42,43,44],"lego-s1-resident-12500","lego-s1-resident-12500-rep2","lego-s1-resident-12500-rep3","lego-gap-baseline-12500","lego-bench-calib-checkpoints",[46,47,48,49,50],"p2-bench-harness-calibration","p2-c0-resident-binning","p2-last-contributor","p2-c3-tile-counting","p2-msplat-parity-lego",{"summary":52,"rank":53,"verdict":54,"delta_psnr":55,"delta_wallclock":56},"別 worktree で実装済みだった S1 (pipeline 全域 resident 化) を main へ統合。C3 統合後の tile_bin.rs と conflict したため手 merge し、C3 (rejected flag) との新規相互作用 (S1 の buffer 直結が C3 の panic guard に当たる) はフォールバック + regression test で解決。build warning 0、MSL smoke compile (adam.metal binding 変更) + 新規 S1 test 9 本 (resident byte-stability \u002F grow path \u002F ForwardState parity \u002F Vec vs raw parity \u002F C3 fallback) 含む workspace 全 test pass。replay bench は \u003Cstrong>final regime -22.9% \u002F iter5000 -21.9%\u003C\u002Fstrong> と Phase 2 単一項目として C0 に次ぐ効果で、attribution 計測 (S1 で新設した DispatchAttribution 4 点) が alloc 成分の消滅を直接証明 — C0 の「主犯は first-touch page fault」結論の pipeline 全域への一般化。12.5k full gate は PSNR rep1 が guard 外 (36.051) に出たが n=3 escalation で tail variance と確定 (rep2 36.168 \u002F rep3 36.224、歴代同 recipe 分布 36.14-36.23)。採用 — flag なしの無条件変更として default 化。","high","adopted-unconditional-no-flag","12.5k full run PSNR guard: 基準 36.19 前後 (歴代同 recipe 7 run 分布 36.138-36.226) に対し rep1 36.051 (-0.14、guard 外) \u002F rep2 36.168 \u002F rep3 36.224 dB → n=3 mean 36.148 dB = -0.04 dB (±0.1 dB guard 内、PASS)。rep1 は歴代最低値だが S1 は数学的同値 (parity test 群で証明) のため run 分散の tail と判定","replay bench final regime n=3: 28.630 → 22.059 ms\u002Fiter = **-22.9%** (閾値 max(2σ,1%)=2.05%)。iter5000 regime n=3: 26.113 → 20.405 ms\u002Fiter = **-21.9%** (閾値 1.29%)。12.5k full run: 公式 336.33s → rep1 272.36s \u002F rep2 257.55s \u002F rep3 254.73s = mean 261.55s (**-22.2%**)",[58,61,64,85,87,107,109,112,151,153,204,206,208,238,240,267,272,274,276,278,280,288,290],{"type":59,"text":60},"lead","C0 (finding: p2-c0-resident-binning) は binning 経路の per-iter alloc を resident arena 化して -48.4% を得たが、pipeline の残り (project \u002F rasterize forward \u002F rasterize backward \u002F project_backwards \u002F adam) には per-iter fresh-alloc (~46MB\u002Fiter) と host Vec 往復 (~57MB\u002Fiter) が残っていた。別 worktree (\u003Ccode>worktree-agent-afb59d93b2c731864\u003C\u002Fcode>、分岐元 b053e35) で先行実装されていた S1 (Tier A\u002FB\u002FC の 3 層 + DispatchAttribution 計測 4 点) を main へ統合し、GPU gate を完遂した。",{"type":62,"text":63},"heading","1. S1 の内容 (3 Tier)",{"type":65,"columns":66,"align":70,"rows":72},"table",[67,68,69],"Tier","内容","撤廃対象",[71,71,71],"left",[73,77,81],[74,75,76],"A (resident work buffers)","`GpuProjector` の出力 (splats2d\u002Fdepths)、`Rasterize` の forward 出力 (out\u002Ffinal_t\u002Flast_contrib) と backward splats_grad を struct 保持の resident buffer に変更 (capacity-grow のみ、`ssim.rs::ensure_work_buffers` と同型)。memset は backward grad の active 範囲 (`n*9*4`) のみ","~46MB\u002Fiter の fresh-alloc + first-touch page fault (C0 が binning で実証した主犯の一般化)",[78,79,80],"B (Buffer handle 直結)","`ForwardState` に `splats2d_buf` \u002F `sorted_idx_buf` \u002F `tile_offsets_buf` \u002F `final_t_buf` の handle (arena buffer の retain) を保持し、backward 系を `backward_from_buf` \u002F `dispatch_from_buf_active` に直結。非 batched 経路 (per_stage default) も `backward_rasterize_buf_raw` → `project_backwards_from_buf_active` で splats_grad の Vec→GPU re-upload を撤廃。BatchedTail 経路の「buffer を作っても捨てていた」未完成部も修正","~57MB\u002Fiter の host Vec → GPU 再 upload (splats2d 最大 ~14.7MB\u002F枚 ほか)",[82,83,84],"C (小物 alloc + memset)","`zero_grads` のクリア範囲を capacity → active num_splats に縮小 (12.5k 規模で ~59% memset 削減、`ts_zero_grads` として計測化)。`adam_step` の 6 scalar buffer を `AdamUniforms` 1 struct に統合 (5 group × 6 → 5 alloc\u002Fiter、adam.metal の binding 変更)","30 小 alloc\u002Fiter + capacity 全域 memset",{"type":62,"text":86},"2. 統合作業 (C3 conflict の手 merge)",{"type":65,"columns":88,"align":90,"rows":91},[89,68],"項目",[71,71],[92,95,98,101,104],[93,94],"worktree","`worktree-agent-afb59d93b2c731864` (分岐元 b053e35)。main は C3 統合 (32070c4) + docs (e4db3f4) の 2 commit 先行",[96,97],"conflict","tile_bin.rs のみ (C3: dispatcher + per-tile kernels \u002F S1: `resident_tile_offsets_buf` accessor)。他 7 ファイルは `git apply` がそのまま通った",[99,100],"C3 相互作用 (手 merge で発見・解決)","S1 の buffer 直結 forward は `resident_sorted_bufs()` を呼ぶが、C3 経路の sorted idx は arena の idx_a\u002Fidx_b ではなく別 buffer (idx_c3) にあり、C3 の panic guard に当たる (pre-S1 は per_stage + C3 が有効な組み合わせだった)。`GpuTileBinner::last_sort_used_c3()` accessor を追加し、C3 iter は buffer 直結を諦めて legacy host-slice forward にフォールバック (pre-S1 と同一挙動)。regression test `forward_state_c3_tile_counting_falls_back_to_host_slice_path` を追加",[102,103],"MSL smoke compile","adam.metal の binding 変更 (buffer(4..9) → `AdamUniforms` struct buffer(4)) を `cargo test -p splat-metal adam` (= `Adam::new` + `device_compiles_adam_metal`) で検証、一発 PASS",[105,106],"test","S1 新規 test 9 本 (project 2 \u002F rasterize 3 \u002F trainer 3 + C3 fallback 1): resident byte-stability (repeat call bit-exact) \u002F grow path (img_size・num_splats 増減) \u002F ForwardState buffer handle と host Vec の bit-exact parity \u002F `backward_rasterize_buf` Vec 版 vs raw Buffer 版 parity。workspace 全 test pass、`cargo build --release` warning 0",{"type":62,"text":108},"3. replay bench A\u002FB (final + iter5000 regime、各 n=3)",{"type":110,"text":111},"paragraph","統合前に同一 machine\u002F同日で baseline を取り直し (`final-pre` 28.630 ms\u002Fiter は calibration headline 28.312 ms\u002Fiter と 1.1% 差 = σ 圏内で整合)、S1 適用 build で同一 config を再計測した。S1 は flag なしの無条件変更のため、pre\u002Fpost の差分は build のみ。",{"type":65,"columns":113,"align":122,"rows":124,"caption":150},[114,115,116,117,118,119,120,121],"regime","n","variant","median ms\u002Fiter","σ_pct","delta","閾値 max(2σ,1%)","判定",[71,123,71,123,123,123,123,71],"right",[125,132,140,144],[126,127,128,129,130,131,131,131],"final (407,267 splats)","3","pre (e4db3f4)","28.630","1.02%","—",[133,127,134,135,136,137,138,139],"final","post (S1)","22.059","0.22%","**-22.95%**","2.05%","**有意 (採用)**",[141,127,128,142,143,131,131,131],"iter5000 (373,933 splats)","26.113","0.19%",[145,127,134,146,147,148,149,139],"iter5000","20.405","0.64%","**-21.86%**","1.29%","delta は閾値の 10 倍超で n=3 のまま確定 (escalation 不要)。post の σ が pre より小さい傾向 (final 1.02→0.22%) は alloc 由来の jitter が消えたことと整合。",{"type":62,"text":152},"4. per-kernel 内訳 — 効果は alloc\u002F往復を持つ kernel に集中",{"type":65,"columns":154,"align":159,"rows":160,"caption":203},[155,156,157,119,158],"timing label","pre avg_us\u002Fcall","post avg_us\u002Fcall","S1 の対応 Tier",[71,123,123,123,71],[161,167,173,179,185,191,197],[162,163,164,165,166],"ts_fwd_project","1,786.8","739.5","**-58.6%**","A (out2d\u002Fdepths resident 化)",[168,169,170,171,172],"ts_project_back","1,908.8","900.6","**-52.8%**","B (splats_grad buffer 直結、Vec 再 upload 撤廃)",[174,175,176,177,178],"ts_fwd_rasterize","3,923.3","2,318.7","**-40.9%**","A+B (out\u002Ffinal_t\u002Flast_contrib resident + splats2d\u002Fsorted_idx\u002Ftile_offsets 直結)",[180,181,182,183,184],"ts_backward_raster","8,939.5","7,104.5","**-20.5%**","A+B (splats_grad resident + 入力 buffer 直結)",[186,187,188,189,190],"ts_adam","2,643.6","2,591.2","-2.0%","C (AdamUniforms 統合、小物)",[192,193,194,195,196],"ts_fwd_radix_sort","5,239.3","5,144.1","-1.8%","— (S1 対象外、不変であることの sanity)",[198,199,200,201,202],"ts_fwd_emit_pairs","499.4","494.7","-0.9%","— (C0 で resident 済、不変)","final regime n=3 の avg_us\u002Fcall。S1 が触っていない radix_sort \u002F emit_pairs が ±2% 内で不変なのに対し、alloc + Vec 往復を持っていた 4 kernel が -20〜59% 落ちており、attribution が仮説と一致。",{"type":62,"text":205},"5. DispatchAttribution (S1 新設計測 4 点) — alloc 成分の消滅を直接証明",{"type":110,"text":207},"S1 は `{upload, alloc, gpu, readback}` の 4 成分計測 (`DispatchAttribution`、emit_pairs の C0 Day 0 計測と同型) を project_soa \u002F raster_fwd \u002F raster_bwd \u002F project_back の 4 dispatch に新設した。pre 側には計測が存在しない (計測自体が S1 の一部) ため、before は per-kernel 全体値 (§4) で、after は内訳で示す。",{"type":65,"columns":209,"align":215,"rows":216,"caption":237},[210,211,212,213,214],"dispatch (post、final regime)","upload µs\u002Fcall","alloc µs\u002Fcall","gpu µs\u002Fcall","readback µs\u002Fcall",[71,123,123,123,123],[217,223,228,233],[218,219,220,221,222],"ts_project_soa","5.4","**0.1**","520.2","0",[224,225,226,227,222],"ts_raster_fwd","5.9","**0.2**","2,306.7",[229,230,231,232,222],"ts_raster_bwd","5.0","63.2 (※)","5,912.2",[168,234,235,236,222],"9.1","**0.0**","884.4","※ ts_raster_bwd_alloc の 63.2 µs は buffer alloc ではなく active 範囲 memset (`n*9*4` ≈ 14.7MB の zero clear、正しさに必須) の実測値。純粋な alloc 成分は 4 dispatch とも 0.0〜0.2 µs\u002Fcall = 「resident 化で per-iter alloc が消えた」ことの直接証明。Tier C の zero_grads は `ts_zero_grads` 393.6 µs\u002Fcall として新規に可視化 (pre は ts_* 計測外で不可視だった)。",{"type":62,"text":239},"6. 12.5k full gate — rep1 が PSNR guard 外 → n=3 escalation で tail variance と確定",{"type":65,"columns":241,"align":246,"rows":247},[242,243,244,245],"run","PSNR (mean val, 100 views)","wallclock","final splats",[71,123,123,123],[248,253,258,263],[249,250,251,252],"rep1 (lego-s1-resident-12500)","36.051 dB","272.36s","407,556",[254,255,256,257],"rep2","36.168 dB","257.55s","406,321",[259,260,261,262],"rep3","36.224 dB","254.73s","406,304",[264,265,266,131],"**n=3 mean**","**36.148 dB**","**261.55s**",{"type":268,"label":269,"variant":270,"text":271},"callout","PSNR guard: rep1 単発は guard 外 (-0.14)、n=3 で PASS","warning","rep1 の 36.051 dB は歴代同 recipe 7 run の分布 (36.138〜36.226、mean 36.185) の下に外れ、±0.1 dB guard を単発では割った。S1 は数学的同値 (ForwardState buffer handle の bit-exact parity \u002F resident buffer の byte-stability を test で証明済み、非決定性は既知の atomic 加算順序のみ) のため systematic な品質劣化の機構がなく、run 分散の tail を疑って n=3 に escalation → rep2 36.168 \u002F rep3 36.224 dB と分布内に戻った。n=3 mean 36.148 dB = 基準 36.19 比 -0.04 dB で guard 内 PASS。歴代最低値の単発観測を機に「PSNR guard も wallclock 同様 n=1 判定は分散に飲まれうる」ことを記録する (phase5 の -0.65 dB 撤回事例、full-run wallclock 分散 ~10% と同根)。",{"type":110,"text":273},"wallclock は rep mean 261.55s で、S1 前の公式 336.33s (p2-last-contributor) 比 **-22.2%**、同 recipe 当日近傍の calib run 360.96s 比 -27.5% — replay bench の -22.9% と方向・規模とも整合する (full run は分散 ~10% があるため参考値、gate 判定は replay を正とする)。",{"type":62,"text":275},"7. msplat 等価 gap への寄与",{"type":110,"text":277},"同日等価比較 (p2-msplat-parity-lego、msplat 本日実測 167.7s) の gap は本実装 352.27s 基準で 2.10× だった。S1 後の 12.5k は rep mean 261.55s のため、同 protocol 換算で gap は \u003Cstrong>1.56×\u003C\u002Fstrong> に縮小 (公式値どうしの比較 336.33s→261.55s)。Phase 2 完了時の残 bottleneck (backward 21.0% \u002F radix 13.5% \u002F forward rasterize 9.8%) のうち backward \u002F forward の alloc+往復成分を刈り取った形で、次の主要残差は radix_sort (~5.1ms\u002Fiter、23%) と SSIM (~2.4ms\u002Fiter) になる。",{"type":62,"text":279},"8. 判定",{"type":281,"items":282},"list",[283,284,285,286,287],"**verdict: 採用 — flag なしの無条件変更として default 化** (S1 は挙動同値の実装改善であり A\u002FB flag を持たない。旧経路は `binning = \"per_iter_alloc\"` \u002F C3 fallback として温存され、test が両経路を検証し続ける)","根拠: replay bench final -22.95% \u002F iter5000 -21.86% (閾値の 10 倍超)。per-kernel \u002F attribution の両面で「効果は alloc + Vec 往復を持つ kernel に限定され、対象外 kernel は不変」という仮説どおりの選択的な削減","PSNR guard は n=3 escalation の上で PASS (rep1 tail は上記 callout 参照)。数学的同値性は unit test (byte-stability \u002F parity) で担保","副次効果: DispatchAttribution 4 点 + ts_zero_grads の計測が per-iter コスト構造の可視化を binning 以外にも拡張 — 以後の変更は upload\u002Falloc\u002Fgpu\u002Freadback の帰属付きで gate できる","教訓: PSNR guard の n=1 判定は run 分散に飲まれうる (歴代最低値でも tail でありうる)。guard 割れ時は「機構の有無を先に監査 → n escalation」の順で判定する (wallclock の bench harness 規約と同じ思想)",{"type":62,"text":289},"9. 関連",{"type":281,"items":291},[292,293,294,295,296],"実装: `splat\u002Fcrates\u002Fsplat-metal\u002Fsrc\u002Fkernels\u002F{project,rasterize,adam,tile_bin}.rs`、`splat\u002Fcrates\u002Fsplat-metal\u002Fsrc\u002Fparam.rs`、`splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002F{trainer,train_loop}.rs`、shader: `splat\u002Fshaders\u002Fopt\u002Fadam.metal`","gate 用 config: `splat\u002Fconfigs\u002F2026-08-16-s1-bench-*.toml` (replay 4) + `2026-08-16-lego-s1-resident-12500{,-rep2,-rep3}.toml` (full run 3)","replay bench raw 出力: `splat\u002Fruns\u002Fbench-s1\u002F*.toml` (gitignore 対象、再生成可能)","bench harness 規約: `docs\u002Ffindings\u002Fp2-bench-harness-calibration.toml`","C3 相互作用の詳細: `docs\u002Ffindings\u002Fp2-c3-tile-counting.toml` (panic guard の設計意図)",[298,315,322,331,338],{"id":44,"title":44,"subtitle":299,"date":9,"workspace":300,"tags":301,"verdict":310,"psnr":311,"psnr_unit":-1,"wallclock":312,"splats":313,"summary_url":314,"detail_path":314},"P2 bench harness calibration — 3-regime (iter1000\u002F5000\u002Ffinal) checkpoint 生成用 (lego-gap-baseline-12500 と同一 recipe、save_ply_at 追加のみ)","splat",[302,303,304,305,306,307,308,309],"p1-g","phase-g","early-stop","sh-progressive","stacked","lego-15k","brush-compat","premultiplied","partial",36.225929260253906,"6m 0s",409660,"\u002Fruns\u002Flego-bench-calib-checkpoints\u002F",{"id":43,"title":43,"subtitle":316,"date":9,"workspace":300,"tags":317,"verdict":310,"psnr":318,"psnr_unit":-1,"wallclock":319,"splats":320,"summary_url":321,"detail_path":321},"2026-08 msplat gap sweep Phase 0.1 — 規約 v2 適用後 baseline、per-kernel breakdown 取得",[302,303,304,305,306,307,308,309],36.21615219116211,"12m 46s",407267,"\u002Fruns\u002Flego-gap-baseline-12500\u002F",{"id":40,"title":40,"subtitle":323,"date":9,"workspace":300,"tags":324,"verdict":310,"psnr":327,"psnr_unit":-1,"wallclock":328,"splats":329,"summary_url":330,"detail_path":330},"2026-08 msplat gap sweep S1 — pipeline 全域 resident 化 (Tier A\u002FB\u002FC) の 12.5k PSNR guard + wallclock gate",[325,20,21,23,326,308,309],"p2-s1","lego-12500",36.05055236816406,"4m 32s",407556,"\u002Fruns\u002Flego-s1-resident-12500\u002F",{"id":41,"title":41,"subtitle":332,"date":9,"workspace":300,"tags":333,"verdict":310,"psnr":334,"psnr_unit":-1,"wallclock":335,"splats":336,"summary_url":337,"detail_path":337},"2026-08 msplat gap sweep S1 — pipeline 全域 resident 化 (Tier A\u002FB\u002FC) の 12.5k PSNR guard + wallclock gate (rep2 — rep1 PSNR 36.051 が guard 外のため n=2 で分散確認)",[325,20,21,23,326,308,309],36.168025970458984,"4m 17s",406321,"\u002Fruns\u002Flego-s1-resident-12500-rep2\u002F",{"id":42,"title":42,"subtitle":339,"date":9,"workspace":300,"tags":340,"verdict":310,"psnr":341,"psnr_unit":-1,"wallclock":342,"splats":343,"summary_url":344,"detail_path":344},"2026-08 msplat gap sweep S1 — pipeline 全域 resident 化 (Tier A\u002FB\u002FC) の 12.5k PSNR guard + wallclock gate (rep3 — rep1 36.051 guard 外 \u002F rep2 36.168 guard 内、n=3 で分散確定)",[325,20,21,23,326,308,309],36.22351837158203,"4m 14s",406304,"\u002Fruns\u002Flego-s1-resident-12500-rep3\u002F",[346,363,383,403,423],{"id":46,"title":347,"date":9,"status":10,"polarity":12,"category":348,"axes":349,"tags":350,"task_code":357,"related_runs":358,"delta_psnr":-1,"delta_wallclock":359,"rank":53,"verdict":360,"impact_summary":361,"detail_path":362},"splat bench harness 実装 + calibration — σ_replay 0.83%、full run 比 ~6x ノイズ削減","tooling",[14,15],[25,351,352,353,354,355,356,26],"calibration","variance","reproducibility","c7","fixed-workload","gate-infra","splat bench harness (2026-08-16 GPU 専有タスク)",[44],"σ_replay 0.83% (n=10, final-scale workload) vs full run 実測 ~10% — 約 6x ノイズ削減","accepted","`splat bench --config bench.toml` を実装し、同一 config n=10 replay で \u003Cstrong>σ_replay = 0.234 ms\u002Fiter (mean 28.339 ms 比 0.83%)\u003C\u002Fstrong> を実測。full training run で観測されていた ~10% 分散に対し \u003Cstrong>約 6x のノイズ削減\u003C\u002Fstrong>。3-regime (iter 1000 \u002F 5000 \u002F final checkpoint、各 n=5) でも σ 1.2-4.6% の範囲に収まり、splat 数が少ない早期 regime ほど相対分散が大きい傾向を確認。有意判定閾値を \u003Ccode>max(2σ, 1%)\u003C\u002Fcode> と規約化し、以後の gate 判定をこの harness の計測に載せ替える。付随して `--parity` (kernel variant 間の勾配 \u002F binning 一致検証) と `[output] save_ply_at` (checkpoint 保存) を実装、parity mode の実測で production-scale シーンの `sorted_idx` tie-order 非決定性 (~0.2%、真の非決定性であって variant 差ではない) を発見し gate から除外した。","\u002Ffindings\u002Fp2-bench-harness-calibration\u002F",{"id":47,"title":364,"date":9,"status":10,"polarity":12,"category":11,"axes":365,"tags":366,"task_code":372,"related_runs":373,"delta_psnr":378,"delta_wallclock":379,"rank":53,"verdict":380,"impact_summary":381,"detail_path":382},"P2 gap sweep Phase 2 — C0 resident arena + C1 pass skip で -48.4% (bit-exact)",[14,15],[17,18,367,368,369,370,22,371,26],"c0-resident-arena","c1-radix-pass-skip","binning","bit-exact","page-fault","2026-08 msplat gap sweep Phase 2 C0\u002FC1",[374,375,376,377],"lego-c0-day0-attrib-1k","lego-c0-ab-periter-1k","lego-c0-ab-resident-1k","lego-c0-resident-12500","12.5k gate: 36.216 → 36.183 dB = -0.033 dB (bit-exact 実装、atomic 非決定性 guard ±0.1 内で通過)","12.5k gate: 766.07 → 395.59s = **-48.4%** (emit -98% \u002F radix -53% \u002F extract -81%)","c0-c1-adopted-default-flip-minus-48-percent","\u003Cstrong>単発 -48.4% は本 project 最大の 1 施策改善\u003C\u002Fstrong>で、msplat 実測 gap (11m48s vs 3m40s ≈ 3.2×、Lego 30k) を大幅に詰める lever が確定。766.07 → 395.59s は kernel を 1 行も触らず host 側 buffer 管理だけで達成 (bit-exact)。emit_pairs は 38.2% → 1.2% に消滅し、新 bottleneck は backward_raster 31.4% (→ 2-BWD last_contributor の trigger 25% を初超過) と radix_sort 11.7% (GPU compute 本体)。STP (feat.F) は emit の alloc 成分が消えた今、相対効果の再 bench が必要 (Phase 1a の -7.45% は大半が同じ page fault の削減で C0 と重複していた可能性が高い)。教訓: unified memory 環境の profiling では「GPU 時間」に host メモリ管理コストが化ける — per-kernel wallclock だけでなく buffer lifecycle を疑うこと。","\u002Ffindings\u002Fp2-c0-resident-binning\u002F",{"id":49,"title":384,"date":9,"status":10,"polarity":385,"category":11,"axes":386,"tags":387,"task_code":394,"related_runs":395,"delta_psnr":397,"delta_wallclock":398,"rank":399,"verdict":400,"impact_summary":401,"detail_path":402},"C3 per-tile counting sort — parity PASS \u002F PSNR guard PASS だが replay 有意差なしで棄却 (数値つき)","negative",[14],[17,18,388,389,390,391,23,392,25,26,393],"c3","tile-binning","counting-sort","bitonic-sort","rejected","determinism","C3 per-tile counting sort worktree 統合 + GPU gate (2026-08-16 GPU 専有タスク)",[396,44],"lego-c3-tile-counting-12500","12.5k full run PSNR guard: 36.226 → 36.190 dB = -0.036 dB (±0.1 dB guard 内、PASS)","replay bench final n=10: GlobalRadix 32.383ms\u002Fiter (σ2.23%) vs TileCounting 33.403ms\u002Fiter (σ4.60%) = **+3.15% (非有意、閾値 4.45%)**。iter5000 n=3: +0.38% (非有意)。radix_sort kernel 単体: final n=10 で 5721us→6151us (+7.5%)。full run 単体 (n=1): 360.96s→329.11s (-8.8%、非有意判定と矛盾、confound と判断し不採用)","medium","rejected-no-significant-speedup-flag-retained","別 worktree で実装済みだった C3 (per-tile counting sort) を main の util.rs 分割後の構造 (bench harness commit fe68cfa 由来) に手で移植し統合。smoke compile + unit test 6 本 + 既存 106 test 全 pass、build warning 0。\u003Ccode>splat bench --parity\u003C\u002Fcode> で数学的正しさを確認 (tile_offsets byte-exact、5 grad buffer tol 1e-4 以内 PASS)。しかし fixed-workload replay (final checkpoint n=10) では \u003Cstrong>+3.15%\u003C\u002Fstrong> ― 閾値 max(2σ,1%)=4.45% 未満で有意な高速化なし。radix_sort kernel 単体も +7.5% 遅い。12.5k full run の PSNR guard は通過 (-0.036 dB) したが、同じ full run の wallclock は -8.8% と replay の非有意判定に矛盾しており、これは既知の full-run 分散 confound と判断し gate 判定には採用しない (むしろ bench harness の存在意義を裏付ける実例)。default flip は見送り、TileCounting は BackendConfig flag として保持 (正しさは証明済みなので将来 CPU scan を GPU 化する等の改良余地があれば再挑戦可能)。副次効果として sort key \u003Ccode>(depth_bits&lt;&lt;32)|splat_idx\u003C\u002Fcode> により depth-tie 非決定性を解消した。","\u002Ffindings\u002Fp2-c3-tile-counting\u002F",{"id":48,"title":404,"date":9,"status":10,"polarity":12,"category":11,"axes":405,"tags":406,"task_code":412,"related_runs":413,"delta_psnr":418,"delta_wallclock":419,"rank":53,"verdict":420,"impact_summary":421,"detail_path":422},"P2 gap sweep Phase 2 — 2-BWD last_contributor で -15.0% (数学的同値)、STP 再判定は棄却",[14],[17,18,407,408,409,410,411,26],"2-bwd-last-contributor","backward","stop-the-pop","re-eval","function-constant","2026-08 msplat gap sweep Phase 2 2-BWD \u002F STP 再判定",[414,415,416,417],"lego-lc-smoke-1k","lego-p2lc-12500","lego-stp-c0-12500","lego-stack-lc-stp-12500","LC 12.5k gate: 36.183 → 36.191 dB = +0.008 dB (数学的同値実装、atomic 非決定性 guard ±0.1 内)","LC 12.5k gate: 395.59 → 336.33s = **-14.98%** (backward_raster -40.3%)。STP: -2.51% (gate 未達)、LC+STP スタック: 343.63s (LC 単独より +2.2%)","lc-adopted-minus-15-percent-stp-rejected-final","C0 (-48.4%) に続く Phase 2 第 2 弾で、backward 31.4% の新 bottleneck を kernel 側から -40.3% 削減。\u003Cstrong>Lego 12.5k = 336.33s で msplat 30K (220s) 比 1.53× まで縮小\u003C\u002Fstrong>し、gap sweep の目標 (≤2.0×) を達成した。実装は「forward が既に知っている打ち切り位置を backward に伝えるだけ」で数学的同値 — 品質を 1 bit も動かさずに backward の replay 計算量を ~40% 削った。STP 再判定は負の結果だが価値が高い: Phase 1a の -7.45% の正体が C0 と同じ page fault 削減だったことを分離実証し、「効果の重複を疑って再 bench する」protocol の正しさを裏付けた。次の bottleneck は forward rasterize 9.8% \u002F radix 13.5% \u002F SSIM 7.5% でいずれも trigger 25% 未達 — Phase 2 はここで完了、Phase 3 (再計測 + Pareto v3) へ。","\u002Ffindings\u002Fp2-last-contributor\u002F",{"id":50,"title":424,"date":9,"status":10,"polarity":425,"category":11,"axes":426,"tags":428,"task_code":438,"related_runs":439,"delta_psnr":442,"delta_wallclock":443,"rank":53,"verdict":444,"impact_summary":445,"detail_path":446},"P2 msplat parity — 同日等価比較で msplat 30K = 167.7s \u002F 36.5 dB、gap は 12.5k で 2.10× (matched-wallclock 7.5k は 1.08× で brush +0.94 dB)","mixed",[14,427],2,[17,429,430,431,432,433,434,435,26,436,437],"phase-3","msplat","parity","baseline","cross-eval","eval-convention","thermal-interleave","m4-max","thesis-ready","2026-08 msplat gap sweep Phase 3 (parity 再計測)",[440,441],"lego-parity-noprof-12500","lego-parity-noprof-7500","brush convention (同一 evaluator): 本実装 12.5k +1.79 dB \u002F 7.5k +0.94 dB (vs msplat 30K q8 34.47)。white-bg convention: msplat +1.09 dB (36.28 vs 本実装 12.5k 35.19)","msplat 30K 167.7s vs 本実装 12.5k 352.3s = **2.10×** (両者 profile なし・同日実測)。matched-wallclock: 7.5k 181.4s = 1.08×。従来の 1.53× (spike 値 220s 基準) は撤回","parity-established-gap-2.10x-convention-coupled-psnr","gap sweep の公式 gap 数値を \u003Cstrong>同日・同一条件の実測で確定\u003C\u002Fstrong>: Lego 12.5k vs msplat 30K の wallclock gap は \u003Cstrong>2.10×\u003C\u002Fstrong> (352.3s vs 167.7s、両者 profiling なし) — Phase 2 の 1.53× は spike の古い msplat 値 (219.8s) 起因の過小評価だった。一方 \u003Cstrong>matched-wallclock 断面 (本実装 7.5k = 181.4s、msplat の 1.08×)\u003C\u002Fstrong> では brush convention の同一 evaluator cross-eval で本実装が \u003Cstrong>+0.94 dB\u003C\u002Fstrong> (35.41 vs 34.47)。PSNR 比較は eval convention に強く依存し (white-bg では msplat +1.09 dB)、p1-a-3 の「訓練\u002F評価 convention coupling」を第三者実装との比較で再実証した。msplat の native 品質が spike 比 +1.05 dB 向上した主因は今回の対称条件 (同一 culled init.ply 5207 pts・train 100 view 全量・常時フル解像度) にあり、msplat 側の条件を今回初めて本実装と揃えた結果。卒論 §5 の direct comparison 表はこの数値で置き換える。","\u002Ffindings\u002Fp2-msplat-parity-lego\u002F",1790227327181]