[{"data":1,"prerenderedAt":290},["ShallowReactive",2],{"finding:p1-axis1-phase-f3-radix-gpu-prefix-falsified":3,"finding-runs:p1-axis1-phase-f3-radix-gpu-prefix-falsified":173,"finding-related:p1-axis1-phase-f3-radix-gpu-prefix-falsified":197},{"meta":4,"impact":37,"sections":43},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":27,"related_runs":28,"related_findings":31},"p1-axis1-phase-f3-radix-gpu-prefix-falsified","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","Phase F.1 emit_simd \u002F f16_fwd に続く audit Tier 2 (radix_sort GPU prefix scan、別 mechanism = CPU-GPU sync 除去) の empirical 検証。GPU 上で per-group histograms の exclusive scan を計算する 16-thread single-threadgroup kernel を実装、bit-exact (100k random keys \u002F 500k packed keys \u002F edge cases 6 種) 確認。**5k Lego smoke で wallclock 115.83s → 124.41s (+7.4%、sanity rerun 118.73s で再現)**、**ts_fwd_radix_sort 4.768 → 6.733 ms\u002Fcall (+41%)**、PSNR は parity (31.604 → 31.635 dB、bit-exact 経路なので drift なし)。**Likely mechanism**: 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 が無く、「除去した wait_until_completed」は実は **CPU prefix scan と overlap していた active work** だった。kernel + tests は env `SPLAT_RADIX_GPU_SCAN=1` で opt-in、別 workload (>>100k splats 等) で再評価余地のみ残す。","P1 axis 1 · Phase F.3 · Tier 2 falsified · 方法論 finding","2026-05-25","stable","audit","negative",[14],1,[16,17,18,19,20,21,22,23,24,25,26],"p1-axis1","phase-f","radix-sort","gpu-prefix-scan","tier-2","falsified","negative-finding","metal-fences","tbdr","ab-test","lego-5k","P1 Phase F.3",[29,30],"lego-phase-f3-baseline-5k","lego-phase-f3-gpu-scan-5k",[32,33,34,35,36],"p1-axis1-metal-opt-audit","p1-axis1-phase-f1-emit-simd-falsified","p1-profiling-clean","p1-e-refine-gpu-smoke","p1-axis1-target-cache",{"summary":38,"rank":39,"verdict":40,"delta_psnr":41,"delta_wallclock":42},"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)。","high","audit-falsified-tier-2","+0.03 dB (parity、bit-exact 経路、session noise 内)","+7.4% (+8.58s @ 5k iter、sanity rerun +4.8% でも regression 確定)",[44,47,52,55,114,116,123,125,132,134,140,142,149,151,157,159,163,165],{"type":45,"text":46},"lead","audit (p1-axis1-metal-opt-audit) で \u003Cstrong>Tier 2 = 「Phase E scope の構造改善、別 mechanism (CPU-GPU sync 除去)、-0.5-0.8% wallclock、LOW PSNR risk」\u003C\u002Fstrong> と分類した radix_sort GPU prefix sum を 4-5h で実装、5k Lego smoke で empirical 検証。\u003Cstrong>bit-exact 実装は完成\u003C\u002Fstrong>、\u003Cstrong>PSNR parity (drift 0 期待、観測 ±0.03 dB は session noise)\u003C\u002Fstrong>、しかし \u003Cstrong>wallclock +7.4% \u002F ts_fwd_radix_sort +41% の net regression\u003C\u002Fstrong>。Phase F.1 (emit_simd \u002F f16_fwd) に続く Tier 2 別 family の audit-overestimate 観測 5 例目。",{"type":48,"label":49,"variant":50,"text":51},"callout","Headline (Tier 2 hypothesis falsified、別 mechanism 化でも overestimate)","warning","\u003Cstrong>audit Tier 2 \"-0.5-0.8% wallclock、CPU-GPU sync 除去\" 予測は empirical で大幅 falsified\u003C\u002Fstrong>。5k Lego smoke で \u003Cstrong>wallclock 115.83s → 124.41s (+7.4%)、ts_fwd_radix_sort 4.768 → 6.733 ms\u002Fcall (+41%、sanity re-run 6.402ms で再現)\u003C\u002Fstrong>、PSNR は bit-exact 経路で parity。\u003Cstrong>Likely mechanism (advisor 2026-05-25)\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> だった。**結論**: default 経路は legacy CPU scan 維持、GPU scan kernel + tests は env \u003Ccode>SPLAT_RADIX_GPU_SCAN=1\u003C\u002Fcode> で opt-in (future workload hedge、>>100k splats \u002F 高 tile_per_splat scene で dispatch overhead vs fence trade-off が逆転する可能性)。Tier 2 同 family (backward TBDR、tile-local accumulator + Kahan summation で global atomic 除去) は **同 mechanism 影響を受けるため skip 判断強化**。",{"type":53,"text":54},"heading","1. A\u002FB test 数値 (Lego 5k smoke、seed=42、premultiplied、3 run)",{"type":56,"columns":57,"align":64,"rows":67,"caption":113},"table",[58,59,60,61,62,63],"metric","F.3 CPU scan baseline","F.3 GPU scan","GPU scan rerun (sanity)","delta vs baseline","audit 予測",[65,66,66,66,66,65],"left","right",[68,75,82,89,95,101,108],[69,70,71,72,73,74],"total wallclock","**115.83s**","124.41s (**+7.4%**)","118.73s (+2.5%)","+7.4% (first) \u002F +2.5% (rerun)","-0.5〜-0.8% (audit) \u002F -3〜-14% (advisor optimistic)",[76,77,78,79,80,81],"TOTAL kernel sum","174.943s","191.236s (+9.3%)","186.0s (est.)","+9.3%","",[83,84,85,86,87,88],"ts_fwd_radix_sort ms\u002Fcall","4.768","**6.733 (+41.2%)**","**6.402 (+34.5%)**","**+35〜41%**","-0.5〜-3.0 ms\u002Fcall expected",[90,91,92,93,94,81],"ts_fwd_radix_sort share","13.6%","17.6%","17.5%","+4.0 pt",[96,97,98,99,100,81],"ts_fwd_emit_pairs ms\u002Fcall","5.157","4.775 (-7.4%)","—","-7.4% (noise、orthogonal)",[102,103,104,105,106,107],"mean val PSNR (100 view)","**31.604**","31.635 (**+0.031**)","31.869 (+0.265)","±0 (bit-exact)","±0 dB",[109,110,111,99,112,81],"final splats","84,840","83,644 (-1.4%)","-1.4%","F.3 baseline = legacy CPU scan 経路 (F.3 falsification 後の default、env 不要)。最初のベンチ取得時は default が GPU scan だったため `SPLAT_RADIX_CPU_SCAN=1` env で強制したが、その後の default 反転で env なしで同経路を実行可能。F.3 GPU scan = opt-in 経路、env `SPLAT_RADIX_GPU_SCAN=1` で enable (kernel + tests は worktree に残存、future workload hedge)。sanity rerun は同 seed \u002F config \u002F binary で同セッション内再実行。\u003Cstrong>+41% per-call radix_sort regression が再現\u003C\u002Fstrong>、+7.4% wallclock は rerun で +2.5% に縮小だが noise floor (~2-4%) の上、real regression 確定。PSNR parity は bit-exact unit test (100k \u002F 500k keys、CPU stable sort と byte-for-byte 一致) で事前確証済。",{"type":53,"text":115},"2. 実装と bit-exact 検証 (correctness は問題なし、performance のみ falsified)",{"type":117,"ordered":118,"items":119},"list",true,[120,121,122],"\u003Cstrong>shader (tile_bin.metal:radix_prefix_scan)\u003C\u002Fstrong>: 1 threadgroup、16 thread (digit 1 つ \u002F lane)。phase 1: thread `d` が \u003Ccode>hist[g*16 + d]\u003C\u002Fcode> を全 group で sum → threadgroup memory の \u003Ccode>bucket_totals[d]\u003C\u002Fcode>。phase 2: \u003Ccode>simd_prefix_exclusive_sum\u003C\u002Fcode> を 16 lane で 1 SIMD group (Apple width 32) として実行 → \u003Ccode>bucket_starts[d]\u003C\u002Fcode>。phase 3: thread `d` が column 内 serial scan で \u003Ccode>offsets[g*16 + d] = cursor; cursor += hist[g*16 + d]\u003C\u002Fcode> を g=0..num_groups で実行。num_groups 数千でも単 threadgroup の serial scan は 8000 add 程度で trivial。","\u003Cstrong>host (tile_bin.rs::radix_sort)\u003C\u002Fstrong>: \u003Ccode>use_gpu_prefix_scan\u003C\u002Fcode> flag (env \u003Ccode>SPLAT_RADIX_GPU_SCAN=1\u003C\u002Fcode> で ON、default OFF) で 2 path 分岐。GPU 経路は 1 command buffer \u002F pass で hist → scan → scatter を 3 encoder で chain、intra-pass の \u003Ccode>wait_until_completed\u003C\u002Fcode> を完全除去、final pass のみ wait。CPU 経路 (legacy) は intact 保持。num_groups u32 buffer (scan kernel 引数) を pre-allocate。","\u003Cstrong>bit-exact 検証 (unit test、9 件全 pass)\u003C\u002Fstrong>: \u003Ccode>radix_sort_gpu_vs_cpu_scan_100k\u003C\u002Fcode> (100k 一様乱数 u64、num_groups ≈ 391)、\u003Ccode>radix_sort_gpu_scan_packed_keys_500k\u003C\u002Fcode> (500k packed key = tile_id[0,2500) \u003C\u003C 32 | depth_bits[0.01,100.0)、runtime distribution mimic、num_groups ≈ 1954)、\u003Ccode>radix_sort_gpu_scan_edge_cases_match_cpu_scan\u003C\u002Fcode> (n=1, 255, 256, 257, 1024, 2048 の boundary num_groups)、すべて (a) GPU 経路 vs CPU 経路 byte-for-byte 一致 (b) 両者 vs \u003Ccode>cpu_stable_sort\u003C\u002Fcode> reference 一致。Phase F.3 で PSNR drift は理論的に 0 (sort 順序保存)、観測 ±0.03 dB は session noise。",{"type":53,"text":124},"3. Mechanism 分析 (advisor 2026-05-25): なぜ -0.5% 予測が +7.4% 実測になったか",{"type":117,"ordered":118,"items":126},[127,128,129,130,131],"\u003Cstrong>「除去した wait_until_completed」は idle ではなく active overlap だった\u003C\u002Fstrong>。旧経路: \u003Ccode>histogram.commit() → wait → CPU prefix scan (~64KB 配列の 2 pass、~100µs) → scatter.commit()\u003C\u002Fcode>。host 側で wait している間、GPU は scatter dispatch 待ちで idle だが、wait 時間そのものは CPU prefix scan と overlap していた。新経路で除去したのは \u003Cstrong>idle time ではなく overlap time\u003C\u002Fstrong>、純粋な improvement にならない。","\u003Cstrong>StorageModeShared での Metal implicit fence 挿入\u003C\u002Fstrong>: 同 command buffer 内で連続 compute encoder が同一 buffer に read-after-write hazard を持つ場合、Metal hazard tracker は encoder 境界に implicit fence (memory barrier) を挿入。本 F.3 では encoder 1 (hist) が \u003Ccode>buf_hist\u003C\u002Fcode> write → encoder 2 (scan) が \u003Ccode>buf_hist\u003C\u002Fcode> read + \u003Ccode>buf_offsets\u003C\u002Fcode> write → encoder 3 (scatter) が \u003Ccode>buf_offsets\u003C\u002Fcode> read で \u003Cstrong>2 つの fence が必須\u003C\u002Fstrong>。TBDR pipeline では fence が tile flush + driver-level scheduling barrier を強制、stall 発生。","\u003Cstrong>旧 CPU 経路は GPU 内 memory dependency が無かった\u003C\u002Fstrong>: hist → CPU → scatter で、buf_hist は GPU dispatch 後 host 読みのみ、buf_offsets は host 書き → GPU dispatch 読み。\u003Cstrong>encoder 間の GPU 内 read-after-write は無く、implicit fence 不要\u003C\u002Fstrong>。新経路を導入することで初めて GPU 内 dependency chain が発生、本来不要な fence overhead を増やしてしまった。","\u003Cstrong>per-call 4.768 → 6.733 ms (+1.97 ms) の breakdown 推定\u003C\u002Fstrong>: 16 pass × ~120 µs\u002Fpass の fence overhead = ~1.92 ms、ほぼ全量を説明。GPU prefix scan 自体は 16-thread 1-threadgroup で \u003C10µs \u002F pass \u003C 0.2 ms\u002Fcall、無視可能。CPU scan elimination の saved time は元々 wait と overlap していたため net 0。","\u003Cstrong>修正可能性 (試さない判断)\u003C\u002Fstrong>: (a) untracked resource + manual fence で hazard tracker を bypass → 正確性検証 cost 大、(b) hist + scan + scatter を 1 kernel に fusion → 16 digit \u002F variable group size のため 1 dispatch で表現困難 + MED PSNR risk、(c) StorageModePrivate 化 → unified memory のメリット捨てる。いずれも 4-5h 以上の追加 cost、ROI 不明 (audit calibration 5 連続 overestimate)、棄却。",{"type":53,"text":133},"4. PSNR 安全性確認 (bit-exact 経路、drift 観測なし)",{"type":117,"items":135},[136,137,138,139],"\u003Cstrong>F.3 baseline (CPU scan) 31.604 dB → F.3 GPU scan 31.635 dB\u003C\u002Fstrong>: +0.031 dB は session noise 圏内 (~0.1 dB run-to-run、cf. F.1 baseline 2 sample で 31.720 \u002F 31.588 = 0.13 dB variance)","\u003Cstrong>sanity rerun 31.869 dB\u003C\u002Fstrong>: baseline からの drift +0.265 dB は run-to-run 上だがやはり session noise (initial population subsampling の差)","\u003Cstrong>bit-exact unit test (100k \u002F 500k keys、CPU stable sort byte-for-byte) で sort 順序保存を事前確証\u003C\u002Fstrong>、PSNR drift は radix_sort 経路に依らない、rasterize input の splat 順序は両経路で identical","\u003Cstrong>M5 baseline (8 scene mean 33.49 dB、Lego val 36.106 dB) は影響なし\u003C\u002Fstrong>、default OFF 維持で current production unchanged",{"type":53,"text":141},"5. 教訓 \u002F 卒論 narrative",{"type":117,"items":143},[144,145,146,147,148],"\u003Cstrong>「CPU 介在を on-GPU に置換」族の audit 予測は overlap の存在を見落とす\u003C\u002Fstrong>: wait 時間を idle と仮定すると net improvement に見えるが、実際は CPU work と overlap している場合 net 0 \u002F negative。同 family の Tier 2 backward TBDR (tile-local accumulator + Kahan で global atomic 除去) も \u003Cstrong>同 mechanism 影響を受けるため skip 判断強化\u003C\u002Fstrong>","\u003Cstrong>StorageModeShared での implicit fence は invisible cost\u003C\u002Fstrong>: Metal docs に明示されておらず profile でも encoder 境界として現れず、kernel time が膨らんで見える。Apple TBDR optimization では \u003Cstrong>encoder 数最小化 + buffer dependency 最小化\u003C\u002Fstrong> が原則、本 F.3 は 3 encoder + 2 dependency で原則逆行","\u003Cstrong>audit calibration 5 連続 overestimate\u003C\u002Fstrong>: Phase E refine (5x → 0.2%)、target_upload (5.6% → 0.23%)、F.1 emit_simd (-0.7% → +4.7%)、F.1 f16_fwd (-0.5% → noise)、本 F.3 (-0.5% → +7.4%)。\u003Cstrong>audit theoretical prediction は overlap \u002F fence \u002F dispatch overhead 等の hidden cost を低見積\u003C\u002Fstrong>、empirical verification 必須","\u003Cstrong>§5.4 negative findings 章に追記候補\u003C\u002Fstrong>: 「audit theoretical predictions vs empirical measurements」方法論 paragraph に本 F.3 を 5 例目として、特に \u003Cstrong>「removing CPU intermediates between GPU dispatches introduces implicit fences」\u003C\u002Fstrong> という mechanism family-level の lesson","\u003Cstrong>§6 future work から radix GPU prefix scan を除外\u003C\u002Fstrong>: kernel + tests は env opt-in で残置 (large-scale workload で再評価可能な状態)、しかし \"axis 1 future work\" 推奨枠からは除外。同 family の backward TBDR も併せて除外を提案",{"type":53,"text":150},"6. 次のアクション (advisor 助言反映)",{"type":117,"ordered":118,"items":152},[153,154,155,156],"\u003Cstrong>本 finding commit + main pickup 判断\u003C\u002Fstrong>: kernel + tests + env-gate default OFF を main 取り込み (regression なし、future workload hedge として価値、5 連続 audit-overestimate の data point として卒論 narrative)","\u003Cstrong>Tier 2 backward TBDR: skip 強化\u003C\u002Fstrong> — 同 mechanism family (CPU 介在を on-GPU に置換) の falsification 拡大適用、6-8h + MED-HIGH PSNR risk は poor bet given today's 5 連続 calibration","\u003Cstrong>audit Tier 1 + Tier 2 即 actionable 候補は全消化、Tier 3 (SSIM kernel fusion \u002F fwd_rasterize imageblock) は ROI ≲ 0.2% で投資価値低\u003C\u002Fstrong>。axis 1 future work 候補は実質枯渇、卒論 §6 では「測定可能な per-kernel 上限ありだが、Apple Silicon native optimization の構造的 ROI は Phase D 達成時点で plateau」と honest reporting","\u003Cstrong>並行価値タスク\u003C\u002Fstrong>: §5.4 negative findings 章への F.3 + 5 連続 overestimate paragraph 追加、Phase D 完遂後 axis 1 narrative の plateau 認定として整理",{"type":53,"text":158},"7. 再現手順",{"type":160,"lang":161,"text":162},"code","bash","# Build (worktree)\ncd splat\ncargo build --release\n\n# Bit-exact validation (9 tests, ~0.1s)\ncargo test --release -p splat-metal --lib tile_bin\n\n# A\u002FB (5k Lego smoke、~2 min each)\n# baseline = default (legacy CPU scan、env 不要、本 commit の現状)\n.\u002Ftarget\u002Frelease\u002Fsplat train \\\n    --config configs\u002F2026-05-25-2030-lego-phase-f3-baseline-5k.toml\n# → ts_fwd_radix_sort ~4.77 ms\u002Fcall、total ~115s、PSNR ~31.6 dB\n\n# GPU scan opt-in (env で明示的に enable)\nSPLAT_RADIX_GPU_SCAN=1 .\u002Ftarget\u002Frelease\u002Fsplat train \\\n    --config configs\u002F2026-05-25-2030-lego-phase-f3-gpu-scan-5k.toml\n# → ts_fwd_radix_sort ~6.4-6.7 ms\u002Fcall (+35-41%)、total ~118-124s (+2.5-7.4%)、PSNR parity\n",{"type":53,"text":164},"8. 関連",{"type":117,"items":166},[167,168,169,170,171,172],"audit baseline: \u003Ccode>p1-axis1-metal-opt-audit\u003C\u002Fcode> (Tier 2 radix GPU prefix scan -0.5-0.8% wallclock 予測)","本 F.3 baseline profile: \u003Ccode>p1-profiling-clean\u003C\u002Fcode> (radix_sort 13.6% share)","Tier 1 falsification 先行例: \u003Ccode>p1-axis1-phase-f1-emit-simd-falsified\u003C\u002Fcode> (emit_simd \u002F f16_fwd の 2 連続 falsified)","同 pattern (audit theory 予測 → empirical 棄却): \u003Ccode>p1-e-refine-gpu-smoke\u003C\u002Fcode> (refine GPU 化 5x → 0.2%)、\u003Ccode>p1-axis1-target-cache\u003C\u002Fcode> (5.5% → 0.23% async overlap で 1\u002F25)、\u003Ccode>a-6-f16-packed-rebench\u003C\u002Fcode> (-50% bandwidth → -1%)","Phase D baseline (M5 達成): \u003Ccode>p1-d-multi-scene-rechain\u003C\u002Fcode>","卒論統合候補 chapter: \u003Ccode>chapter-5-4-negative-findings\u003C\u002Fcode> (axis 1 audit predictions section、5 連続 overestimate)",[174,188],{"id":29,"title":29,"subtitle":175,"date":9,"workspace":176,"tags":177,"verdict":183,"psnr":184,"psnr_unit":-1,"wallclock":185,"splats":186,"summary_url":187,"detail_path":187},"Phase F.3 baseline (SPLAT_RADIX_CPU_SCAN=1, legacy CPU scan) for radix GPU scan A\u002FB","splat",[178,179,17,180,26,181,182],"p1-profile","axis-1","f3-baseline","premultiplied","cpu-scan","partial",31.604379653930664,"1m 55s",84840,"\u002Fruns\u002Flego-phase-f3-baseline-5k\u002F",{"id":30,"title":30,"subtitle":189,"date":9,"workspace":176,"tags":190,"verdict":183,"psnr":193,"psnr_unit":-1,"wallclock":194,"splats":195,"summary_url":196,"detail_path":196},"Phase F.3 GPU prefix scan (default) — radix_sort with intra-pass waits removed",[178,179,17,191,26,181,192],"f3-gpu-scan","radix-gpu-scan",31.869173049926758,"1m 58s",84365,"\u002Fruns\u002Flego-phase-f3-gpu-scan-5k\u002F",[198,216,234,255,276],{"id":32,"title":199,"date":9,"status":10,"polarity":200,"category":201,"axes":202,"tags":203,"task_code":209,"related_runs":210,"delta_psnr":211,"delta_wallclock":212,"rank":39,"verdict":213,"impact_summary":214,"detail_path":215},"P1 axis 1 Metal 最適化候補 audit — 5 候補 + 既実装 gate flip 機会、Tier 1 -1.0% wallclock 即時 actionable","positive","design",[14],[178,179,204,205,24,206,207,208],"metal-optimization","kernel-audit","simd-reduction","apple-silicon","gate-flip","P1 axis 1 Metal kernel audit",[],"N\u002FA (audit)","estimated -1.5 〜 -2.5% (Tier 1+2)","design-complete-actionable","5 kernel (clean baseline share 合計 55.1%) を Explore subagent で構造的 audit、Apple Silicon 特化最適化候補を kernel 単位で 2-4 個ずつ抽出。\u003Cstrong>最大の発見\u003C\u002Fstrong>: **emit_pairs_simd PSO は既に実装済**、\u003Ccode>use_simd_emit: Cell::new(false)\u003C\u002Fcode> で gate off、comment に「30k validation 後 default true 化予定」(tile_bin.rs:86-87)、**Phase D 30k 完遂で即 flip 可能** (-0.7-1.0% wallclock 即時、zero risk)。同様の即 actionable 機会: f16 forward kernel \u003Ccode>render_splats_f16\u003C\u002Fcode> は env \u003Ccode>SPLAT_F16_FORWARD=1\u003C\u002Fcode> gate (現在 disabled、A\u002FB test 必須 PSNR risk MED-HIGH)。\u003Cstrong>Tier 2 (Phase E scope)\u003C\u002Fstrong>: radix_sort GPU prefix sum (-0.54-0.82% wallclock、CPU-GPU 16-pass sync 除去)、backward_raster imageblock+TBDR (-0.67-1.07% wallclock、tile-local 累積で atomic 大幅削減)。\u003Cstrong>累計 -1.5-2.5% wallclock 改善余地確定、卒論 §6 future work 候補と pilot 実装目標\u003C\u002Fstrong>。backward SIMD reduction は既に default 有効 (rasterize.rs:642、2.43× win 享受中で確認済)、SSIM は eval-only で training 直接寄与なしのため Tier 3。","\u002Ffindings\u002Fp1-axis1-metal-opt-audit\u002F",{"id":33,"title":217,"date":9,"status":10,"polarity":12,"category":11,"axes":218,"tags":219,"task_code":223,"related_runs":224,"delta_psnr":228,"delta_wallclock":229,"rank":230,"verdict":231,"impact_summary":232,"detail_path":233},"Phase F.1 emit_pairs_simd + f16 forward gate flip — audit Tier 1 仮説 falsified、現規模で net regression \u002F no improvement",[14],[16,17,220,221,222,21,22,25,26],"emit-simd","f16-forward","tier-1","P1 Phase F.1 \u002F F.2",[225,226,227],"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":36,"title":235,"date":9,"status":10,"polarity":236,"category":237,"axes":238,"tags":239,"task_code":246,"related_runs":247,"delta_psnr":249,"delta_wallclock":250,"rank":251,"verdict":252,"impact_summary":253,"detail_path":254},"P1 axis 1 target_upload cache — kernel 除去は成功、wallclock ROI は host\u002FGPU overlap で予想の 1\u002F25","neutral","optimization",[14],[240,179,241,242,243,244,245,26],"p1","target-cache","kernel-removal","host-gpu-overlap","low-roi","apples-to-apples-ab","P1 axis 1 target upload cache",[248],"lego-target-cache-5k","+0.14 dB (seed同一、RNG drift、許容範囲)","-0.23% (apples-to-apples A\u002FB、env toggle 同一 binary)","low","accepted-cleanup-keep-merged","Per-iter target upload kernel を完全除去 (5000 calls → 0)、構造的には kernel 一つ消えた成果。 だが wallclock ROI は **予想 -5.5% に対し実測 -0.23%** (-1\u002F25)、profile baseline の \"5.6% share\" は GPU contention 3x 環境での host stall 値で、平常 contention では host upload は既に GPU 計算と overlap していた。 PSNR は seed 同一でも +0.14 dB drift (Metal driver の buffer 配置順序差 → atomic ordering 差 → refine.split RNG 経由)、5k smoke の noise floor 内。 実装は trivial (train_loop entry で `Vec\u003CBuffer>` 構築、train_step に `Option\u003C&Buffer>` 追加)、commit 残しておく価値はあるが、roadmap 上の位置付けは \"deprioritize \u002F cleanup level\" に修正。 **真の優先順位は radix_sort 改善 (27% share) と A.7 ICB batching tail に集中すべき**。","\u002Ffindings\u002Fp1-axis1-target-cache\u002F",{"id":35,"title":256,"date":9,"status":10,"polarity":12,"category":257,"axes":258,"tags":259,"task_code":266,"related_runs":267,"delta_psnr":271,"delta_wallclock":272,"rank":39,"verdict":273,"impact_summary":274,"detail_path":275},"P1.E refine GPU 化 hypothesis を SPLAT_TIMING profile で falsified — refine 寄与は \u003C1%、真の bottleneck は forward 60% + loss 28%","experiment",[14],[240,260,261,22,262,263,264,265,26],"phase-e","refine-gpu","kernel-profile","axis-1-limit","opacity-decay-gpu","kernel-plumbing","P1.E refine GPU 化 (axis 1 core contribution)",[268,269,270],"p1-e-profile-1k","p1-e-profile-5k","p1-e-gpu-decay-5k","-0.21 dB (CPU 31.92 → GPU 31.71、5k smoke、bit-close 内 RNG cascade)","+1.4% (CPU 144.32s → GPU 146.32s、5k smoke、opacity_decay は 0.005% で誤差)","accepted-negative-redirect-phase-f","Phase D 30k 実測 wallclock 41m54s vs brush 9m08s = -4.6x gap の原因について、task は `splat process CPU 63.4% = 1 core only` → 「refine の host RMW loop が CPU 1-thread bound」と仮説立てた。本 Phase E ではこの仮説を SPLAT_TIMING profile で実測。5k smoke (84k splats、p1-e-profile-5k.toml) の kernel breakdown: **ts_forward 60.1% (123s) \u002F ts_loss_gpu 28.0% (57s) \u002F ts_adam 4.8% (9.9s) \u002F ts_target_upload 3.9% (8.1s) \u002F ts_project_back 2.3% (4.75s) \u002F ts_refine_compact 0.6% (1.14s, 103ms\u002Fcall × 11) \u002F ts_refine_accumulate 0.3% (605ms) \u002F ts_opacity_decay 0.0046% (957µs)**。**refine 全体で \u003C1%** = refine を完璧に GPU 化しても全体 wallclock は -1% も短縮されない。代わりに demo kernel として `refine_opacity_decay.metal` を実装し、kernel + Rust pipeline + `refine.gpu_path` flag plumbing pattern を validate (CPU vs GPU max diff 1.5e-5、5k full PSNR delta -0.21 dB = 許容内)。Phase F の真の target は (a) forward subdivision で判明した tile-binning chain (`ts_fwd_sort 15.5% + ts_fwd_emit 12.8%`)、(b) Adam の 5x sequential `cmd.wait_until_completed` (1 cmd buffer 化で ~5% 削減期待)、(c) target_upload preload (~4% 削減期待) の 3 つ。","\u002Ffindings\u002Fp1-e-refine-gpu-smoke\u002F",{"id":34,"title":277,"date":9,"status":10,"polarity":236,"category":11,"axes":278,"tags":279,"task_code":284,"related_runs":285,"delta_psnr":211,"delta_wallclock":211,"rank":39,"verdict":287,"impact_summary":288,"detail_path":289},"P1 clean single-process profile baseline — radix_sort 27% → 13.6%、emit_pairs 6.5% → 14.2% の share 大幅 shift、axis 1 真の ROI 上限確定",[14],[178,179,280,281,282,181,26,283],"clean-baseline","kernel-share","single-process","share-correction","P1 axis 1 profile re-baseline",[286],"lego-profile-clean-5k","audit-complete-share-correction","clean single-process で per-kernel share を取り直し、前 profile baseline (multi-process contention 中) と比較すると \u003Cstrong>share が大幅 shift\u003C\u002Fstrong>: ts_fwd_radix_sort 27.0% → **13.6%** (-13.4 pt)、ts_fwd_emit_pairs 6.5% → **14.2%** (+7.7 pt)、ts_forward 全体 60.1% → **36.7%** (-23.4 pt)。これは前 profile の share が contention で over-state されていた決定的証拠 (target_upload subagent の share 5.6% → 実 ROI 0.23% を kernel level で再現)。新 axis 1 ROI 上限: emit_pairs 改善 -14% \u002F radix_sort -13% \u002F backward_raster -13% \u002F ssim_fusion -7-8%。Phase E (refine GPU 化) の ROI 仮説 -5x は元々 share 2.6% で 1\u002F40 過大評価だったが、本 clean baseline でも refine 0.2% に縮小、棄却強化。target_upload は本 clean baseline で完全消滅 (cache 化済)。","\u002Ffindings\u002Fp1-profiling-clean\u002F",1782449788632]