backward_raster 監査 (p3-backward-audit) に続き、per-kernel share v2 で 2・3 位の <code>render_splats_f32</code> (14.13%) と <code>adam_step</code> (15.28%) を監査した。forward は 5 観点 (a)〜(e)、adam は 3 観点 (f)〜(h) で候補を列挙し、特に adam の「帯域床 65.6% で閉鎖済み」という既存の closure 根拠を自前の byte-accounting で初めて検証した。<strong>forward の実効帯域到達率は 410GB/s (この M4 Max、14-core CPU/32-core GPU 構成の公称値) 比でわずか ~8.5〜8.7% — ALU/latency-bound であり float4 化や出力 packing のような帯域削減系候補は原理的に低 payoff</strong>。<strong>adam は同じ 410GB/s 比で ~90〜93% — ほぼ飽和しており pow hoist/f16 のような ALU 側最適化は元から無意味 (最終 N ではなく平均 N を使わないと 117% という物理的に不可能な値が出る罠を本 finding で明示)</strong>。旧 tasklist が引用する「adam 帯域床 65.6%」の出典は追跡できず、同一数値が p2-counter-session の非 production per_kernel regime run の GPU busy% 列に存在することのみ確認した (誤用と断定はしないが、今後この数値を adam 固有の帯域到達率として引用するのは避けるべき)。bit-exact-class で安全性を確認できた候補は forward の threadgroup barrier 1 本削減のみだが、forward が ALU-bound という上記の結論と自己整合的に、期待 Δ は harness 分解能 (M2 Tier1 -1.11% 判定不能・M5a -0.055% null が示す ~1% の床) 未満と判断し、<strong>実装 (段 2) はしなかった</strong>。
2026-08-next-phase-tasklist.md:46 の「adam 帯域床 65.6%」の出典を `docs/strategy/raw/*.json` で検索したが adam 固有の帯域算出は見つからず、同一の 65.6% は `p2-counter-session.toml` の 非 production per_kernel regime run の GPU busy% 列にのみ存在する (`2026-09-seminar05-milestones.md:19` 自身がこの規模の同数値を「使えない」と注記している) — 誤用と断定する証拠はないが、今後 adam の帯域到達率として引用するのは避け、本 finding の 90〜93% を正とすべき。forward の (a) は backward の W1a (simd_any による reduction/atomic emit の skip) と構造が異なる: forward は per-splat の reduction/atomic を持たず、per-thread `!done` 条件による loop 早期脱出がハードウェアの execution mask 収束と等価な効果を既に持つため、明示的な `simd_all(done)` 追加は原理的に redundant (期待 Δ ≈0)。(b) は `num_done_atomic` の読み手が loop 先頭の 1 箇所のみ (`grep -rn num_done` で確認) であることを利用し、初期化直後の 2 本目の barrier (rasterize.metal:106) を安全に削除できる (bit-exact、単調増加のため未同期時は過小評価のみで正しさに影響しない) — ただし forward が ALU-bound という上記結論と整合的に期待 Δ は harness 分解能未満と判断した。(c) 出力 packing は f16 storage 禁忌 + backward が final_T を f32 精度で必要とするため機会なし。(d) conic/color の float4/SoA 化は forward が帯域 1 割未満という結果から低 payoff、producer (project.rs) にも触れる高工数で見合わない。(e) occupancy/register は backward 監査と同じツール限界 (Xcode GPU Frame Capture 相当が本環境に無い) で直接観測不能、TG memory 使用量 (9,220B/32,768B) からは非律速と推測されるに留まる。AIR level では `-ffast-math` 相当の `air.fast_exp.f32` が既に使われていることを確認した (`shader_fast_math` の default が `true` = MTLCompileOptions default であるため) — 「fast exp に切り替える」候補は既に default で実施済みであり追加の余地なし。**結論: bit-exact-class で harness 分解能を超える候補は forward・adam いずれにも残っていない。段 2 (実装) は task 記載の <1% 省略条件に該当するため実施しなかった**。backward_raster 監査 (p3-backward-audit、M8 atomic emit lane 分散を実装するも NO-GO) に続き、per-kernel share v2 (p3-kernel-share-post-s3 §6: backward_raster 40.07% > adam 15.28% > rasterize 14.13% > ssim 13.12% > radix 12.01%) で 2・3 位の splat/shaders/forward/rasterize.metal::render_splats_f32 と splat/shaders/opt/adam.metal::adam_step を監査した。task 指定の観点 (a)〜(h) を検討し、特に (f) 「adam 12.7% が帯域床なら visible-only 以外の削減余地は理論上ない」を実際に検算することを主眼に置いた。
| 候補 | kernel / 観点 | 期待 Δ | bit-exact 性 | 工数 | 既知の敗因・禁忌との衝突 |
|---|---|---|---|---|---|
| forward: `num_done_atomic` 初期化直後の barrier 1 本削除 | (b) | harness 分解能未満 (forward は ALU-bound、帯域到達率 8.5〜8.7% で barrier 律速ではないと自己整合的に判断) | **bit-exact** (読み手が loop 先頭 1 箇所のみ、単調増加カウンタの過小評価は正しさに無関係、`grep -rn num_done` で確認) | 低 (shader 2 kernel + 1 行削除) | 衝突なし、ただし期待 Δ が小さく実装優先度は低い |
| adam: visible-only skip (M6/(h)) | (h) | 不明 (不可視 splat 割合 × adam share 15.28% が理論上限、未計測) | **非 bit-exact** (moment decay semantics 変化) | 中 | J2 ユーザー判断待ち、task 指定で段 2 対象外 |
| forward: conic/color float4/SoA 化 | (d) | 低 (帯域到達率 8.5〜8.7% — 帯域削減系の payoff が原理的に薄い) | bit-exact (理論上) | 高 (producer project.rs + consumer 両方) | backward audit (d) の broadcast-read 論証と同型の低 payoff 判定、producer 変更の高工数 |
| forward: 出力 packing (f16 / struct 統合) | (c) | 無し (禁忌 + 精度制約の二重ブロック) | N/A | N/A | **f16 storage/forward 禁忌に抵触**、final_T/last_contributor は backward が f32 精度を要求 |
| forward: simd_all(done) による inner loop 早期打ち切り | (a) | ≈0 (execution mask 収束と原理的に redundant) | bit-exact (実装しても no-op) | 低 | backward W1a は reduction/atomic emit を持つが forward には無い — 構造的に成立しない候補 |
| (参考) forward: fast exp への切替 | (e) | 既に default で実施済み (AIR で `air.fast_exp.f32` 確認、`shader_fast_math` default=true) | N/A | — | 候補として提案する意味がない (closure として記録) |
| (参考) adam: pow hoist (bc1/bc2 の per-thread 重複計算) | (f) | 既知: 帯域飽和 (90〜93%) の影に隠れ wallclock 効果ほぼ無し | bit-inexact の可能性 (CPU pow vs GPU pow の bit 差) | — | **tasklist 既存の禁忌に整合、本監査の byte-accounting でも再確認** |
本 finding の実測的な核心は「bit-exact 候補が見つからなかった」ことそのものより、forward と adam が正反対の律速構造を持つことを自前の byte-accounting で初めて定量化したことにある。adam は 1 thread = 1 element の純粋な elementwise kernel で reuse が一切なく (memory-bound の教科書的な形)、410GB/s 公称帯域の 90〜93% まで到達している — これ以上速くする手段は理論上 bytes を減らすこと (h、visible-only skip、非 bit-exact) しかない。forward は per-splat の ALU 演算 (sigma 計算 + `exp` + 分岐) が中心で、staging read はほとんどが threadgroup memory 内の broadcast/reuse で吸収され、device memory への実際のトラフィックは合計しても 46MB/iter 程度 (帯域の 1 割未満) — 帯域を減らす方向の候補 ((c)/(d)) はどれだけ効率化しても wallclock にはほぼ効かないことが、backward audit のような「候補を実装してから regression が判明する」のではなく実装前の計算で示せた。M2 Tier1 (Δ -1.11%、判定不能) と M5a (SSIM float4_rcp、Δ -0.055%、null) が確立した harness 分解能 (~1%) を踏まえると、本監査で見つかった唯一の bit-exact 候補 (forward の barrier 1 本削減) もこの床を超える見込みが薄く、段 2 (実装) は task 記載の「候補が全て <1% なら省略」に従って実施しなかった。