[{"data":1,"prerenderedAt":473},["ShallowReactive",2],{"finding:p3-c2-bubble-attribution":3,"finding-runs:p3-c2-bubble-attribution":362,"finding-related:p3-c2-bubble-attribution":373},{"meta":4,"impact":40,"sections":46},{"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":33,"related_findings":35},"p3-c2-bubble-attribution","C2 実測 — 残差 bubble は host-late 支配 (7.2〜8.1s)、refine tick drain は A7 で半減済み (3.0〜3.8s)。handoff は定常帯で headroom ほぼ無し","`p3-kernel-share-post-s3.toml` §8 が実装した `gpu_gap_report()` を 12.5k full run (M4 radix simd_ballot + A7 refine 3-pass 削減、default 込みの現行スタック) で初めて実測した。\u003Ccode>reliable=true dropped=0 kernel_invalid=0 sum\u002Funion=1.000000x\u003C\u002Fcode>、\u003Ccode>Σcb_gap=11.085s\u003C\u002Fcode> は sync-tax 全量 11.129s の \u003Cstrong>99.6%\u003C\u002Fstrong> を説明する。band 別 \u003Ccode>p50×n\u003C\u002Fcode> (通常 iteration の robust 推定、refine tick という外れ値に不感) と \u003Ccode>mean×n\u003C\u002Fcode> (全量) の差分から、\u003Cstrong>残差 (通常境界の bubble) は 7.2〜8.1s (wall 124.75s の 5.8〜6.5%)、refine tick drain は 3.0〜3.8s (2.4〜3.1%)\u003C\u002Fstrong> とブラケットで分解した。恒等式 \u003Ccode>cb_gap=−host_lead+drvproc+handoff\u003C\u002Fcode> を中央値ベースで見ると、定常帯 (band2〜4) の \u003Ccode>handoff\u003C\u002Fcode> 中央値は \u003Cstrong>0.047〜0.153ms\u003C\u002Fstrong> と極小で \u003Ccode>cb_gap\u003C\u002Fcode> 中央値 (0.297〜0.307ms) のほとんどは \u003Ccode>host_lead\u003C\u002Fcode> の負側 (中央値 −0.24〜−0.25ms) が説明する — \u003Cstrong>残差の主因は driver\u002FGPU キュー待ちではなく host-late\u003C\u002Fstrong>。\u003Ccode>ts_chain_commit_wait\u003C\u002Fcode> (backward CB, gpu 6.379ms\u002Fcall) と \u003Ccode>ts_fwd_chain_commit_wait\u003C\u002Fcode> (forward CB, gpu 2.000ms\u002Fcall) の非対称から、host work (waits を除く総計 23.387s\u002F12500=1.871ms\u002Fiter) は forward CB の 2.000ms shadow をほぼ埋め切っており (fill率 ~93.6%)、\u003Cstrong>残差は「2.00ms の狭い shadow からのはみ出し」がほぼ全て\u003C\u002Fstrong>という機構仮説を提示する。","2026-09 ゼミ milestones · C2 実測 · 残差 bubble 帰属 (host-late 支配)","2026-08-30","stable","measurement","mixed",[14,15],1,3,[17,18,19,20,21,22,23,24,25,26,27],"c2","gap-report","cb-gap","host-lead","drvproc","handoff","residual-bubble","refine-drain","post-m4-a7","lego","measurement-only","C2: 12.5k の残差 bubble 帰属計測と分析","2e16af0","main",[32],"splat\u002Fconfigs\u002F2026-08-30-c2-12500-depth2-prof.toml",[34],"c2-12500-depth2-prof",[36,37,38,39],"p3-kernel-share-post-s3","p2-s3-iteration-pipelining","p3-final-stack","p3-refine-3pass",{"summary":41,"rank":42,"verdict":43,"delta_psnr":44,"delta_wallclock":45},"`p3-kernel-share-post-s3.toml` §4\u002F§8 の宿題 (「残差は既存計装では分解不能、実装後も 12.5k 実測がまだ無い」) を、`2026-08-30-c2-12500-depth2-prof.toml` (M4+A7 default 込み、S3 gate arm B と [backend] bit-exact) の 1 run で埋めた。\u003Cstrong>reliable=true \u002F dropped=0 \u002F kernel_invalid=0 \u002F sum\u002Funion=1.000000x\u003C\u002Fstrong> — 信頼性ゲート健全、全列使用可。wall 124.75s \u002F busy 113.627s (91.1%) \u002F sync-tax 11.126〜11.129s は `p3-final-stack` の n=3 mean (124.393s, σ0.756%) の guard 内 (n=1 の点推定として妥当)。\u003Cstrong>Σcb_gap=11.085s が sync-tax 全量の 99.6% を説明\u003C\u002Fstrong>し、`p50×n` (band 別合計 7.244s) と `mean×n` (11.081s) の差 3.837s を refine tick 由来の外れ値と読むと、\u003Cstrong>残差 (通常境界) 7.2〜8.1s (5.8〜6.5%) \u002F refine tick drain 3.0〜3.8s (2.4〜3.1%)\u003C\u002Fstrong> にブラケットできる。refine 側は `ts_refine`(2.869s)+`ts_opacity_decay`(0.185s)=3.054s の独立 host 実測が下限とほぼ一致し、クロスチェックが成立した。\u003Cstrong>旧 3 分解 (refine 6.26s \u002F encode(B) 3.41s \u002F 残差 4.54s、旧 sync-tax 全量 14.206s) との整合\u003C\u002Fstrong>: 旧「残差」+「encode(B)」= 4.54+3.41=7.95s ≈ 新「通常境界」7.24s (wall が 151.70→124.75s に縮んだ分を割り引けば近い) — \u003Cstrong>旧 encode(B) バケツは独立した加算成分ではなく、非重複だった encode コストが host-late として `cb_gap` に同じ形で現れていた\u003C\u002Fstrong>と判明し、旧 3 分解を「refine drain \u002F それ以外 (通常境界)」の 2 分解へ訂正する形になった。\u003Cstrong>帰属の結論: 通常境界の bubble は host-late が支配的、driver 処理 (`drvproc`) と GPU キュー待ち (`handoff`) は定常帯で中央値がほぼゼロ (headroom 薄い)\u003C\u002Fstrong> — task が例示した「handoff → CB 統合」は主因ではないと実測が明示的に否定した。","high","residual-is-host-late-dominated \u002F handoff-headroom-thin \u002F refine-drain-already-halved-by-a7","n=1 self-eval: 36.068 dB (100 views)。C2 は測定目的の run で PSNR gate 対象ではないが、p3-final-stack の n=3 mean (36.219 dB) からの乖離は n=1 ノイズ帯として妥当な範囲","train elapsed 124.75s (n=1)。p3-final-stack n=3 mean 124.393s (σ0.756%) の guard 内 — profile=true + gap report 計装のオーバーヘッドは計測可能な歪みを生んでいない、と読める",[47,50,53,94,109,111,167,172,174,259,262,264,281,283,306,310,312,348,350,358],{"type":48,"text":49},"lead","`p3-kernel-share-post-s3.toml` §8 は C2 計装 (`CbInterval` \u002F `gpu_gap_report()` \u002F `print_gap_report()`) を実装したが、1000 iter smoke (splat 6.9k、refine コスト無視できる regime) のみで、\u003Cstrong>12.5k 本番 regime (400k splats、M4\u002FA7 default 込み) での実測は「main が実行すべきコマンド」として申し送りに残っていた\u003C\u002Fstrong>。本 finding はその実測を行い、旧 (pre-M4\u002FA7) の「残差 4.54s \u002F refine drain 6.26s」という推定値を、実装済み計装による実測値で置き換える。",{"type":51,"text":52},"heading","1. 健全性フラグと repro",{"type":54,"columns":55,"align":59,"rows":62},"table",[56,57,58],"flag","値","判定",[60,61,60],"left","right",[63,67,71,74,78,82,86,90],[64,65,66],"`reliable`","true","全列 (`cb_gap`\u002F`drvproc`\u002F`handoff`\u002F`host_lead`) 信頼可",[68,69,70],"`dropped`","0","GPU timeline に穴なし — `cb_gap` の blast radius 対象外 (無条件で健全)",[72,69,73],"`kernel_invalid`","`drvproc`\u002F`handoff`\u002F`host_lead` も無傷 (該当した場合のみ縮小するが今回は 0 件)",[75,76,77],"`sum\u002Funion`","1.000000x","CB 間 overlap なし、単一 queue 上で GPU 区間が交わらないという前提が成立",[79,80,81],"`host_ahead_frac`","49.5%","host が GPU 先行だった CB は全体の 49.5% (= 50.5% は host が遅れて始まった、後述§4 で機構を説明)",[83,84,85],"band 境界の epoch drift","なし","`iter [1,3125]\u002F[3126,6250]\u002F[6251,9375]\u002F[9376,12500]` の n 合計 6251+6250+6250+6249=25000=`cb_gap`の n と一致、§8 未解決点(4) の懸念は解消 (epoch_lo=1 で clean)",[87,88,89],"reconcile (Σcb_gap vs sync-tax全量)","11.085s \u002F 11.129s = 99.6%","sync-tax から host encode を引く必要はないという §4.1 の規約どおり (二重控除なし)",[91,92,93],"wall (train elapsed)","124.75s","`p3-final-stack` n=3 mean 124.393s (σ0.756%) の guard 内 — profile=true+gap report のオーバーヘッドは無視できる",{"type":95,"items":96},"kv",[97,100,103,106],{"key":98,"value":99},"config","`splat\u002Fconfigs\u002F2026-08-30-c2-12500-depth2-prof.toml` ([backend] は `2026-08-16-s3-12500-depth2-prof.toml` と bit-exact、[experiment] メタデータのみ差し替え)",{"key":101,"value":102},"flag 実測確認","run log の `[backend] BackendConfig {...}` 行で `radix_scatter: SimdBallot` (M4) \u002F `refine_scratch_persist: true` \u002F `refine_direct_write: true` (A7) を確認 — post-M4\u002FA7 の現行 default スタックで走っていることの直接証拠",{"key":104,"value":105},"run","1 run のみ (GPU 専有、他 run なし、n=3 化はしていない — 本 finding の値は n=1 の点推定)。commit `2e16af0` (main HEAD) の release binary",{"key":107,"value":108},"wallclock \u002F busy \u002F sync-tax (final)","wall 124.750〜124.754s \u002F busy 113.627s (91.1%) \u002F sync-tax 11.123〜11.129s (計測タイミングの僅かなずれで 3 箇所の printout に ±6ms の差、本文中は reconcile 行の 11.129s を採用)",{"type":51,"text":110},"2. `cb_gap` の分布 — band 別 mean\u002Fp50\u002Fp90\u002Fmax、通常分と refine tick 分の分離",{"type":54,"columns":112,"align":121,"rows":122},[113,114,115,116,117,118,119,120],"band (iter)","n","mean(ms)","p50(ms)","p90(ms)","max(ms)","mean×n(s)","p50×n(s)",[60,61,61,61,61,61,61,61],[123,132,141,149,158],[124,125,126,127,128,129,130,131],"[1, 3125]","6251","0.511","0.256","1.168","42.728","3.194","1.600",[133,134,135,136,137,138,139,140],"[3126, 6250]","6250","0.457","0.297","0.904","48.050","2.856","1.856",[142,134,143,144,145,146,147,148],"[6251, 9375]","0.394","0.307","0.469","48.600","2.462","1.919",[150,151,152,153,154,155,156,157],"[9376, 12500]","6249","0.411","0.299","0.499","44.924","2.568","1.868",[159,160,161,162,163,164,165,166],"**overall**","**25000**","**0.443**","**0.278**","**0.860**","**48.600**","**11.081 (Σ=11.085)**","**6.950 (band和 7.244)**",{"type":168,"label":169,"variant":170,"text":171},"callout","band 1 の突出 (excess 1.594s) は refine ではなく arena 成長 — 誤帰属注意","warning","band 別 \u003Ccode>mean×n − p50×n\u003C\u002Fcode> (= 外れ値=大 gap の寄与) は band1 1.594s \u002F band2 1.000s \u002F band3 0.544s \u002F band4 0.700s。\u003Cstrong>band1 が最大に見えるが、refine tick は `refine.every=100`・`start_iter=500` のため band1 (iter 1〜3125) には約 26 tick しか含まれず、band2〜4 (各 ~31 tick) より少ない\u003C\u002Fstrong> — band1 の突出は run 冒頭の `arena overflow at iter 1, growing to 1480454 and retrying` (log 先頭) と splat 数の急成長 (5207→初期数十万規模まで iter 1〜数千で急増) による host\u002Fdriver ワークロードの過渡的な変動であり、refine 由来ではない。band1 を除いた band2〜4 の excess (1.000+0.544+0.700=2.244s) と band1 込み全体 (3.837s) を見比べ、\u003Cstrong>refine tick 由来の外れ値は band2〜4 の 2.24s + band1 の refine 分 (tick 数比で按分すると ~0.6s) ≈ 2.8〜3.0s 程度\u003C\u002Fstrong>が構造的な下限、band1 の arena-growth 分 (~1.0s) を除いた残りが真の refine 寄与と見るのが妥当 — これが §3 で `ts_refine`+`ts_opacity_decay` の独立 host 実測 (3.054s) とほぼ一致することのクロスチェック根拠になる。",{"type":51,"text":173},"3. `drvproc` \u002F `handoff` \u002F `host_lead` — band 別分布、中央値ベースの寄与ランキング",{"type":54,"columns":175,"align":177,"rows":178},[113,176,114,115,116,117,118],"metric",[60,60,61,61,61,61,61],[179,185,190,196,200,205,210,215,220,225,230,235,240,247,253],[124,21,180,181,182,183,184],"6252","0.043","0.026","0.056","6.603",[124,22,180,186,187,188,189],"1.695","0.569","5.126","6.657",[124,191,125,192,193,194,195],"host_lead","1.225","**−0.200**","5.144","6.683",[133,21,134,197,182,198,199],"0.076","0.145","3.226",[133,22,134,201,202,203,204],"3.375","**0.153**","7.254","8.984",[133,191,134,206,207,208,209],"2.994","**−0.240**","7.265","8.995",[142,21,134,211,212,213,214],"0.096","0.027","0.173","4.098",[142,22,134,216,217,218,219],"3.650","**0.047**","7.731","9.128",[142,191,134,221,222,223,224],"3.352","**−0.253**","7.740","9.137",[150,21,151,226,227,228,229],"0.103","0.029","0.182","4.188",[150,22,151,231,232,233,234],"3.719","**0.056**","7.884","9.130",[150,191,151,236,237,238,239],"3.411","**−0.247**","7.895","9.134",[159,241,242,243,244,245,246],"**drvproc**","**25001**","**0.079**","**0.027**","**0.155**","**6.603**",[159,248,242,249,250,251,252],"**handoff**","**3.110**","**0.489**","**7.624**","**9.130**",[159,254,160,255,256,257,258],"**host_lead**","**2.745**","**−0.220**","**7.635**","**9.137**",{"type":168,"label":260,"variant":170,"text":261},"定常帯 (band2〜4) の中央値ベースでは host-late が支配的、`handoff` の headroom は薄い — 足してはいけない組み合わせ規約に従い mean は wall 比較に使わない","`drvproc`\u002F`handoff`\u002F`host_lead` の \u003Ccode>mean×n\u003C\u002Fcode> は band を通して数十秒規模 (例: overall handoff mean×n ≈ 77.75s) になり、明らかに sync-tax (11.13s) より大きい — これは §4.1 が明記する\u003Cstrong>「足してはいけない組み合わせ」そのもの (mean は CB ごとの正負が巨大に打ち消し合う量であり、時間軸として加算すると意味を失う)\u003C\u002Fstrong>。恒等式 \u003Ccode>cb_gap=−host_lead+drvproc+handoff\u003C\u002Fcode> は各 CB 個別値でも band 別 mean でもほぼ一致することを確認した (例 band4: −3.411+0.103+3.719=0.411 ≈ 実測 cb_gap mean 0.411) — \u003Cstrong>handoff (mean) と host_lead (mean) はほぼ打ち消し合い、cb_gap (mean) はその小さな差分として残る\u003C\u002Fstrong>。定常帯の\u003Cstrong>中央値\u003C\u002Fstrong>で見ると構図がはっきりする: band2〜4 の \u003Ccode>handoff\u003C\u002Fcode> 中央値は \u003Cstrong>0.047〜0.153ms\u003C\u002Fstrong> と極小 (=driver がキューで待たされる時間は typical には ほぼゼロ)、一方 \u003Ccode>host_lead\u003C\u002Fcode> 中央値は \u003Cstrong>−0.240〜−0.253ms\u003C\u002Fstrong> と一貫して負 (=host は typical には次 CB の driver 処理を GPU 完了より後にしか始められていない)、\u003Ccode>drvproc\u003C\u002Fcode> 中央値は 0.026〜0.029ms とさらに小さい。\u003Ccode>cb_gap\u003C\u002Fcode> 中央値 (0.297〜0.307ms) の内訳を大まかな寄与比で言うと \u003Cstrong>host-late (≈80%) ≫ drvproc (≈10%) ≈ handoff (≈10〜15%)\u003C\u002Fstrong> — task が例示した施策候補「handoff → CB 統合」は、\u003Cstrong>定常帯では handoff にほとんど headroom が残っていないため主因ではない\u003C\u002Fstrong>ことが実測で判明した (中央値どうしの加算は近似であり thousand分の1msオーダーの丸め誤差を含むが、ランキングを覆すほどの誤差ではない)。",{"type":51,"text":263},"4. 機構仮説 — forward CB の 2.00ms shadow が host work でほぼ埋まっている",{"type":95,"items":265},[266,269,272,275,278],{"key":267,"value":268},"backward CB の GPU shadow","`ts_chain_commit_wait` gpu_ms\u002Fcall = 79,736.871ms \u002F 12,500 = **6.379ms\u002Fcall**",{"key":270,"value":271},"forward CB の GPU shadow","`ts_fwd_chain_commit_wait` gpu_ms\u002Fcall = 25,001.586ms \u002F 12,501 = **2.000ms\u002Fcall**",{"key":273,"value":274},"host work (waits を除く全 label 合計)","TOTAL(sum) 116.125s − ts_chain_commit_wait(host) 81.707s − ts_fwd_chain_commit_wait(host) 11.031s = **23.387s \u002F 12,500 = 1.871ms\u002Fiter**",{"key":276,"value":277},"forward shadow の fill 率","1.871 \u002F 2.000 ≈ **93.6%** — depth2 pipelining は host work のほとんどを forward CB の GPU 実行の影に隠せているが、狭い 2.00ms 窓に対しほぼ余裕なく詰まっている",{"key":279,"value":280},"host_ahead_frac=49.5% との整合","backward CB (6.379ms) の後に来る境界では driver が大きく先行できる (host_lead 大きく正、handoff も大きい = 「余裕がある」境界)。forward CB (2.000ms) の後に来る境界では host work が 2.00ms を僅かに超えることが半々の確率で起き、超えた分がそのまま cb_gap に現れる (host_lead 中央値が僅かに負、handoff 中央値が僅かに正 = 「余裕が薄い」境界)。2 種類の CB が交互に来るため、handoff\u002Fhost_lead の分布は band4 の mean(3.7\u002F3.4) vs p50(0.06\u002F-0.25) のように\u003Cstrong>二峰的\u003C\u002Fstrong>になる — task の想定していた単一分布ではなく、この 2 CB 交互構造が背景にある",{"type":51,"text":282},"5. 残差 (通常境界) と refine tick drain のブラケット、旧 3 分解との整合",{"type":54,"columns":284,"align":289,"rows":290},[285,286,287,288],"区分","推定範囲","wall 比","根拠",[60,61,61,60],[291,296,301],[292,293,294,295],"残差 (通常境界の bubble)","**7.2〜8.1s**","**5.8〜6.5%**","下限=band別`p50×n`合計 7.244s、上限=`mean×n`合計 11.081s − 独立 host 実測の refine 下限 3.054s ≈ 8.03s",[297,298,299,300],"refine tick drain","**3.0〜3.8s**","**2.4〜3.1%**","下限=`ts_refine`(2.869s)+`ts_opacity_decay`(0.185s)の独立 host 実測=3.054s、上限=`mean×n合計 11.081s − p50×n合計 7.244s`=3.837s",[302,303,304,305],"(参考) sync-tax 全量","11.13s","8.9%","`[gpu]` summary line \u002F reconcile 行",{"type":168,"label":307,"variant":308,"text":309},"旧 3 分解 (refine 6.26s \u002F encode(B) 3.41s \u002F 残差 4.54s) との整合 — encode(B) は独立成分ではなく host-late として cb_gap に混入していた","success","`p3-kernel-share-post-s3.toml` §4 が記録した旧値 (pre-M4\u002FA7、sync-tax 全量 14.206s) は refine drain 6.26s (44%) \u002F encode(B) 3.41s (24%) \u002F 残差 4.54s (32%) の 3 分解だった。本 finding の新 2 分解 (残差 7.2〜8.1s + refine 3.0〜3.8s、sync-tax 全量 11.13s) と突き合わせると、\u003Cstrong>旧「残差」+「encode(B)」= 4.54+3.41 = 7.95s は新「残差 (通常境界)」7.24s (band別`p50×n`下限) とほぼ同じオーダー\u003C\u002Fstrong>(wall が M4\u002FA7 で 151.70→124.75s に縮小した分を比例で割り引けば 7.95×(124.75\u002F151.70)≈6.5s とさらに近づく)。\u003Cstrong>これは encode(B) が sync-tax の独立した加算成分ではなく、depth2 で重なりきらなかった encode コストが `host_lead` の負側 (host-late) として `cb_gap` に同じ形で現れていた、ということを意味する\u003C\u002Fstrong> — §4.1 の「sync-tax から host encode コストを引く必要はない」という規約は、まさにこの吸収関係の裏付けとして再確認された。旧「refine drain 6.26s」と新「refine 3.0〜3.8s」の差 (-39%〜-52%) は \u003Cstrong>A7 (refine 3-pass 削減、default flip) が既に refine tick drain を大きく削っていた\u003C\u002Fstrong>ことの直接証拠であり、`p3-refine-3pass` finding の host コスト削減主張と整合する。",{"type":51,"text":311},"6. 施策提案 (期待 Δ 付き)",{"type":54,"columns":313,"align":319,"rows":320},[314,315,316,317,318],"#","対象","施策","期待 Δ (wallclock)","制約 \u002F 根拠",[60,60,60,61,60],[321,327,332,338,343],[322,323,324,325,326],"1","残差 (host-late 支配)","post-backward の host 仕事 (`ts_refine_accumulate` 407µs\u002Fiter・grad readback 等) を forward CB の 2.00ms shadow ではなく backward CB の 6.38ms shadow 側にエンコード順序を並べ替えて隠す","**-3〜-5%**","ceiling は host-late bucket 全量 (5.8〜6.5%) だが、`refine_accumulate` は backward N の grad を消費し backward N+1 が同じバッファを上書きするため、そのままでは競合する — grad の double-buffer 化が必要 (depth3 pipelining と同じコストクラスの変更)。ceiling ではなく現実的な値として -3〜-5% を見積もる。**実装 + 12.5k n=3 gate 実施済み、Δ +5.63% (逆符号) で棄却確定 — 詳細 `p3-s4-host-shadow` §8**",[328,323,329,330,331],"2","depth 3 pipelining (scratch 世代をもう 1 段増やす)","**-2〜-4%**","#1 と同じ的を狙うがより鈍い代わりに実装が単純。追加の scratch 世代分メモリコスト増、depth2 default flip (`p2-s3-iteration-pipelining`) と同じ検証手順 (12.5k A\u002FB n=3、PSNR guard) が必要",[333,334,335,336,337],"3","残差 (drvproc)","dispatch 数削減 (kernel 統合等)","**-0.5〜-1.5%**","drvproc は定常帯で中央値 0.026〜0.029ms とほぼ横ばいだが mean は 0.043→0.103ms と band を追うごとに増加 — 増加は tail (max 3.2〜6.6ms) にのみ表れ中央値は動いていないため、'dispatch 数削減' が効くのは tail のみで通常ケースへの寄与は薄い。3 案中最も ceiling が低く優先度は最後",[339,297,340,341,342],"4 (refine)","refine tick の host 仕事 (accumulate\u002Fopacity_decay) を in-flight forward CB の GPU 実行と重ねる non-draining refine 化","**-1.5〜-2.5%**","ceiling は refine bracket 全量 (2.4〜3.1%)。`sync_iters=121\u002F12500` = tick ごとに 1 回の full drain が発生している構造そのものを崩す必要があり、実装コストは #1\u002F#2 より高い",[344,297,345,346,347],"5 (refine)","`refine.every` を 100→200 に緩め tick 頻度を半減","**-1.2〜-1.5%**","A7 で refine tick drain は既に旧 6.26s→3.0〜3.8s まで半減済みのため、残りの headroom も比例して小さい。密度化スケジュールが変わるため PSNR gate 必須 (free ではない、と明記して提案)。**実装不要 (config のみ) + 12.5k n=3 gate 実施済み、PSNR Δ -0.421dB で guard (≥-0.05dB) を約 8.4 倍超過し棄却確定。wallclock は Δ -25.6% と大幅短縮したが drain 削減 (sync_iters 121→61、期待帯どおり寄与) ではなく densification 予算削減 (最終 splat 数 -35%) の副作用が主因 — 詳細 `p3-refine-every-200`**",{"type":51,"text":349},"7. 規約 \u002F 次段への含意",{"type":351,"items":352},"list",[353,354,355,356,357],"**C2 の宿題 (`p3-kernel-share-post-s3.toml` §8 未解決点(1)) を解消** — 12.5k 本番 regime (M4+A7 default 込み) での `gpu_gap_report` 実測が完了。§C2 に本 finding への参照を追記した","**残差 bubble の主因は host-late、handoff (CB 統合) は主因ではない** — task が候補に挙げていた「handoff → CB 統合」は定常帯で headroom がほぼ無いため見送り、host work のエンコード順序変更 (#1) か depth3 pipelining (#2) を優先候補とする","**refine tick drain は A7 で既に大きく削減済み (旧 6.26s → 3.0〜3.8s)** — 残り headroom は task が想定していたより小さく、#4\u002F#5 の効果も相応に小さい。追加投資の優先度は上記 3 提案 (残差側) より低いと見るべき","**旧 3 分解 (refine\u002Fencode(B)\u002F残差) は 2 分解 (refine\u002F通常境界) に訂正** — encode(B) は独立加算成分ではなく通常境界の host-late に吸収される。今後 sync-tax を語るときはこの 2 分解を使うこと","**中央値ベースの 3 分解 (host-late\u002Fdrvproc\u002Fhandoff) は近似** — 中央値は加算的でないため定量的な寄与%は出していない (定性的なランキングのみ)。追加 GPU run による精緻化は本 finding では見送り (advisor レビューでも「追加 run は不要」と確認済み)",{"type":168,"label":359,"variant":360,"text":361},"未解決点","info","(1) 本 finding は n=1 の点推定 — 提案 #1〜#5 を実装した後の A\u002FB gate では n=3 化が必要 (規約どおり)。(2) 中央値ベースの host-late\u002Fdrvproc\u002Fhandoff 寄与比 (≈80%\u002F10%\u002F10-15%) は band2〜4 の代表値からの概算であり、CB ペアごとの正確な寄与分解ではない。(3) band1 (arena growth + warm-up) の excess をどこまで refine 分と非 refine 分に按分するかは tick 数比による粗い見積りのみ — 正確な分離には CB 単位のラベル付け (どの CB が refine tick に属するか) が必要で、現行計装のスコープ外。(4) `commit()`→`kernelStart` の真の driver 投入 latency は依然未計装 (`host_lead` が代替、`p3-kernel-share-post-s3.toml` §8 と同じスコープ外項目)。",[363],{"id":34,"title":34,"subtitle":364,"date":9,"workspace":365,"tags":366,"verdict":368,"psnr":369,"psnr_unit":-1,"wallclock":370,"splats":371,"summary_url":372,"detail_path":372},"C2 計装確認: Lego 12.5k full run (profile=true, pipelining=depth2)。gpu_gap_report で残差 4.54s を cb_gap\u002Fdrvproc\u002Fhandoff\u002Fhost_lead に分解する","splat",[17,18,367,26],"gpu-gate","partial",36.067752838134766,"2m 4s",406651,"\u002Fruns\u002Fc2-12500-depth2-prof\u002F",[374,399,419,442],{"id":38,"title":375,"date":9,"status":10,"polarity":376,"category":377,"axes":378,"tags":379,"task_code":387,"related_runs":388,"delta_psnr":394,"delta_wallclock":395,"rank":42,"verdict":396,"impact_summary":397,"detail_path":398},"M7 最終スタック確定 — 12.5k 124.39s (独立 n=3)、msplat 等価 gap 0.927×→0.755×、throughput 1.135×負け→0.926× (msplat 側 avg splats 借用値 ±8% 未満なら逆転)","positive","experiment",[14,15],[380,381,382,383,384,385,26,367,386],"m7","seminar05-milestones","final-stack","msplat-parity","pareto-v3","throughput-parity","independent-remeasurement","2026-09-seminar05-milestones M7 (最終スタック確定 + msplat 等価再比較 + Pareto v3)",[389,390,391,392,393],"final-12500-r1","final-12500-r2","final-12500-r3","final-12500-r4","c1v2-12500-off-prof","12.5k self-eval (r2-r4 n=3 mean): **36.219 dB** (σ 0.046%)、baseline guard 36.202±0.1dB 内。brush cross-eval q8 (r2-r4 mean): **36.249 dB** (msplat 30K 保守値 34.243 比 **+2.006dB**、旧 +1.97dB とほぼ不変)。white cross-eval (r2-r4 mean): **35.147 dB** (msplat 30K cross-eval 最小 36.252 比 **-1.105dB**、旧 -1.10dB とほぼ不変)","12.5k train elapsed 独立 n=3 (r2\u002Fr3\u002Fr4、clean set): **124.393s (σ 0.756%)**。A7 gate on-arm mean (124.807s) を **-0.33%** で再現。msplat 等価 gap (block1 n=2 分母 164.69s): **0.755×** (旧 0.927×)。per-splat·iter throughput: 本実装 **30.94ns** vs msplat 33.4ns = **0.926×** (旧 1.135×負けから逆転)","final-stack-confirmed-msplat-gap-0.755x-throughput-parity-crossed-pending-msplat-avg-splats-recheck","2026-09-seminar05-milestones M7 を実施した。(1) **12.5k full run 独立 n=3**: `2026-08-30-final-12500-r{1,2,3}.toml` を単純 3 repeat (off arm なし、全 [backend] flag は default 任せ = M4 radix_scatter=SimdBallot + A7 refine_scratch_persist\u002Frefine_direct_write=true 込み) で実行。r1 (131.84s) が r2\u002Fr3\u002Fr4 (123.34\u002F124.69\u002F125.15s) から外れて見えたため、advisor レビューを経て診断用の r4 を追加実行した結果、**r1 は script 再起動時に load sampler window ログが truncate され窓内記録が皆無**という house 規約 (p2-msplat-parity-final §7「事前 gate だけでは不十分、窓内記録が必須」) 上の欠陥を抱えていたことが判明し、r2\u002Fr3\u002Fr4 (全 run とも window 記録あり、load 正常) を正式な n=3 として採用した。**mean 124.393s (σ 0.756%)** — A7 gate on-arm mean 124.807s を -0.33% で独立再現しており、この近さ自体が両 session の健全性証拠になる。r1 込みの参考値 (n=3 リテラル\u002Fn=4 全部) も §1 に残す。(2) **per-kernel share v2**: `2026-08-30-c1v2-12500-off-prof.toml` (submission=per_kernel\u002Fforward_submission=per_stage\u002Fpipelining=off、M4\u002FA7 default 込み) を 1 run。leaf gpu_ms 合計 114.508s は busy union と exact 一致。radix share 26.40%→12.01% (絶対 -63.25%、M4 gate の per_stage 補助計測 -63.7% と独立一致)、backward_raster が単独最大ブロックとしてさらに優位 (33.86%→40.07%)。詳細は `p3-kernel-share-post-s3.toml` §6 に追記。(3) **累計 ablation**: p2 の 8 段 (Phase0 766.07s → S3 151.70s) に M4 (127.53s、-14.9%) \u002F A7 (124.81s、-2.15%) \u002F M7 独立再計測 (124.39s、-0.33%、ほぼ noise level) を継ぎ足し、Phase 0 比 **-83.76%**。(4) **msplat 等価再比較**: p2-msplat-parity-final の計算手順を最終値で再計算。gap 分母は継続性のため block1 n=2 mean (164.69s) を維持 (msplat 側は再実行していない)。**wallclock gap 0.927×→0.755×**。throughput は avg splats を新 4 run の trapezoid 積分から自前算出 (321,637、旧値 322k とほぼ一致し手法の妥当性を裏づける) して **1.135×負け→0.926×勝ち** (ただし msplat 側 avg splats ~165k は p2 からの借用値で本 session では再導出できておらず、逆転が成立するのはこの借用値の誤差が +8.0% 未満の場合に限る、§4 callout 参照)。brush\u002Fwhite PSNR は既存 final.ply に対し `splat eval` を回して再計測し (新規 GPU 学習 run は不要)、両 convention とも旧値からほぼ不変 (brush +2.01dB \u002F white -1.11dB) — M4\u002FA7 は PSNR trajectory に理論上影響しない施策なので想定どおり。matched-iteration (30K vs 30K) \u002F matched-wallclock (旧 13.3k 点) \u002F matched-PSNR(brush) の旧 6.0k 点 \u002F energy は**新規 GPU run が必要なため本 session では再計測せず**、旧スタック値を明示ラベルで carry forward するに留めた (外挿スケーリングによる偽の精度を避ける、advisor レビュー指摘)。(5) **Pareto v3**: `make_msplat_pareto.py` の入力を msplat 等価比較 4 点 Pareto curve (p2-msplat-parity-final §10 の未実施項目) に更新し `docs\u002Ffigures\u002Fpareto-v3-msplat-lego-final-stack.png` を生成。12.5k 点のみ最終スタック値、他 3 点 (6.0k\u002F13.3k\u002F30k) と msplat は旧スタック値のまま明示ラベル。","\u002Ffindings\u002Fp3-final-stack\u002F",{"id":36,"title":400,"date":9,"status":10,"polarity":12,"category":11,"axes":401,"tags":402,"task_code":411,"related_runs":412,"delta_psnr":414,"delta_wallclock":415,"rank":42,"verdict":416,"impact_summary":417,"detail_path":418},"M1\u002Fv2 — post-S2\u002FS3 per-kernel share 再計測: backward_raster 33.9%→40.1% (M4\u002FA7 後)、radix 26.4%→12.0% (M4 の絶対削減を反映) → M3 GO 判定は不変。C2 残差 4.54s は driver latency \u002F CB gap に分解不能 (計装欠如、file:line 提案のみ)",[14,15],[403,380,381,404,405,406,407,23,408,26,409,410,25],"m1","kernel-share","per-kernel-gpu-ms","backward-raster","m3-go-gate","gputime","post-s2-s3","v2","2026-09-seminar05-milestones M1 (C1 per-kernel 再計測 + C2 残差 bubble 帰属)",[413,393],"c1-12500-off-prof","n=1: 36.087 dB (self-eval val mean, 100 views)。p2-s3 の off\u002Fdepth2 n=3 mean (36.185 \u002F 36.202 dB) の guard 内。本 run は submission=per_kernel\u002Fforward_submission=per_stage という別 regime なので PSNR の直接比較は非対象 (kernel は bit-exact のため理論上は同水準になるはず、というだけの参考値)","train elapsed 205.78s (n=1)。**production baseline (depth2 default, 151.70s) や S3 off baseline (185.21s) と直接比較しない** — per_kernel\u002Fper_stage submission は CB 数が既定の 15〜27\u002Fiter → 15 CB\u002Fiter 超 (最終 15,001 cb from iter1 window 相当) に増え、busy% が 68.9% まで下がる**測定専用 regime**であり、本 run の wallclock 自体に意味はない。意味があるのは kernel 単体の gpu_ms とその share のみ","m3-go-backward-raster-33.9pct \u002F c2-instrumentation-gap-proposal-only","M3 (per-splat backward, brush PR #401 型) の GO\u002FNO-GO 閾値「backward_raster share ≥ 25%」を判定した。post-S2\u002FS3 kernel (hierarchical radix scan \u002F resident binning) を submission=per_kernel\u002Fforward_submission=per_stage\u002Fpipelining=off (per-kernel breakdown が測れる唯一の regime) で 1 run 実測した結果 \u003Cstrong>backward_raster (+project_back 統合) share 33.86%\u003C\u002Fstrong> で \u003Cstrong>閾値を大きく超過 → M3 は GO\u003C\u002Fstrong>。\u003Cstrong>share × 0.25 (brush の -25% 主張をそのまま適用したナイーブな期待値) = 8.47%\u003C\u002Fstrong>。ただしこれは本 run の GPU busy (68.9%、production の 91.3% とは別 regime) に対する share であり、production (depth2 default) の wallclock に対する期待 Δ は \u003Cstrong>33.86% × 91.3% × 0.25 ≈ 7.7%\u003C\u002Fstrong> とみるほうが妥当 (kernel 自体の gpu_ms は submission wrapping にほぼ不変という counter-session の事後検証はあるが、n=1 点推定であることと合わせて上限値として扱う)。\u003Cstrong>pre-S2\u002FS3 (counter-session) との比較では share 構成はほぼ不変\u003C\u002Fstrong> (backward_raster 33.6%→33.86%、radix 26.3%→26.40%、rasterize 11.9%→11.64%、adam 13.8%→12.68%、ssim 10.0%→10.95%) — S2 のhierarchical scan は「radix の CB\u002Fwait 数」を畳んだだけで kernel 自体の GPU 時間配分は変えていない、という roadmap の当初の想定を実測で裏づけた。C2 は M0 の並行会計訂正 (encode(B) 4.66→3.41s、残差 3.28→4.54s、nested label 二重計上の是正) を踏まえ、\u003Cstrong>残差 4.54s (depth2 sync-tax の 32%) を driver 投入 latency と CB 間 gap に分解しようとしたが、既存計装 (`gputime.rs`) は `kernelStartTime`\u002F`kernelEndTime` を objc bind しているのみで収集しておらず、per-CB の生 interval 列も外部に露出していない\u003C\u002Fstrong> ため\u003Cstrong>分解不能\u003C\u002Fstrong>と判明した。file:line 付きの追加案を §C2 に残す (実装はしていない、GPU run はこれ以上起動していない)。","\u002Ffindings\u002Fp3-kernel-share-post-s3\u002F",{"id":39,"title":420,"date":9,"status":10,"polarity":376,"category":377,"axes":421,"tags":422,"task_code":432,"related_runs":433,"delta_psnr":436,"delta_wallclock":437,"rank":438,"verdict":439,"impact_summary":440,"detail_path":441},"A7 refine 3-pass 削減 — 採用確定 (2026-08-30 gate)",[14,15],[39,423,424,425,426,427,428,26,429,430,431],"a7","refine","scratch-persist","direct-write","alloc-churn","in-flight-invariant","gate-adopted","default-flip","contaminated-series","docs\u002Fstrategy\u002F2026-08-next-phase-tasklist.md Tier2 A7 (refine の 3-pass 削減)",[434,435],"splat\u002Fruns-logs\u002Fa7-12500-*.log (1回目 series、棄却・保存)","splat\u002Fruns-logs\u002Fa7v2-12500-*.log (2回目 series、採用根拠)","+0.0197 dB (12.5k n=3、guard 内。書き込みロジック自体は不変なので理論上の期待通りノイズレベル)","**-2.149%** (12.5k n=3、閾値 max(2σ_off,1%)=1.612%、3\u002F3 pair 一貫)。tasklist 期待帯 -1.3〜-2.6% にちょうど収まる","mid","adopted","A7 (refine の 3-pass 削減) を実装・gate した。(a) \u003Ccode>refine_scratch_persist\u003C\u002Fcode>: compact pass の scratch \u003Ccode>Vec\u003C\u002Fcode> 30 本を \u003Ccode>RefineState\u003C\u002Fcode> (新設 \u003Ccode>RefineScratch\u003C\u002Fcode>) に永続化し \u003Ccode>std::mem::take\u003C\u002Fcode> で借り出し・tick 末尾で書き戻す。allocation の出所が変わるだけで計算は 1 つも変えない。(b) \u003Ccode>refine_direct_write\u003C\u002Fcode>: compact 書き込み先の抽象 \u003Ccode>Dst\u003C\u002Fcode> (\u003Ccode>Vec\u003C\u002Fcode> か Metal buffer 生ポインタ) を導入し、\u003Ccode>direct_write = true\u003C\u002Fcode> のとき新規 \u003Ccode>Vec\u003C\u002Fcode> を一切作らず compact loop が \u003Ccode>param.*\u003C\u002Fcode>\u002F\u003Ccode>adam_state.*\u003C\u002Fcode> に直接書く。実装中に見つけた subtle な罠: Clone の複製先 \u002F Respawn \u002F Split の子スロットは旧実装では「新規 0 埋め \u003Ccode>Vec\u003C\u002Fcode>」から無料で Adam m\u002Fv = 0 を得ていたが、direct 経路は \u003Cstrong>stale データが残っている可能性のある live buffer\u003C\u002Fstrong> に書くため、この暗黙の 0 を前提にできない — \u003Ccode>zero_adam_at\u003C\u002Fcode> ヘルパーで明示的に 0 を書くよう修正した (無修正だと A7(b) 単体で MCMC 論文の「新規 slot は Adam fresh start」不変条件が壊れていた)。不変条件 I (\u003Ccode>[num_splats, capacity)\u003C\u002Fcode> は常に 0) は direct 経路でも \u003Ccode>zero_tail\u003C\u002Fcode> による \u003Ccode>[n_new, n_write)\u003C\u002Fcode> の明示 0 埋めで維持する。\u003Cstrong>gate: 12.5k n=3 交互 A\u002FB (2回目 series、a7v2-12500) で Δ -2.149% (閾値 max(2σ_off,1%)=1.612%)、PSNR +0.0197dB (guard 内)、3\u002F3 pair 一貫 (on&lt;off)。1回目 series は load 汚染 (6 run 中 3 run に load1 スパイク) で棄却\u003C\u002Fstrong>。default flip 実施: \u003Ccode>BackendConfig::default()\u003C\u002Fcode> の両 flag を \u003Ccode>true\u003C\u002Fcode> に変更。field 単独の \u003Ccode>#[serde(default)]\u003C\u002Fcode> は付けない (bool 型に付けると \u003Ccode>bool::default()\u003C\u002Fcode>=false に固定され struct 側の true を上書きするため — \u003Ccode>target_cache\u003C\u002Fcode>\u002F\u003Ccode>shader_fast_math\u003C\u002Fcode> と同じ規約)、これは 1 iter smoke で config 省略時に \u003Ccode>refine_scratch_persist: true, refine_direct_write: true\u003C\u002Fcode> が実際に解決されることを確認済み。\u003Ccode>cargo test --workspace --release\u003C\u002Fcode> 全 pass (0 failed)。","\u002Ffindings\u002Fp3-refine-3pass\u002F",{"id":37,"title":443,"date":444,"status":10,"polarity":376,"category":377,"axes":445,"tags":446,"task_code":456,"related_runs":457,"delta_psnr":468,"delta_wallclock":469,"rank":42,"verdict":470,"impact_summary":471,"detail_path":472},"S3 iteration pipelining depth 2 — 12.5k -18.1% \u002F busy 78 → 91% (default flip)","2026-08-17",[14,15],[447,448,449,450,451,452,453,454,26,455],"1x-roadmap-v2","s3","iteration-pipelining","command-buffer","gpu-busy","sync-tax","double-buffering","scratch-generation","unified-memory","2026-08 1× 工程表 v2 — AC 復帰後 計測 queue #2' (S3 gate)",[458,459,460,461,462,463,464,465,466,467],"s3-smoke-1000-off","s3-smoke-1000-depth2","s3-12500-off-prof","s3-12500-depth2-prof","s3-12500-off-r1","s3-12500-off-r2","s3-12500-off-r3","s3-12500-depth2-r1","s3-12500-depth2-r2","s3-12500-depth2-r3","12.5k **同一 session 交互 A\u002FB** n=3 mean: depth2 **36.202 dB** (36.195 \u002F 36.179 \u002F 36.231) vs off **36.185 dB** (36.178 \u002F 36.192 \u002F 36.186) = **+0.016 dB** (guard 36.167 ± 0.1 の内側、n=3 mean 判定 — n=1 判定なし)。final splats は depth2 406,439 \u002F off 408,874 で **depth2 のほうが 0.6% 少ない** (前段の profile pair では逆に +0.6% で、方向が一致しない = 既存 atomic 非決定性の chaos 増幅の範囲)","12.5k full run **同一 session 交互 A\u002FB n=3 mean: 185.21 → 151.70s = -18.1%** (train elapsed)。process wallclock では **188.33 → 154.00s = -18.2%**。σ は off 3.33% \u002F depth2 1.18% なので有意閾値 max(2σ,1%) = 6.7%、実測 Δ は**その 2.7 倍**。同一 session の off arm は S2 gate 当日の S2 arm (train 184.61s \u002F process 187.65s) を **+0.3% で再現**しており、session の健全性が確認できている。参考: profile=true の 1 対 1 比較では 180.49 → 162.72s = -9.85% (計装自体が host 側 critical path に乗るため S3 の効果を過小評価する)","s3-adopted-default-flip-pipelining-depth2","1× 工程表 v2 が「S2 後の単独本命」に指定していた S3 を gate し、採用した。S2 までの施策が \u003Cstrong>CB の数\u003C\u002Fstrong>を減らすものだったのに対し、S3 は \u003Cstrong>CB の並び方\u003C\u002Fstrong>を変える — iteration N の loss\u002Fbackward CB (B\u003Csub>N\u003C\u002Fsub>) を commit したら wait せずに iteration N+1 の forward CB (F\u003Csub>N+1\u003C\u002Fsub>) を組んで commit し、\u003Ccode>wait(B\u003Csub>N\u003C\u002Fsub>)\u003C\u002Fcode> の後の host readback \u002F \u003Ccode>accumulate\u003C\u002Fcode> を F\u003Csub>N+1\u003C\u002Fsub> の GPU 実行の影に置く。\u003Cstrong>12.5k 同一 session 交互 A\u002FB n=3 で 185.21 → 151.70s = -18.1%\u003C\u002Fstrong> (閾値 max(2σ,1%) = 6.7% の 2.7 倍)。\u003Cstrong>GPU busy 77.5 → 91.3% \u002F sync-tax 3.244 → 1.136 ms\u002Fiter (-65%)\u003C\u002Fstrong> で counter session が置いた「busy 100% = 理論上限」への距離は 22.5 pt → 8.7 pt に縮んだ。\u003Cstrong>1k smoke では busy 65.8 → 72.0% にしか上がらず判定不能だった\u003C\u002Fstrong> — smoke の splat 数 6.8k では forward の GPU 影 (1.06 ms\u002Fiter) が image size 固定の host 仕事 (~1.7 ms\u002Fiter) を隠しきれないためで、これは \u003Cstrong>「pipelining の gate は smoke では代替できない」という harness 上の教訓\u003C\u002Fstrong>として残す。残 bubble の内訳も確定した: \u003Cstrong>refine tick の drain 6.04s (43%) &gt; encode(B) 4.66s (33%) &gt; 残差 3.28s (23%)\u003C\u002Fstrong> — 次の一手が roadmap の「即効ペア (refine capacity スコープバグ修正)」であることが実測で決まった。msplat 同日等価 gap \u003Cstrong>1.105× → 0.907×\u003C\u002Fstrong>、Phase 0 からの累計 766.07 → 154.0s = \u003Cstrong>-79.9%\u003C\u002Fstrong> (全て数学的同値の施策のみ)。","\u002Ffindings\u002Fp2-s3-iteration-pipelining\u002F",1790227327647]