[{"data":1,"prerenderedAt":299},["ShallowReactive",2],{"finding:p1-axis1-target-cache":3,"finding-runs:p1-axis1-target-cache":249,"finding-related:p1-axis1-target-cache":250},{"meta":4,"impact":30,"sections":37},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":24,"related_runs":25,"related_findings":27},"p1-axis1-target-cache","P1 axis 1 target_upload cache — kernel 除去は成功、wallclock ROI は host\u002FGPU overlap で予想の 1\u002F25","全 100 train view (976 MiB) を train_loop 起動時に GPU shared buffer へ 1 度 upload して cache。per-iter `ts_target_upload` を 5000 → 0 calls に落とし、kernel timing summary から消去。だが apples-to-apples A\u002FB 計測 (env `SPLAT_DISABLE_TARGET_CACHE=1` toggle、同一 binary・同一 contention regime) では wallclock は 145.58s → 145.24s で **-0.23%** に留まる。 ts_target_upload host 計算 3.28s は GPU forward \u002F backward と Metal driver の async dispatch で完全に overlap していたのが真因 (advisor 事前指摘)。実装コストは小、PSNR は seed RNG 経由で +0.14 dB drift (refine.split の浮動小数点 ordering 起因、5k smoke で許容範囲)。","P1 axis 1 · target upload cache · low ROI 確定","2026-05-25","stable","optimization","neutral",[14],1,[16,17,18,19,20,21,22,23],"p1","axis-1","target-cache","kernel-removal","host-gpu-overlap","low-roi","apples-to-apples-ab","lego-5k","P1 axis 1 target upload cache",[26],"lego-target-cache-5k",[28,29],"p1-profiling-baseline","p1-d-stage2-30k-results",{"summary":31,"rank":32,"verdict":33,"delta_psnr":34,"delta_wallclock":35,"delta_splats":36},"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 に集中すべき**。","low","accepted-cleanup-keep-merged","+0.14 dB (seed同一、RNG drift、許容範囲)","-0.23% (apples-to-apples A\u002FB、env toggle 同一 binary)","-0.08% (84665 → 84595)",[38,41,46,49,56,58,100,102,165,167,174,176,183,185,214,216,220,227,229,235,237,241,243],{"type":39,"text":40},"lead","\u003Ccode>p1-profiling-baseline\u003C\u002Fcode> の優先順位 #1 (target_upload cache、即時 -5.5% 期待) を実装。全 100 train view (RGBA 800×800×4 f32 = 10.24 MiB\u002Fview、合計 976 MiB) を \u003Ccode>train_loop\u003C\u002Fcode> 起動時に \u003Ccode>Vec&lt;Buffer&gt;\u003C\u002Fcode> として GPU shared memory に 1 度 upload、per-iter は idx で参照するだけにした。 構造的成果: \u003Cstrong>kernel timing summary から ts_target_upload 行が消える\u003C\u002Fstrong> (5000 calls → 0 calls、3.28s GPU work が完全除去)。\u003Cstrong>実 wallclock ROI: -0.23%\u003C\u002Fstrong> (env toggle で apples-to-apples 計測、predicted -5.5% の 1\u002F25)。 advisor 事前 \"\u003C3% なら overlap 疑え\" 警告と一致、host upload は Metal の async dispatch で GPU 計算と既に重なっていた。",{"type":42,"label":43,"variant":44,"text":45},"callout","Headline (kernel 除去は成功 \u002F wallclock ROI は 1\u002F25)","warning","\u003Cstrong>p1-profiling-baseline の \"ts_target_upload 5.6%\" は host-side wallclock proxy 値であり、 \"GPU が host upload を待つ純 stall\" ではなかった\u003C\u002Fstrong>。 contention 3x の状況下では host upload 1.33 ms × 5000 = 6.6s が見かけ上 5.6% を占めるが、平常 contention では Metal driver の async commit で GPU forward kernel と overlap し、 wallclock 直接削減量は -0.2% に留まる。 \u003Cstrong>profile baseline で \"低 hanging fruit\" と分類した #1 は実は ROI 最小\u003C\u002Fstrong>、roadmap の優先順位を radix_sort (27%) \u002F A.7 batching に集中させる根拠が固まった。 cache 実装自体は trivial・後悔なし・PSNR 影響なしで残す、deprioritize は roadmap 上の位置付けのみ。",{"type":47,"text":48},"heading","1. 実装 (1 file、~30 行)",{"type":50,"items":51},"list",[52,53,54,55],"\u003Ccode>splat\u002Fcrates\u002Fsplat-train-v1\u002Fsrc\u002Ftrain_loop.rs\u003C\u002Fcode>: \u003Ccode>train_loop()\u003C\u002Fcode> entry で \u003Ccode>cameras.iter().map(|(_, t)| upload_buffer(...))\u003C\u002Fcode> で \u003Ccode>Vec&lt;Buffer&gt;\u003C\u002Fcode> 構築 (106 ms \u002F 976 MiB)、env \u003Ccode>SPLAT_DISABLE_TARGET_CACHE=1\u003C\u002Fcode> で legacy 経路に戻せる A\u002FB 計測 hook。","\u003Ccode>train_step()\u003C\u002Fcode> 引数追加: \u003Ccode>target_buf_cache: Option&lt;&amp;Buffer&gt;\u003C\u002Fcode>。 \u003Ccode>Some\u003C\u002Fcode> なら L1 \u002F L1Ssim の GPU loss path が cache を直接参照、\u003Ccode>ts_target_upload::record\u003C\u002Fcode> は呼ばない。 \u003Ccode>None\u003C\u002Fcode> なら従来通り per-iter \u003Ccode>upload_buffer\u003C\u002Fcode> + record。","\u003Ccode>cmd\u002Ftrain.rs\u003C\u002Fcode> 改変なし (cache は train_loop 内で完結、cli は &cameras を渡すだけ)。 config flag も追加なし (常時 ON、 36 GB unified memory で 1 GB は trivial、 advisor 指摘の \"flag は code path 増えるだけ\" 採用)。","L2 \u002F force_host fallback 経路は target を host-side で読むため \u003Ccode>&[f32]\u003C\u002Fcode> も従来通り渡す (advisor: \"両方 signature 保持\" 採用)。",{"type":47,"text":57},"2. A\u002FB 計測 setup (apples-to-apples)",{"type":59,"columns":60,"align":64,"rows":66,"caption":99},"table",[61,62,63],"項目","値","備考",[65,65,65],"left",[67,71,75,79,83,87,91,95],[68,69,70],"scene","nerf_synthetic\u002Flego","brush convention (premultiplied)",[72,73,74],"max_steps","5000","Phase D opacdecay-5k baseline と同条件",[76,77,78],"config","configs\u002F2026-05-25-1500-lego-target-cache-5k.toml","[backend] profile=true (kernel timing 取得)",[80,81,82],"A (cache OFF)","`SPLAT_DISABLE_TARGET_CACHE=1` で env toggle","同一 binary、cache 構築 skip + per-iter upload (legacy)",[84,85,86],"B (cache ON)","default (env unset)","100 view を起動時 upload、per-iter は idx 参照",[88,89,90],"seed","42","両方 identical",[92,93,94],"concurrent load","materials 30k brushcompat 1 本 (PID 86708)","両 run 共通、GPU contention 同レベル",[96,97,98],"host","M4 Max 36 GB","macOS、Metal HW counter 不使用","\u003Cstrong>env toggle 1 つで A\u002FB\u003C\u002Fstrong>。 binary は同一なので Metal driver 経路・config 解釈・kernel pipeline は完全互換、唯一の違いは cache build と per-iter upload 有無。 seed 同一でも GPU buffer 配置順序差で refine.split の浮動小数点 ordering が変わり、 splats 数と最終 PSNR が seed-noise レベルで差が出る (後述 §3 表)。",{"type":47,"text":101},"3. 結果 (5000 iter 完走)",{"type":59,"columns":103,"align":106,"rows":108,"caption":164},[104,80,84,105],"metric","delta",[65,107,107,107],"right",[109,114,119,124,129,134,139,144,149,154,159],[110,111,112,113],"wallclock","145.58 s","145.24 s","**-0.23%**",[115,116,117,118],"ts_target_upload total","3.284 s (5000 calls × 657 µs)","**absent (0 calls)**","**-100%**",[120,121,122,123],"ts_target_upload share","1.5% \u002F 2.26% (sum\u002Fwallclock)","0.0%","-1.5pt \u002F -2.26pt",[125,126,127,128],"ts_forward","79.293 s (36.2%)","81.322 s (36.9%)","+2.6% (noise)",[130,131,132,133],"ts_fwd_radix_sort","34.585 s (15.8%)","35.982 s (16.3%)","+4.0% (noise)",[135,136,137,138],"ts_backward_raster","26.672 s (12.2%)","26.025 s (11.8%)","-2.4% (noise)",[140,141,142,143],"ts_ssim_fwd_grad","15.520 s (7.1%)","16.890 s (7.7%)","+8.8% (noise)",[145,146,147,148],"**TOTAL kernel sum**","**219.006 s**","**220.547 s**","**+0.7% (noise)**",[150,151,152,153],"final loss","1.428949e-2","1.480875e-2","+3.6% (RNG drift)",[155,156,157,158],"final splats","84,665","84,595","-0.08%",[160,161,162,163],"**val PSNR (100 views)**","**31.631 dB**","**31.770 dB**","**+0.14 dB**","\u003Cstrong>kernel 除去は完全成功\u003C\u002Fstrong>: ts_target_upload は B の timing summary から完全に消失 (record 呼ばれず)、5000 calls × 657 µs = 3.28s の GPU work 削減。 \u003Cstrong>だが wallclock は ~0.3s しか縮まない\u003C\u002Fstrong>: GPU 全体 200+s の中で host upload は async commit でほぼ完全 overlap していた。 PSNR drift +0.14 dB は seed noise 範囲、loss 3.6% diff も最終 PSNR でほぼ均される (refine.split で異なる positions を生成、 5k smoke 解像で 0.1 dB 程度の差は通常)。",{"type":47,"text":166},"4. なぜ wallclock ROI が予想の 1\u002F25 だったのか",{"type":50,"items":168},[169,170,171,172,173],"\u003Cstrong>profile baseline の \"5.6% share\"\u003C\u002Fstrong> は \u003Ccode>ts_target_upload\u003C\u002Fcode> の host Instant 計測 (cumulative) を wallclock で割った値。 これは \"GPU が host を 5.6% 待っていた\" ではなく \"host 側で 5.6% の時間を消費していた\" の意味。 後者は GPU が同時に他の kernel を走らせていれば wallclock には現れない。","\u003Cstrong>Metal の \u003Ccode>new_buffer_with_data\u003C\u002Fcode> + \u003Ccode>StorageModeShared\u003C\u002Fcode>\u003C\u002Fstrong>: macOS Metal は shared memory model で、 host 書き込みは \u003Ccode>contents()\u003C\u002Fcode> ポインタへの memcpy だけ、 GPU commit までは GPU は触らない。 1 つ前の iter の GPU backward \u002F adam が走っている間に次 iter の target upload を完了できる構造で、 critical path に乗らない。","\u003Cstrong>contention 3x 環境\u003C\u002Fstrong> (p1-profiling-baseline の \"並行 3 本\") では GPU が busy で overlap window が狭く、 host upload が浮き出して見える。 平常 contention (本 A\u002FB では並行 1 本のみ) では GPU が空いている時間が短く、 host upload は完全に隠れる。","\u003Cstrong>真の bottleneck は GPU 全体\u003C\u002Fstrong>: kernel SUM 219s に対し wallclock 145s、 残り 74s は ts_forward の子の double-count + scheduling overhead。 ts_forward parent 79.3s と children sum (radix_sort 34.6 + emit_pairs 27.7 + rasterize 11.8 + project 3.1 + extract_off 2.1 ≈ 79.3s) はほぼ一致、 forward だけで wallclock の 36% を占有 = 純 GPU work である。","\u003Cstrong>結論\u003C\u002Fstrong>: target_upload を消すことは \u003Cem>kernel 除去としては正しい\u003C\u002Fem> が、 wallclock 改善には別の bottleneck (radix_sort 27% \u002F ssim 8% \u002F backward 12%) を狙う必要がある。",{"type":47,"text":175},"5. PSNR drift +0.14 dB の原因 (seed 同一でも非決定論)",{"type":50,"items":177},[178,179,180,181,182],"\u003Cstrong>seed 42 同一\u003C\u002Fstrong> なので \u003Ccode>StdRng\u003C\u002Fcode> sequence は完全に identical。 だが \u003Ccode>refine::split\u003C\u002Fcode> 内で \u003Ccode>rng.gen()\u003C\u002Fcode> を呼ぶ \u003Cem>順序と回数\u003C\u002Fem> は decay\u002Fprune の通過率に依存し、 通過率は loss grad に依存し、 loss grad は floating-point atomic accumulation order に依存する。","\u003Cstrong>Metal の non-deterministic atomics\u003C\u002Fstrong>: \u003Ccode>atomic_fetch_add_explicit\u003C\u002Fcode> の commit 順序は GPU scheduler が決め、 thread block 起動順は buffer 配置・cache state・前 dispatch の終了タイミングに左右される。 cache を build すると Metal driver の heap allocator state が変わり、 backward の per-pixel atomic accumulation 順序が iter ごとに微妙に変わる。","\u003Cstrong>iter 1 (loss 5.9385e-1)\u003C\u002Fstrong> は両方 4 sig fig 一致、 \u003Cstrong>iter 500 (8.6218 vs 8.6219)\u003C\u002Fstrong> もほぼ一致、 \u003Cstrong>iter 1000 で 0.6% diverge\u003C\u002Fstrong> し以後 compound。 これは典型的な GPU non-determinism の出方。","\u003Cstrong>5k smoke の PSNR noise floor\u003C\u002Fstrong>: multi-scene chain の同 config 再実行で ±0.2 dB は通常観測される (refine.split 確率的経路の影響)。 +0.14 dB は noise floor 内、 \"PSNR 不変\" の要件を満たすと判断。","\u003Cstrong>Determinism が必要な test\u003C\u002Fstrong> (snapshot diff、CI regression gate) では env で cache を OFF にする option を残してある (\u003Ccode>SPLAT_DISABLE_TARGET_CACHE=1\u003C\u002Fcode>)、 ただし production \u002F bench \u002F 卒論評価は cache ON で問題なし。",{"type":47,"text":184},"6. memory footprint",{"type":59,"columns":186,"align":187,"rows":188,"caption":213},[61,62,63],[65,107,65],[189,193,197,201,205,209],[190,191,192],"view 数","100","lego train split",[194,195,196],"view あたり buffer size","800 × 800 × 4 × 4 byte = 10.24 MiB","RGBA f32",[198,199,200],"合計 GPU buffer","976.6 MiB","実測 (start log: \"uploaded 100 view buffers 976.6 MiB\")",[202,203,204],"upload 時間","105.7 ms","起動時 1 回、wallclock 145s に対し 0.07%",[206,207,208],"M4 Max unified memory","36 GB","1 GB cache = 2.7% で trivial",[210,211,212],"scale-up (例: tnt 21k view)","10.24 MiB × 21,000 = 215 GiB","**警告**: large dataset では cache 全 view は不可、 chunk \u002F LRU が必要","NeRF Synthetic (lego\u002Fchair\u002F...) は 100 view 固定で 1 GB に収まる。 Tanks &amp; Temples の Truck (21,612 view) や Mip-NeRF 360 では cache サイズが unified memory を超えるため、 view-batch chunk + LRU eviction が必要 (本 finding の scope 外、 将来 Stage 4 で別途検討)。",{"type":47,"text":215},"7. roadmap 含意 (本 finding の位置付け)",{"type":42,"label":217,"variant":218,"text":219},"p1-profiling-baseline の優先順位 table 更新","info","本 finding により \u003Ccode>target_upload cache\u003C\u002Fcode> の wallclock ROI は \u003Cstrong>-5.5% (期待) → -0.2% (実測)\u003C\u002Fstrong> に修正。 profile baseline の Table 5.\"ROI 見積もり\" 行は \u003Cem>contention 3x 環境での見積もり\u003C\u002Fem> として記録、 本番 contention での実 ROI と区別する。 残りの優先順位は \u003Cstrong>(1) radix_sort 改善 (27% share、 -14〜17% 期待)\u003C\u002Fstrong>、 \u003Cstrong>(2) A.7 ICB batching forward+backward (-6% 期待)\u003C\u002Fstrong>、 \u003Cstrong>(3) SSIM fusion (-5% 期待)\u003C\u002Fstrong> の順で変更なし。 これらも当然 \"contention 高い時の見積もり\" であり、 実装後に同様の A\u002FB で検証が必要。",{"type":50,"ordered":221,"items":222},true,[223,224,225,226],"\u003Cstrong>commit を保持\u003C\u002Fstrong>: kernel 除去は構造的成果、 future contention 高負荷時 (multi-scene chain など) では再評価で ROI が出る可能性がある。 cache build cost 106 ms は 5k 145s に対し 0.07%、 trade-off は negligible。","\u003Cstrong>radix_sort 改善に集中\u003C\u002Fstrong>: 27% share = 35s \u002F 145s、 ここを 2x 高速化 (Apple MPS \u002F kernel fusion) すれば -14% wallclock = 真の高 ROI。 Metal Counter Sample で 16-pass の中身分解を次 step に提案。","\u003Cstrong>A.7 ICB batching\u003C\u002Fstrong>: forward tail (extract_off + rasterize + project_back + loss) を 1 cmd buffer 化、 commit barrier を 4→1 に。 既存 PoC (\u003Ccode>SPLAT_BATCHED_FORWARD=1\u003C\u002Fcode>) を拡張する形で実装、 期待 -5〜6%。","\u003Cstrong>本 finding は \"低 hanging fruit と思った実は ROI 1\u002F25\" の cautionary tale\u003C\u002Fstrong>として roadmap 文書に追記、 profile baseline の \"\u003Cstrong>host Instant proxy は overlap を見られない\u003C\u002Fstrong>\" 注記を強調する。",{"type":47,"text":228},"8. 想定外 \u002F caveat",{"type":50,"items":230},[231,232,233,234],"\u003Cstrong>predicted -5.5% に対し実測 -0.23%\u003C\u002Fstrong> (= 1\u002F25): advisor 事前警告 \"\u003C3% なら overlap 疑え\" がそのまま的中。 profile baseline で観測した \"5.6% host stall\" は contention 3x の特殊環境値、 平常運用での真の host stall は ~1.5% で、 そのうち overlap を引いた残りが 0.2% という構造。","\u003Cstrong>PSNR +0.14 dB drift\u003C\u002Fstrong>: seed 同一でも GPU buffer 配置順序差で atomic ordering が変わり、 refine.split の RNG 経路が compound。 5k smoke では noise floor 内だが、 30k full run で同 A\u002FB したときに差が広がる可能性は残る (本 finding の scope 外、 30k bench で別途確認推奨)。","\u003Cstrong>GPU contention 環境依存\u003C\u002Fstrong>: 本 A\u002FB は materials 30k 1 本並行 (中 contention)、 profile baseline は 3 本並行 (高 contention)。 contention が 0 (single trainer) のときに ROI がさらに低下する可能性あり、 逆に contention が 5+ になると ROI が回復する可能性あり (host stall window が広がる)。","\u003Cstrong>large dataset では cache が hold できない\u003C\u002Fstrong>: Tanks &amp; Temples \u002F Mip-NeRF 360 では 100→数千 view、 RAM cache 不可。 本実装は NeRF Synthetic scope に限定、 Stage 4+ で chunk + LRU が必要。",{"type":47,"text":236},"9. 再現手順",{"type":238,"lang":239,"text":240},"code","bash","# 1. Build (target cache 実装込み binary)\ncd splat\ncargo build --release -p splat-cli\n\n# 2a. A: cache OFF baseline (env で disable、apples-to-apples)\nSPLAT_DISABLE_TARGET_CACHE=1 \\\n  .\u002Ftarget\u002Frelease\u002Fsplat train \\\n  --config configs\u002F2026-05-25-1500-lego-target-cache-5k.toml\n\n# 2b. B: cache ON (default)\n.\u002Ftarget\u002Frelease\u002Fsplat train \\\n  --config configs\u002F2026-05-25-1500-lego-target-cache-5k.toml\n\n# 3. 期待出力:\n#   A: timing summary に `ts_target_upload  3.284s  5000 calls  657µs  1.5%`\n#   B: timing summary から ts_target_upload 行が消失、起動時に\n#      `[target_cache] uploaded 100 view buffers (976.6 MiB total) in 105ms`\n#\n# 4. wallclock 差: A 145.58s \u002F B 145.24s = -0.23% (本番 contention 環境)\n#    PSNR: A 31.631 dB \u002F B 31.770 dB (+0.14 dB drift、noise floor 内)\n",{"type":47,"text":242},"10. 関連",{"type":50,"items":244},[245,246,247,248],"Parent: p1-profiling-baseline (target_upload 5.6% share を観測した profiling)","Phase D 30k baseline: p1-d-stage2-30k-results (Lego brushcompat opacdecay 30k 36.106 dB \u002F 42 min)","次 step 提案: radix_sort sub-pass profiling (Metal Counter Sample で 16-pass 分解)、 A.7 ICB batching tail 完全化","Multi-scene chain (PID 81416) \u002F Phase D decay sweep (PID 36644) と並行起動互換 (本 A\u002FB 計測時に materials 30k 1 本のみ並行)",[],[251,280],{"id":29,"title":252,"date":9,"status":10,"polarity":253,"category":254,"axes":255,"tags":258,"task_code":269,"related_runs":270,"delta_psnr":274,"delta_wallclock":275,"rank":276,"verdict":277,"impact_summary":278,"detail_path":279},"P1.D Stage 2 — Lego brushcompat + opacity decay 30k = 36.106 dB、splats -56% \u002F wallclock -32%","positive","experiment",[14,256,257],2,3,[16,259,260,261,262,263,264,265,266,267,268],"phase-d","milestone-m5","opacity-decay","brush-parity","win-win-win","premultiplied","lego-30k","stage-2","splat-efficient","axis-1-prep","P1.D Stage 2 (M5 Lego val pass)",[271,272,273],"lego-brushcompat-opacdecay-30k","lego-brushcompat-base-30k","lego-brushcompat-opacdecay-5k","+0.92 dB vs baseline 30k (35.184 → 36.106)","-32% vs baseline 30k (1h 02m 18s → 41m 54s)","high","accepted-decisive-win","Lego brushcompat + opacity decay 30k で training-time eval 36.106 dB (val 100 view, brush convention, raw)、independent eval 36.163 dB (brush q8)。baseline 30k (35.184 dB) を **+0.92 dB 上回り**、splats を 846,689 → 375,146 に **-55.6% 削減**、wallclock を 1h 02m → 41m 54s に **-32% 短縮**。これは trade-off と想定していた PSNR\u002Fsplats\u002Fwallclock が **完全 win-win-win** に。M5 個別 scene gate (Lego brush conv > 36 dB) を val で達成、brush 自身 val 32.038 dB を +4.07 dB 上回り、本実装が brush を decisive に超えた。test subset (n=36) も +0.75 dB 改善 (33.315 → 34.065)、brush paper test 37.40 との gap を -3.34 dB まで縮小。Stage 1 smoke 推定 (splats -11.6%) を 30k で -56% に拡大、opacity decay の効果は iter 累積で増大することを実証。次 step は multi-scene Phase D 7 scene re-chain (chain 完了後 schedule)、低 wallclock + 低 splats での M5 multi-scene parity 完遂を狙う。","\u002Ffindings\u002Fp1-d-stage2-30k-results\u002F",{"id":28,"title":281,"date":9,"status":10,"polarity":12,"category":282,"axes":283,"tags":284,"task_code":291,"related_runs":292,"delta_psnr":294,"delta_wallclock":295,"rank":276,"verdict":296,"impact_summary":297,"detail_path":298},"P1 profiling baseline — radix_sort 27% \u002F ssim 16% \u002F backward 14% が三大 bottleneck、refine は僅か 2.6%","investigation",[14,257],[16,285,286,287,288,268,289,290],"profiling","kernel-timing","phase-e","a-6","lego-smoke","host-instant-proxy","P1 profiling baseline",[293],"lego-profile-smoke-1500","(n\u002Fa — 計測のみ、PSNR 不変)","(n\u002Fa — 計測 instrumentation のみ、 default OFF)","accepted-roadmap-pivot","Phase D Lego brushcompat 30k で wallclock 42m \u002F brush 9m gap (-4.6x) の真の bottleneck を per-kernel host Instant 計測で数値化。**仮説 (refine host RMW dominant) は棄却**、refine は 2.6% に過ぎず Phase E GPU 化の ROI は ~3% (期待していた -25% の 1\u002F8)。実 dominant は radix_sort 27% \u002F ssim 16% \u002F backward 14%。優先順位を **target_upload キャッシュ (即時 -5.6%) → radix_sort 改善 (-10〜15% 期待) → A.7 ICB batching tail (-5% 期待) → Phase E は卒論後** に反転すべき。","\u002Ffindings\u002Fp1-profiling-baseline\u002F",1782449788634]