[{"data":1,"prerenderedAt":363},["ShallowReactive",2],{"finding:phase5-step31-encoding-profile":3,"finding-runs:phase5-step31-encoding-profile":328,"finding-related:phase5-step31-encoding-profile":329},{"meta":4,"impact":31,"sections":36},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":16,"task_code":25,"related_runs":26,"related_findings":28},"phase5-step31-encoding-profile","Phase 5 #5.31 — CPU side profile + queue reuse 効果 + 真の bottleneck 同定","ArgBuffer 当初案は wallclock 寄与 0.5% で reject、代わりに queue reuse 単発で -13.7% を確定。残る host-side loss compute + readback ~10.5 ms\u002Fiter が真の bottleneck → 第 3 軸 (unified memory zero-copy) の最強候補 #5.31.x GPU loss を再定義。","Phase 5 · #5.31 encoding profile","2026-04-30","stable","speed","mixed",[14,15],2,3,[17,18,19,20,21,22,23,24],"phase-5","step-31","arg-buffer","queue-reuse","readback","unified-memory","encoding-profile","m4-max","#5.31",[27],"phase5-step31-profile",[29,30],"phase5-step30-profile","phase5-step30b-timing",{"summary":32,"rank":33,"verdict":34,"delta_wallclock":35},"ArgBuffer は CPU encoding 寄与 0.5% で 3% gate 不通過 → reject。queue reuse refactor 単独で -13.7% wallclock (1.14 ms\u002Fiter 削減が autorelease pool 圧縮を伴って効果増幅)。真の bottleneck は host-side loss compute + readback ~10.5 ms\u002Fiter (= 24-26% wallclock potential)、第 3 軸 narrative 最強の #5.31.x GPU loss kernel + no-readback を次着手に再定義。","high","partial","queue reuse: -13.7% \u002F ArgBuffer: 0.5% (reject)",[37,40,58,61,68,70,73,75,83,85,87,89,91,112,114,119,124,126,128,130,166,168,171,189,191,208,210,222,224,226,269,271,273,282,284,289,291,293,295,297,299,301,303,308,310,312,314,316,318,324],{"type":38,"text":39},"lead","\u003Ccode>#5.31\u003C\u002Fcode> ArgBuffer 当初案は CPU encoding の wallclock 寄与が \u003Cstrong>0.5%\u003C\u002Fstrong> (理論上限) で 3% gate 不通過 → reject。代わりに発見した \u003Ccode>#5.31.0b\u003C\u002Fcode> queue reuse 単独で \u003Cstrong>wallclock -13.7%\u003C\u002Fstrong> (95.9s → 82.8s, 2000 iter @ Lego F config)。さらに残る host-side loss compute + readback ~10.5 ms\u002Fiter が真の bottleneck → 第 3 軸 (Apple unified memory zero-copy) の最強候補 \u003Ccode>#5.31.x\u003C\u002Fcode> GPU loss kernel + no-readback pipeline を次着手に再定義。",{"type":41,"items":42},"kv",[43,46,49,52,55],{"key":44,"value":45},"実施","2026-04-30 (3 phase)、step 30b の _queue \u002F _enc \u002F _readback \u002F phase bucket timer を順次追加",{"key":47,"value":48},"Hardware","M4 Max",{"key":50,"value":51},"設定","F config + L1+SSIM (λ=0.20, K=7) 2000 iter、iter 50 reset、iter 50-2000 集計",{"key":53,"value":54},"Scripts","3dgs-rs\u002Fscripts\u002Fphase5\u002Frun_step31_encoding_profile.sh",{"key":56,"value":57},"Logs","3dgs-rs\u002Fruns\u002Fphase5-step31-profile\u002F (gitignored)",{"type":59,"text":60},"heading","TL;DR (3 つの結論)",{"type":62,"ordered":63,"items":64},"list",true,[65,66,67],"\u003Cstrong>#5.31 ArgBuffer は dead\u003C\u002Fstrong>。CPU encoding の wallclock 寄与は \u003Cstrong>0.5%\u003C\u002Fstrong> (理論上限)、3% gate 不通過確定。\u003Ccode>_enc\u003C\u002Fcode> 計測値: 0.21 ms\u002Fiter \u002F 42.5 ms\u002Fiter = 0.5%","\u003Cstrong>#5.31.0b queue reuse 単独で wallclock -13.7%\u003C\u002Fstrong> (95.9s → 82.8s, 2000 iter @ Lego F config)。1.14 ms\u002Fiter の queue 生成削減が autorelease pool 圧縮も伴って効果増幅","\u003Cstrong>真の bottleneck は host-CPU 経路\u003C\u002Fstrong> (loss\u002Fgrad host compute + readback)、合計 ~10-11 ms\u002Fiter (= 24-26% wallclock potential)。次着手は \u003Ccode>loss kernel GPU 化 + no-readback pipeline\u003C\u002Fcode>",{"type":59,"text":69},"Phase 1: per-dispatch encoding 計測 (5.31.0a)",{"type":71,"text":72},"paragraph","(初版に記載済の通り、ArgBuffer 単独の上限が 0.7% であることを確定)",{"type":59,"level":15,"text":74},"計測結果 (commit cea364b 直後)",{"type":62,"items":76},[77,78,79,80,81,82],"Wallclock: 95.9 s \u002F 2000 iter = \u003Cstrong>49.2 ms\u002Fiter\u003C\u002Fstrong>","GPU compute (sum of \u003Ccode>record(..)\u003C\u002Fcode>): 31.4 ms\u002Fiter","CPU side (wallclock - GPU): \u003Cstrong>17.8 ms\u002Fiter\u003C\u002Fstrong>","&nbsp;&nbsp;・queue 生成: 1.14 ms\u002Fiter","&nbsp;&nbsp;・encoder setup: 0.34 ms\u002Fiter","&nbsp;&nbsp;・その他 CPU: \u003Cstrong>16.0 ms\u002Fiter ← 未分解\u003C\u002Fstrong>",{"type":71,"text":84},"ArgBuffer は encoder setup の 0.34 ms\u002Fiter しか触らないため上限 0.7%、3% gate 不通過確定。",{"type":59,"text":86},"Phase 2: queue reuse refactor (5.31.0b)",{"type":71,"text":88},"10 dispatch site の \u003Ccode>let queue = self.device.new_command_queue()\u003C\u002Fcode> を全 struct field の \u003Ccode>self.queue\u003C\u002Fcode> 参照に置換 (commit \u003Ccode>e2611df\u003C\u002Fcode>)。",{"type":59,"level":15,"text":90},"効果 (大きく上振れ)",{"type":92,"columns":93,"align":98,"rows":101},"table",[94,95,96,97],"指標","before (5.31.0a)","after (5.31.0b)","delta",[99,100,100,100],"left","right",[102,107],[103,104,105,106],"Wallclock 2000 iter","95.9 s","82.8 s","-13.7%",[108,109,110,111],"ms\u002Fiter","49.2 ms","42.5 ms","-6.7 ms",{"type":71,"text":113},"\u003Cstrong>naive 計算 (1.14 ms\u002Fiter ≒ 2.3%) を遥かに超える\u003C\u002Fstrong>。理由は以下と推測:",{"type":62,"items":115},[116,117,118],"queue 生成は 80-130 µs を timer 上では取るが、ObjC autoreleasepool 経由で hidden cost 累積","10 queue\u002Fiter × 2000 iter = 20000 queue alloc\u002Fdealloc が GPU driver \u002F IOService に圧力","queue reuse で per-iter autorelease pool が大幅に lighter",{"type":120,"label":121,"variant":122,"text":123},"callout","Big single-commit win","success","queue reuse は phase 5 の最大単一コミット効果 (M-2 SIMD reduction の 2.43× per-kernel と同水準の wallclock 効果)。",{"type":59,"text":125},"Phase 3: readback + host-compute 計測 (5.31.0c)",{"type":71,"text":127},"queue reuse 後の 16 ms\u002Fiter CPU 側内訳を裏取りするため、\u003Ccode>_readback\u003C\u002Fcode> ラベル + \u003Ccode>ts_*\u003C\u002Fcode> phase bucket を追加。",{"type":59,"level":15,"text":129},"Phase bucket 集計 (per-iter)",{"type":92,"columns":131,"align":134,"rows":135},[132,108,133],"phase","含む内容",[99,100,99],[136,140,144,148,152,156,160,164],[137,138,139],"ts_forward","17.52 ms","project_soa + emit_pairs + radix×16 + extract + rasterize_f32 + 各 readback",[141,142,143],"ts_loss_host","9.13 ms","l1_loss + l1_grad + ssim fwd\u002Fbwd GPU + ssim_cpu_mean + ssim_grad_readback + grad combine",[145,146,147],"ts_backward","11.62 ms","rasterize_backwards_simd + backward_rasterize_readback",[149,150,151],"ts_project_back","0.55 ms","project_backwards",[153,154,155],"ts_adam","0.95 ms","adam_step ×5",[157,158,159],"合計","39.77 ms","",[161,162,163],"残: iter overhead","2.73 ms","autoreleasepool + scan_nan + refine accumulate + Rust loop",[165,110,159],"wallclock",{"type":59,"level":15,"text":167},"各 phase の non-overlapping 内訳",{"type":59,"level":169,"text":170},4,"ts_forward (17.52 ms\u002Fiter)",{"type":92,"columns":172,"align":175,"rows":176},[173,108,174],"内訳","注",[99,100,99],[177,181,185],[178,179,180],"GPU compute (project_soa + emit_pairs + radix×16 + extract + rasterize_f32)","~12.6 ms","record(..) 直接計測",[182,183,184],"readback (project_soa + emit_pairs + radix_sort + extract_offsets + rasterize_f32)","~2.1 ms","rasterize_f32_readback 0.82 ms が最大",[186,187,188],"residual","~2.9 ms","buffer alloc (new_buffer_with_data) + CPU radix prefix scan + Rust overhead",{"type":59,"level":169,"text":190},"ts_loss_host (9.13 ms\u002Fiter)",{"type":92,"columns":192,"align":193,"rows":194},[173,108,174],[99,100,99],[195,198,202,205],[196,197,159],"ssim_fwd_bwd (GPU)","2.84 ms",[199,200,201],"ssim_cpu_mean","1.28 ms","800×800×3 reduce",[203,204,159],"ssim_grad_readback","0.52 ms",[186,206,207],"4.49 ms","l1_loss + l1_grad + grad combine on rendered Vec (800×800×4 = 2.56 MB)",{"type":59,"level":169,"text":209},"ts_backward (11.62 ms\u002Fiter)",{"type":92,"columns":211,"align":212,"rows":213},[173,108],[99,100],[214,217,220],[215,216],"rasterize_backwards_simd (GPU)","9.47 ms",[218,219],"backward_rasterize_readback","0.12 ms",[186,221],"2.03 ms (buffer alloc \u002F dldo upload \u002F Rust)",{"type":59,"text":223},"ROI 比較表 (ranking)",{"type":71,"text":225},"ROI = 期待 wallclock 改善 \u002F 実装工数。",{"type":92,"columns":227,"align":234,"rows":235},[228,229,230,231,232,233],"候補","削減潜在 (ms\u002Fiter)","wallclock 改善","工数","narrative 価値","状態",[99,100,100,99,99,99],[236,242,249,256,263],[237,238,106,239,240,241],"#5.31.0b queue reuse","6.7 ms (実測)","30 min","infrastructure","✅ 完了",[243,244,245,246,247,248],"#5.31.x GPU loss + no-readback","~7-8 ms (推定)","-16〜19%","4-8 hr","第 3 軸最強 (= unified memory 直撃)","検討中",[250,251,252,253,254,255],"#5.34 SSIM tile shader","~1.5 ms","~3.5%","3-5 hr","第 2 軸+第 3 軸 (Apple TBDR)","future work",[257,258,259,260,261,262],"#5.31.5 dispatch fusion (B-mini)","0 ms (確定)","0%","(実測済 ROI ゼロ)","(negative)","❌ reject",[264,265,266,267,268,262],"#5.31 ArgBuffer","0.21 ms (実測)","0.5%","4-6 hr","弱",{"type":59,"text":270},"真の bottleneck = ts_loss_host residual + readback",{"type":71,"text":272},"合計 ~10.5 ms\u002Fiter の host-CPU 経路:",{"type":62,"ordered":63,"items":274},[275,276,277,278,279,280,281],"\u003Cstrong>l1_loss(rendered, target) + l1_loss_grad(...) (~3.5 ms)\u003C\u002Fstrong> — 800×800×4 f32 を 2 回 iterate (loss + grad)","\u003Cstrong>grad combine (1-λ)*l1g - λ*ssim_grad (~1 ms)\u003C\u002Fstrong> — 同サイズ Vec をもう一度 iterate","\u003Cstrong>rasterize_f32 readback (0.82 ms)\u003C\u002Fstrong> — rendered_buf を \u003Ccode>to_vec()\u003C\u002Fcode>","\u003Cstrong>emit_pairs readback (0.73 ms)\u003C\u002Fstrong> — sorted keys の host 経由","\u003Cstrong>radix_sort readback (0.36 ms)\u003C\u002Fstrong> — sorted keys を host へ pull","\u003Cstrong>ssim_grad_readback (0.52 ms)\u003C\u002Fstrong> — grad を host 経由","\u003Cstrong>その他 readback + buffer alloc (~3.5 ms)\u003C\u002Fstrong>",{"type":71,"text":283},"これらは全て:",{"type":62,"items":285},[286,287,288],"\u003Cstrong>wgpu 抽象 (= brush 路線) の典型\u003C\u002Fstrong> — 各 op の境界で host vec へ readback","\u003Cstrong>Apple unified memory が解決する領域\u003C\u002Fstrong> — \u003Ccode>.contents()\u003C\u002Fcode> で zero-copy だが \u003Ccode>.to_vec()\u003C\u002Fcode> で copy 発生","\u003Cstrong>第 3 軸 narrative の核\u003C\u002Fstrong> — 「unified memory を活用していない設計欠陥を remove したらどれだけ速くなるか」",{"type":59,"text":290},"Pivot 決定 (data driven)",{"type":59,"level":15,"text":292},"#5.31 当初定義 (ArgBuffer) は scope 外",{"type":71,"text":294},"確定: 0.5% wallclock 上限、F\u002FG と同 pre-commit gate culture で reject。\u003Ccode>docs\u002Froadmap\u002Ffuture-work.md\u003C\u002Fcode> §B-1 を更新、\u003Ccode>docs\u002Ftodo.md\u003C\u002Fcode> の \u003Ccode>#5.31\u003C\u002Fcode> を ❌ に。",{"type":59,"level":15,"text":296},"採用: #5.31.0b queue reuse (実測 -13.7%)",{"type":71,"text":298},"別 commit \u003Ccode>e2611df\u003C\u002Fcode> で完了済。findings に M-3 候補として記録。",{"type":59,"level":15,"text":300},"検討: #5.31.x GPU loss kernel + no-readback pipeline",{"type":71,"text":302},"「真の bottleneck」を解決する Phase 5 後継 step として再定義。\u003Cstrong>第 3 軸 narrative 最強の貢献候補\u003C\u002Fstrong>:",{"type":62,"items":304},[305,306,307],"M4 Max unified memory の zero-copy を実装で示す","brush の wgpu 抽象 (= host 経由) との対比が直接立つ","実装: forward_with_state の戻り値を GPU buffer の参照に変更、loss + grad を Metal kernel 化",{"type":71,"text":309},"期待 ROI: -16〜19% wallclock (= 35 ms\u002Fiter 圏)、工数 4-8 hr。",{"type":59,"level":15,"text":311},"Pivot 候補: #5.34 SSIM tile shader",{"type":71,"text":313},"第 2 軸 + 第 3 軸 narrative はあるが ROI 小さい (~3% wallclock)。GPU loss が大きすぎるので後回し。",{"type":59,"text":315},"卒論への活用",{"type":71,"text":317},"本 finding は \u003Cstrong>「abstract に CPU encoding と呼んでいた overhead を 3 段階の計測で内訳分離した」\u003C\u002Fstrong> 方法論的貢献:",{"type":62,"ordered":63,"items":319},[320,321,322,323],"step 30 で「~30% が CPU encoding」と推定","step 31.0a で encoder setup は 1.4%、queue 込みでも 3.6% と判明","step 31.0b で queue reuse のみで 13.7% wallclock (期待を上振れ)","step 31.0c で残りは host-side loss compute + readback と判明 → 第 3 軸 narrative の最強候補",{"type":120,"label":325,"variant":326,"text":327},"Methodology","info","F (scale_reg) \u002F G (MCMC) と同じ「pre-committed gate で reject + 残作業に valuable narrative を引き継ぐ」negative finding。卒論の方法論章で「ベンチマーク前提の自己検証手順」として収録予定。",[],[330,347],{"id":29,"title":331,"date":9,"status":10,"polarity":12,"category":11,"axes":332,"tags":333,"task_code":339,"related_runs":340,"delta_psnr":-1,"delta_wallclock":342,"rank":343,"verdict":344,"impact_summary":345,"detail_path":346},"Phase 5 step 30 — Instruments \u002F Metal System Trace 分析結果",[15],[17,334,335,336,24,337,338],"step-30","instruments","metal-system-trace","profiling","fusion-reject","#5.30",[341],"phase5-step30","B-mini: -1% (noise floor)","mid","investigative","30s Metal System Trace で 14,909 encoder \u002F iter 40 encoder を観測。当初の「STIME 70% = sync overhead」解釈は B-mini プロト (scatter wait 削除、\u003C 1% 改善) で撤回。真の breakdown は GPU compute ~70% \u002F CPU encoding ~30%、dispatch fusion ROI は小さく Phase 4 後続 (C\u002FD\u002FF) 進行に戻る判断。","\u002Ffindings\u002Fphase5-step30-profile\u002F",{"id":30,"title":348,"date":9,"status":10,"polarity":349,"category":11,"axes":350,"tags":351,"task_code":357,"related_runs":358,"delta_psnr":-1,"delta_wallclock":-1,"rank":33,"verdict":360,"impact_summary":361,"detail_path":362},"Phase 5 step 30b — kernel-by-kernel timing 計測結果","positive",[15],[17,352,353,354,355,24,356],"step-30b","kernel-timing","rasterize-backwards","atomic-bottleneck","hotspot","#5.30b",[359],"phase5-step30b","accepted","kernel-level GPU timer で rasterize_backwards が 24.1 ms\u002Fcall \u002F 52.1% total と確定 dominant。atomic float add が律速と判定し、step 33 SIMD prefix sum reduction prototype の最有力ターゲットを確定。期待 ROI は 50% 削減で iter -13%、80% 削減で -21%。","\u002Ffindings\u002Fphase5-step30b-timing\u002F",1782449788854]