ArgBuffer 当初案は wallclock 寄与 0.5% で reject、代わりに queue reuse 単発で -13.7% を確定。残る host-side loss compute + readback ~10.5 ms/iter が真の bottleneck → 第 3 軸 (unified memory zero-copy) の最強候補 #5.31.x GPU loss を再定義。
#5.31 ArgBuffer 当初案は CPU encoding の wallclock 寄与が 0.5% (理論上限) で 3% gate 不通過 → reject。代わりに発見した #5.31.0b queue reuse 単独で wallclock -13.7% (95.9s → 82.8s, 2000 iter @ Lego F config)。さらに残る host-side loss compute + readback ~10.5 ms/iter が真の bottleneck → 第 3 軸 (Apple unified memory zero-copy) の最強候補 #5.31.x GPU loss kernel + no-readback pipeline を次着手に再定義。
_enc 計測値: 0.21 ms/iter / 42.5 ms/iter = 0.5%loss kernel GPU 化 + no-readback pipeline(初版に記載済の通り、ArgBuffer 単独の上限が 0.7% であることを確定)
record(..)): 31.4 ms/iterArgBuffer は encoder setup の 0.34 ms/iter しか触らないため上限 0.7%、3% gate 不通過確定。
10 dispatch site の let queue = self.device.new_command_queue() を全 struct field の self.queue 参照に置換 (commit e2611df)。
| 指標 | before (5.31.0a) | after (5.31.0b) | delta |
|---|---|---|---|
| Wallclock 2000 iter | 95.9 s | 82.8 s | -13.7% |
| ms/iter | 49.2 ms | 42.5 ms | -6.7 ms |
naive 計算 (1.14 ms/iter ≒ 2.3%) を遥かに超える。理由は以下と推測:
queue reuse は phase 5 の最大単一コミット効果 (M-2 SIMD reduction の 2.43× per-kernel と同水準の wallclock 効果)。
queue reuse 後の 16 ms/iter CPU 側内訳を裏取りするため、_readback ラベル + ts_* phase bucket を追加。
| phase | ms/iter | 含む内容 |
|---|---|---|
| ts_forward | 17.52 ms | project_soa + emit_pairs + radix×16 + extract + rasterize_f32 + 各 readback |
| ts_loss_host | 9.13 ms | l1_loss + l1_grad + ssim fwd/bwd GPU + ssim_cpu_mean + ssim_grad_readback + grad combine |
| ts_backward | 11.62 ms | rasterize_backwards_simd + backward_rasterize_readback |
| ts_project_back | 0.55 ms | project_backwards |
| ts_adam | 0.95 ms | adam_step ×5 |
| 合計 | 39.77 ms | |
| 残: iter overhead | 2.73 ms | autoreleasepool + scan_nan + refine accumulate + Rust loop |
| wallclock | 42.5 ms |
| 内訳 | ms/iter | 注 |
|---|---|---|
| GPU compute (project_soa + emit_pairs + radix×16 + extract + rasterize_f32) | ~12.6 ms | record(..) 直接計測 |
| readback (project_soa + emit_pairs + radix_sort + extract_offsets + rasterize_f32) | ~2.1 ms | rasterize_f32_readback 0.82 ms が最大 |
| residual | ~2.9 ms | buffer alloc (new_buffer_with_data) + CPU radix prefix scan + Rust overhead |
| 内訳 | ms/iter | 注 |
|---|---|---|
| ssim_fwd_bwd (GPU) | 2.84 ms | |
| ssim_cpu_mean | 1.28 ms | 800×800×3 reduce |
| ssim_grad_readback | 0.52 ms | |
| residual | 4.49 ms | l1_loss + l1_grad + grad combine on rendered Vec (800×800×4 = 2.56 MB) |
| 内訳 | ms/iter |
|---|---|
| rasterize_backwards_simd (GPU) | 9.47 ms |
| backward_rasterize_readback | 0.12 ms |
| residual | 2.03 ms (buffer alloc / dldo upload / Rust) |
ROI = 期待 wallclock 改善 / 実装工数。
| 候補 | 削減潜在 (ms/iter) | wallclock 改善 | 工数 | narrative 価値 | 状態 |
|---|---|---|---|---|---|
| #5.31.0b queue reuse | 6.7 ms (実測) | -13.7% | 30 min | infrastructure | ✅ 完了 |
| #5.31.x GPU loss + no-readback | ~7-8 ms (推定) | -16〜19% | 4-8 hr | 第 3 軸最強 (= unified memory 直撃) | 検討中 |
| #5.34 SSIM tile shader | ~1.5 ms | ~3.5% | 3-5 hr | 第 2 軸+第 3 軸 (Apple TBDR) | future work |
| #5.31.5 dispatch fusion (B-mini) | 0 ms (確定) | 0% | (実測済 ROI ゼロ) | (negative) | ❌ reject |
| #5.31 ArgBuffer | 0.21 ms (実測) | 0.5% | 4-6 hr | 弱 | ❌ reject |
合計 ~10.5 ms/iter の host-CPU 経路:
to_vec()これらは全て:
.contents() で zero-copy だが .to_vec() で copy 発生確定: 0.5% wallclock 上限、F/G と同 pre-commit gate culture で reject。docs/roadmap/future-work.md §B-1 を更新、docs/todo.md の #5.31 を ❌ に。
別 commit e2611df で完了済。findings に M-3 候補として記録。
「真の bottleneck」を解決する Phase 5 後継 step として再定義。第 3 軸 narrative 最強の貢献候補:
期待 ROI: -16〜19% wallclock (= 35 ms/iter 圏)、工数 4-8 hr。
第 2 軸 + 第 3 軸 narrative はあるが ROI 小さい (~3% wallclock)。GPU loss が大きすぎるので後回し。
本 finding は 「abstract に CPU encoding と呼んでいた overhead を 3 段階の計測で内訳分離した」 方法論的貢献:
F (scale_reg) / G (MCMC) と同じ「pre-committed gate で reject + 残作業に valuable narrative を引き継ぐ」negative finding。卒論の方法論章で「ベンチマーク前提の自己検証手順」として収録予定。