[{"data":1,"prerenderedAt":353},["ShallowReactive",2],{"finding:p2-c0-resident-binning":3,"finding-runs:p2-c0-resident-binning":227,"finding-related:p2-c0-resident-binning":264},{"meta":4,"impact":44,"sections":50},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":16,"task_code":26,"commit":27,"branch":28,"config_paths":29,"related_runs":34,"related_findings":39},"p2-c0-resident-binning","P2 gap sweep Phase 2 — C0 resident arena + C1 pass skip で -48.4% (bit-exact)","binning 経路 55% の主犯 (per-iter ~1.25GB buffer 確保 + Vec 三重往復) を grow-only resident arena + Buffer 直結で撤廃し、radix pass を 16 → 11 に削減。Lego 12.5k gate run で \u003Cstrong>wallclock 766.07 → 395.59s = -48.4%\u003C\u002Fstrong>、PSNR 36.216 → 36.183 dB (-0.033、atomic guard ±0.1 内)。emit_pairs 23.47 → 0.47ms\u002Fcall (\u003Cstrong>-98%\u003C\u002Fstrong>)、radix_sort 10.19 → 4.79ms (-53%)、extract 757 → 145µs (-81%)。Day 0 attribution で機構を一段修正: Metal new_buffer は lazy なので host 計測 alloc は 42µs しかなく、\u003Cstrong>1.25GB\u002Fiter の実コストは first-touch page fault として emit の GPU wait に現れていた\u003C\u002Fstrong> (fresh-alloc 26.5ms vs buffer 再利用 0.61ms = 43×)。数学的同値 (演算順序・数値不変) を parity test 群で証明し、default を Resident に flip。","P2 gap sweep · Phase 2 · C0 + C1","2026-08-16","stable","experiment","positive",[14,15],1,3,[17,18,19,20,21,22,23,24,25],"gap-sweep","phase-2","c0-resident-arena","c1-radix-pass-skip","binning","bit-exact","unified-memory","page-fault","lego","2026-08 msplat gap sweep Phase 2 C0\u002FC1","0abdaa2","main",[30,31,32,33],"splat\u002Fconfigs\u002F2026-08-16-lego-c0-day0-attrib-1k.toml","splat\u002Fconfigs\u002F2026-08-16-lego-c0-ab-periter-1k.toml","splat\u002Fconfigs\u002F2026-08-16-lego-c0-ab-resident-1k.toml","splat\u002Fconfigs\u002F2026-08-16-lego-c0-resident-12500.toml",[35,36,37,38],"lego-c0-day0-attrib-1k","lego-c0-ab-periter-1k","lego-c0-ab-resident-1k","lego-c0-resident-12500",[40,41,42,43],"p2-gap-sweep-baseline","p1-axis1-phase-f1-emit-simd-falsified","p1-axis1-phase-f3-radix-gpu-prefix-falsified","p1-msplat-baseline-spike",{"summary":45,"rank":46,"verdict":47,"delta_psnr":48,"delta_wallclock":49},"\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 を疑うこと。","high","c0-c1-adopted-default-flip-minus-48-percent","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%)",[51,54,57,82,87,89,104,106,139,143,145,190,194,196,224],{"type":52,"text":53},"lead","binning 経路 55% (p2-gap-sweep-baseline) の主犯を \u003Cstrong>grow-only resident arena + Buffer 直結\u003C\u002Fstrong> (C0) と \u003Cstrong>radix 定数桁 pass skip 16 → 11\u003C\u002Fstrong> (C1) で是正。演算順序・数値を一切変えない bit-exact 施策のみで Lego 12.5k が \u003Cstrong>766.07 → 395.59s (-48.4%)\u003C\u002Fstrong>。Day 0 attribution が機構を一段修正した: 主犯は host alloc 時間ではなく、毎 iter 新規確保される ~1.25GB buffer への \u003Cstrong>first-touch page fault が GPU wait に化けていた\u003C\u002Fstrong>。",{"type":55,"text":56},"heading","1. Day 0 attribution — 仮説の機構修正 (gate 判定)",{"type":58,"columns":59,"align":64,"rows":67},"table",[60,61,62,63],"計測","regime","emit 内訳","値",[65,65,65,66],"left","right",[68,73,77],[69,70,71,72],"1k smoke (profile)","6.8k splats \u002F cap 1.7M pairs","gpu \u002F readback \u002F upload \u002F alloc","523 \u002F 87 \u002F 24 \u002F 9 µs (host 系 18.5%)",[74,75,71,76],"micro-bench fresh-alloc","407k splats \u002F cap 104M pairs","26.50ms \u002F 2.09ms \u002F 824µs \u002F **42µs** (gpu 90%)",[78,79,80,81],"micro-bench buffer 再利用","同上 (同一 dispatch 列)","gpu のみ","**0.61ms** (fresh-alloc の 1\u002F43)",{"type":83,"label":84,"variant":85,"text":86},"callout","機構修正 — alloc コストは GPU wait に化ける","warning","設計調査の仮説「emit の主犯は host alloc + Vec 往復」は方向として正しかったが、attribution の宛先が違った。\u003Cstrong>Metal の new_buffer は lazy なので host 計測 alloc は 42µs\u003C\u002Fstrong> しかない — 毎 iter 新規の keys 833MB + idx 417MB へ GPU が最初に書き込む瞬間の \u003Cstrong>first-touch page fault (zero-fill) が wait_until_completed に紛れ込み、emit の「GPU 時間」26.5ms の 97% を占めていた\u003C\u002Fstrong>。文言通りの gate (host 系 ≥50%) は 1k smoke で 18.5% と不発だが、regime 不一致 (6.8k vs 407k splats = capacity 60×) を micro-bench で補正すると非 kernel コストは ~98% で gate は決定的に通過。C0 本実装を GO とした。",{"type":55,"text":88},"2. 実装 (C0 \u002F C1、いずれも bit-exact)",{"type":58,"columns":90,"align":94,"rows":95},[91,92,93],"項目","内容","同値性の証明",[65,65,65],[96,100],[97,98,99],"**C0 resident arena** (`BinningKind::Resident`)","splats\u002Fdepths 入力・keys\u002Fidx ping-pong・hist\u002Foffsets・scalar uniform 群・tile_offsets を grow-only arena として iter 間再利用。emit → radix → extract を Buffer 直結、host に降ろすのは sorted_idx と tile_offsets のみ。capacity = max(1\u003C\u003C16, n×16, 前 iter 実績×1.5)、overflow は arena grow + 再 emit (12.5k run で発火 1 回 = iter 1 のみ)。batched_tail (A.7) も arena 直結対応","resident vs per_iter_alloc で sorted keys \u002F sorted idx \u002F tile_offsets の byte equality (synthetic + 40k splats ~515k pairs + arena 再利用 + 空入力) + forward 1-frame bit-exact (per-stage \u002F batched_tail)",[101,102,103],"**C1 radix pass skip** (`radix_passes_for_tiles`)","sort key = (tile_id\u003C\u003C32)|depth_bits で tile_id \u003C num_tiles → 上位の all-zero 4-bit digit pass は stable radix の恒等置換。pass 数 = min(16, 8 + ceil(bits(num_tiles-1)\u002F4))、Lego 2500 tiles で 11。enum flag なしの直接置換 (legacy 経路にも適用)、奇数 pass の ping-pong 出力先も検証","radix_sort_binned vs 16-pass 版 vs CPU stable sort の byte equality (2500 tiles = 11 pass 奇数 \u002F 40000 tiles = 12 pass 偶数 \u002F u32::MAX = 16 pass、各 200k keys)",{"type":55,"text":105},"3. A\u002FB 1k smoke (C0 単独分離、両 arm C1 込み)",{"type":58,"columns":107,"align":112,"rows":113},[108,109,110,111],"metric","per_iter_alloc","resident","Δ",[65,66,66,66],[114,119,124,129,134],[115,116,117,118],"wallclock (1k)","11.36s","10.66s","-6.2%",[120,121,122,123],"emit_pairs","588µs\u002Fcall","231µs\u002Fcall","**-60.7%**",[125,126,127,128],"radix_sort","2.470ms\u002Fcall","2.196ms\u002Fcall","-11.1%",[130,131,132,133],"extract_off","233µs\u002Fcall","132µs\u002Fcall","-43.3%",[135,136,137,138],"PSNR (100 views)","19.480 dB","19.440 dB","-0.04 (refine 非決定性圏内)",{"type":83,"label":140,"variant":141,"text":142},"C1 単独の寄与","info","Day 0 run (C1 前、16 pass) の radix 3.685ms\u002Fcall → C1 適用 per_iter_alloc arm で 2.470ms\u002Fcall = \u003Cstrong>-33%\u003C\u002Fstrong>。pass 数 16 → 11 (-31%) とほぼ整合。1k regime は splats 6.8k で C0 の効果が小さく出る (capacity 60 分の 1) ため、C0 の本判定は 12.5k gate で行った。",{"type":55,"text":144},"4. 12.5k gate run (baseline 766.07s \u002F 36.216 dB との比較)",{"type":58,"columns":146,"align":149,"rows":150},[108,147,148,111],"baseline (per_iter_alloc, 7e5ca2d)","resident (C0+C1, 0abdaa2)",[65,66,66,66],[151,156,160,165,170,175,180,185],[152,153,154,155],"**wallclock (training)**","766.07s","395.59s","**-48.4%**",[135,157,158,159],"36.216 dB","36.183 dB","-0.033 dB (guard ±0.1 内)",[161,162,163,164],"final splats","407,267","407,901","+0.16% (軌道等価)",[166,167,168,169],"ts_fwd_emit_pairs","293.3s (23.47ms\u002Fcall, 38.2%)","5.9s (0.47ms\u002Fcall, 1.2%)","**-98.0%**",[171,172,173,174],"ts_fwd_radix_sort","127.4s (10.19ms\u002Fcall, 16.6%)","59.8s (4.79ms\u002Fcall, 11.7%)","**-53.1%**",[176,177,178,179],"ts_fwd_extract_off","9.5s (757µs\u002Fcall)","1.8s (145µs\u002Fcall)","-80.8%",[181,182,183,184],"ts_backward_raster","164.5s (13.16ms\u002Fcall, 21.5%)","160.4s (12.83ms\u002Fcall, **31.4%**)","-2.5% (share は最大化)",[186,187,188,189],"ts_fwd_rasterize","43.3s (3.47ms\u002Fcall)","41.2s (3.30ms\u002Fcall)","-4.9%",{"type":83,"label":191,"variant":192,"text":193},"verdict: 採用 — `binning` default を Resident に flip","success","flip 条件 (-15% & parity 通過) を大幅超過。PSNR -0.033 dB は bit-exact 実装下の run-to-run atomic 非決定性 (backward の atomic&lt;float&gt; → refine 軌道 ±、splats +0.16%) で説明され、guard ±0.1 dB 内。\u003Cstrong>PerIterAlloc は敗者 variant として enum に保持\u003C\u002Fstrong> (A\u002FB baseline 用)。eval \u002F render など apply_backend_config を通らない caller も binner Cell default の同期 flip で resident を踏む。",{"type":55,"text":195},"5. Phase 2 残課題への影響",{"type":58,"columns":197,"align":202,"rows":203},[198,199,200,201],"候補","C0 前","C0 後","判定",[65,66,66,65],[204,209,214,219],[205,206,207,208],"2-BWD last_contributor","backward 21.5% (trigger 25% 未達で保留)","**31.4%**","**trigger 初超過 — 次の最有力候補**",[210,211,212,213],"radix sort 本体 (GPU compute)","16.6% (alloc 混在)","11.7% (compute 主体)","#5.40 8-bit radix の再評価余地はあるが優先度低",[215,216,217,218],"STP (feat.F) default 再判定","-7.45% (gate -8% に僅差未達)","要再 bench","Phase 1a の -7.45% は emit の page fault 削減と重複していた可能性が高い (emit share 38.2% → 1.2% で寄与源が消滅)。C0 後 baseline で paired A\u002FB を取り直してから default 判定",[220,221,222,223],"separable SSIM \u002F SH-Adam fusion","5.2% \u002F 6.1%","6.6% \u002F ~9.5%","不発維持 (相対 share は上昇したが trigger 未達)",{"type":83,"label":225,"variant":141,"text":226},"教訓 — unified memory の profiling 罠","per-kernel wallclock で「GPU が遅い」ように見える区間に host のメモリ管理コスト (lazy alloc の first-touch) が化けることがある。F.1 \u002F F.3 \u002F #5.40 が kernel 側の最適化で 3 連敗した理由も遡って整合する — \u003Cstrong>遅かったのは kernel ではなく buffer lifecycle だった\u003C\u002Fstrong>。今後の kernel 最適化判断は「buffer 再利用 micro-bench で kernel 本体時間を分離してから」を必須手順とする。",[228,239,245,255],{"id":36,"title":36,"subtitle":229,"date":9,"workspace":230,"tags":231,"verdict":235,"psnr":236,"psnr_unit":-1,"wallclock":116,"splats":237,"summary_url":238,"detail_path":238},"C0 A\u002FB smoke (1k) — arm A: binning = per_iter_alloc (C1 radix pass skip は両 arm 共通)","splat",[232,19,233,234,25],"p2-gap-sweep","ab-smoke","per-iter-alloc","partial",19.479509353637695,6849,"\u002Fruns\u002Flego-c0-ab-periter-1k\u002F",{"id":37,"title":37,"subtitle":240,"date":9,"workspace":230,"tags":241,"verdict":235,"psnr":242,"psnr_unit":-1,"wallclock":117,"splats":243,"summary_url":244,"detail_path":244},"C0 A\u002FB smoke (1k) — arm B: binning = resident (C0 arena + C1)",[232,19,233,110,25],19.44037437438965,6791,"\u002Fruns\u002Flego-c0-ab-resident-1k\u002F",{"id":35,"title":35,"subtitle":246,"date":9,"workspace":230,"tags":247,"verdict":235,"psnr":251,"psnr_unit":-1,"wallclock":252,"splats":253,"summary_url":254,"detail_path":254},"C0 Day 0 gate — emit_pairs の host alloc\u002Fupload\u002Freadback attribution 実測 (1k smoke)",[232,19,248,249,250,25],"day0-gate","attribution","smoke",19.484481811523438,"14.27s",6788,"\u002Fruns\u002Flego-c0-day0-attrib-1k\u002F",{"id":38,"title":38,"subtitle":256,"date":9,"workspace":230,"tags":257,"verdict":235,"psnr":260,"psnr_unit":-1,"wallclock":261,"splats":262,"summary_url":263,"detail_path":263},"2026-08 gap sweep Phase 2 C0+C1 gate — baseline 12.5k に binning = resident を追加 (bit-exact 経路)",[232,19,20,258,259],"gate-run","lego-12500",36.183258056640625,"6m 35s",407901,"\u002Fruns\u002Flego-c0-resident-12500\u002F",[265,287,308,335],{"id":40,"title":266,"date":9,"status":10,"polarity":12,"category":11,"axes":267,"tags":268,"task_code":274,"related_runs":275,"delta_psnr":282,"delta_wallclock":283,"rank":46,"verdict":284,"impact_summary":285,"detail_path":286},"P2 gap sweep Phase 0\u002F1a — binning 55% 実測 + C0 発見 + StopThePop -7.45%",[14],[17,269,270,271,272,273,21,19,25],"phase-0","phase-1a","profiling","per-kernel-breakdown","stop-the-pop","2026-08 msplat gap sweep Phase 0 + 1a",[276,277,278,279,280,281],"lego-gap-baseline-12500","lego-stp-12500","lego-stp-ab-original-5k-r1","lego-stp-ab-original-5k-r2","lego-stp-ab-stp-5k-r1","lego-stp-ab-stp-5k-r2","STP 12.5k: 36.216 → 36.193 dB = -0.023 dB (guard -0.05 内で通過)","STP 12.5k: 766.07 → 708.96s = **-7.45%** (emit -10.5% \u002F radix -8% \u002F backward -6%)","binning-55-percent-c0-discovered-stp-marginal-go","\u003Cstrong>Phase 2 の主戦場が確定\u003C\u002Fstrong>: strategy doc の trigger 3 候補 (separable SSIM \u002F last_contributor \u002F SH-Adam fusion) は全て閾値不発、代わりに \u003Cstrong>binning 経路 55% の主犯 = per-iter ~1.25GB alloc + Vec 三重往復 (C0)\u003C\u002Fstrong> が最大 lever。C0 (persistent buffer arena、bit-exact、3-4 日) の期待は \u003Cstrong>wallclock -30〜39% (766→~470s) で単独 gap ≤2.0× 到達圏\u003C\u002Fstrong>。C1 (radix 定数桁 pass skip 16→11、bit-exact、0.5-1 日) が +4-5%。StopThePop は -7.45% で adoption gate (-8%) に僅差未達、default 維持のまま C0 後再判定。5 連敗の教訓「profiling が指す順」が機能した初の事例 — 事前決め打ちなら SSIM (5.2%) に突撃していた。","\u002Ffindings\u002Fp2-gap-sweep-baseline\u002F",{"id":43,"title":288,"date":289,"status":10,"polarity":290,"category":11,"axes":291,"tags":293,"task_code":301,"related_runs":302,"delta_psnr":303,"delta_wallclock":304,"rank":46,"verdict":305,"impact_summary":306,"detail_path":307},"msplat v1.1.3 baseline spike — M4 Max 実測、Lego 30K で 3m40s \u002F 35.48 dB、materials で densify 破綻","2026-06-26","mixed",[14,292,15],2,[294,295,296,297,298,299,300],"msplat","baseline","apple-silicon","m4-max","nerf-synthetic","direct-comparison","thesis-ready","P1 msplat spike (critical path)",[],"Lego: 本実装 +0.78 dB (Phase H 12500 vs msplat 30K)、materials: 本実装 +21.17 dB (Phase I 12500 vs msplat 7K broken)","Lego: msplat -3.2× (msplat 3m40s vs Phase H 11m48s)、chair 7K のみ msplat -63× (msplat 17.58s vs Phase I 18m35s)","critical-path-complete-A-confirmed","\u003Cstrong>msplat (rayanht) v1.1.3 を M4 Max で実測完了\u003C\u002Fstrong>。Lego 30K で 219.8s (3m40s) \u002F 35.48 dB \u002F 208k splats、chair 7K で 17.58s \u002F 33.81 dB を確認。\u003Cstrong>本実装 Phase H lego (11m48s \u002F 36.26 dB) に対し msplat は wallclock 3.2× 高速、ただし PSNR は -0.78 dB\u003C\u002Fstrong>。materials 7K では PSNR 8.80 \u002F splats 367 と densification が壊れた — msplat の scene robustness 弱点が判明し、本実装の \u003Cstrong>universal な density 動作\u003C\u002Fstrong>が明確な差別化軸として確定。\u003Cstrong>本実装 Phase I 8 scene のうち 5 scene が msplat lego 30K の 35.48 dB を上回る\u003C\u002Fstrong> (Lego 36.26 \u002F chair 35.88 \u002F hotdog 37.37 \u002F mic 36.62 \u002F drums は 27 のみ)。Pareto plot で msplat は左上 (速い + 中品質)、本実装は右側 (遅い + 高品質 + 全 scene robust) と vector が直交。本 spike により \u003Cstrong>A (Reframing narrative) の killer figure が確定\u003C\u002Fstrong>、\u003Cstrong>B (G.2 backport) は引き続き NO-GO\u003C\u002Fstrong> (msplat が既に kernel fusion + pre-allocated bins まで実装済、本実装が追いつく工数は大)、\u003Cstrong>E (msplat 著者接触) の materials bug 報告は良い PR ネタ\u003C\u002Fstrong>。","\u002Ffindings\u002Fp1-msplat-baseline-spike\u002F",{"id":41,"title":309,"date":310,"status":10,"polarity":311,"category":312,"axes":313,"tags":314,"task_code":324,"related_runs":325,"delta_psnr":329,"delta_wallclock":330,"rank":331,"verdict":332,"impact_summary":333,"detail_path":334},"Phase F.1 emit_pairs_simd + f16 forward gate flip — audit Tier 1 仮説 falsified、現規模で net regression \u002F no improvement","2026-05-25","negative","audit",[14],[315,316,317,318,319,320,321,322,323],"p1-axis1","phase-f","emit-simd","f16-forward","tier-1","falsified","negative-finding","ab-test","lego-5k","P1 Phase F.1 \u002F F.2",[326,327,328],"lego-phase-f1-emit-simd-5k","lego-phase-f1-baseline-5k","lego-phase-f2-f16-fwd-5k","±0.13 dB (両者とも許容範囲、atomic\u002Ffp 順序由来)","+4.7% (emit_simd net regression) \u002F +2.5% (f16 fwd noise 圏内)","medium","audit-falsified-tier-1","audit (p1-axis1-metal-opt-audit) で Tier 1「即 actionable gate flip、-0.7-1.0% wallclock、zero risk」と分類した 2 候補を Lego 5k smoke A\u002FB で実証検証。\u003Cstrong>emit_pairs_simd は total wallclock +4.7% の net regression\u003C\u002Fstrong> (112.11s → 117.38s、~10 kernel 平均なので noise floor 小、real regression 確定)、ただし per-kernel emit_pairs 単体は +8.5% で baseline 2 sample 変動 (4.814 \u002F 5.129、6.5%) と近い hedge 必要。\u003Cstrong>f16 forward は ~+2.5% wallclock\u003C\u002Fstrong> (114.97s)、run-to-run variance 圏内で improvement \u002F regression いずれも明確に検出できず。\u003Cstrong>PSNR は両者で許容範囲\u003C\u002Fstrong> (emit_simd -0.132 dB、f16 +0.075 dB、atomic order \u002F fp 順序由来想定)。**audit の予測 calibration data**: Tier 1 SIMD-reduction 系の効果は theory より小さく overhead が打ち消し、Tier 2 別 mechanism (CPU-GPU sync 除去) は別途検証必要、Tier 2 同 family (backward TBDR) は falsification 拡大適用で skip 判断強化。卒論 narrative 価値: 「audit theoretical predictions vs empirical measurements」の方法論 paragraph を §5.4 negative findings 章 (chapter-5-4-negative-findings.md) に追加候補。","\u002Ffindings\u002Fp1-axis1-phase-f1-emit-simd-falsified\u002F",{"id":42,"title":336,"date":310,"status":10,"polarity":311,"category":312,"axes":337,"tags":338,"task_code":344,"related_runs":345,"delta_psnr":348,"delta_wallclock":349,"rank":46,"verdict":350,"impact_summary":351,"detail_path":352},"Phase F.3 radix GPU prefix scan — bit-exact 実装完成だが Metal implicit fences で +7.4% wallclock \u002F +35-41% per-call regression、audit Tier 2 仮説 falsified",[14],[315,316,339,340,341,320,321,342,343,322,323],"radix-sort","gpu-prefix-scan","tier-2","metal-fences","tbdr","P1 Phase F.3",[346,347],"lego-phase-f3-baseline-5k","lego-phase-f3-gpu-scan-5k","+0.03 dB (parity、bit-exact 経路、session noise 内)","+7.4% (+8.58s @ 5k iter、sanity rerun +4.8% でも regression 確定)","audit-falsified-tier-2","audit (p1-axis1-metal-opt-audit) で Tier 2 「radix_sort GPU prefix sum、-0.5-0.8% wallclock、LOW PSNR risk」と分類した候補を empirical 検証。\u003Cstrong>bit-exact 実装は完成\u003C\u002Fstrong> (16-thread single-threadgroup kernel、Apple SIMD prefix exclusive sum + per-digit serial scan、100k random \u002F 500k packed keys \u002F edge cases 6 種で CPU stable sort と byte-for-byte 一致)、しかし 5k Lego smoke で \u003Cstrong>wallclock 115.83s → 124.41s (+7.4%)、ts_fwd_radix_sort 4.768 → 6.733 ms\u002Fcall (+41%)\u003C\u002Fstrong> の net regression。sanity re-run (118.73s \u002F 6.402ms) で再現確認、run-to-run 変動の上。\u003Cstrong>PSNR は parity\u003C\u002Fstrong> (31.604 → 31.635 dB、bit-exact 経路で 0 drift 期待、観測 +0.03 dB は session noise)。\u003Cstrong>Likely mechanism\u003C\u002Fstrong>: StorageModeShared buffer での back-to-back compute encoder 間で Metal が implicit fence を挿入 (hist→scan の buf_hist、scan→scatter の buf_offsets で read-after-write hazard)、TBDR pipeline stall。旧 CPU 経路は buf_hist→buf_offsets 変換を host で実行するため GPU 内 memory dependency が無く、\u003Cstrong>「除去した wait_until_completed」は実は CPU prefix scan と overlap していた active work\u003C\u002Fstrong> だった。教訓: 「CPU 介在を on-GPU に置換」族の audit 予測は overlap の存在を見落とすため systematically overestimate、Tier 2 同 family (backward TBDR、tile-local accumulator) の skip 判断強化。kernel + tests は env \u003Ccode>SPLAT_RADIX_GPU_SCAN=1\u003C\u002Fcode> で opt-in (future workload hedge)。","\u002Ffindings\u002Fp1-axis1-phase-f3-radix-gpu-prefix-falsified\u002F",1790227326538]