User task brief は「memory 半減 / 20-40% wallclock 改善」期待で再着手を指示したが、orientation 段階で 3 つの factual error を発見: (1) Splat2DPacked は実際は <strong>32 byte</strong> (36→18 ではない、RGB のみ f16、xy+conic+α は f32 維持)、(2) bandwidth 削減は <strong>-11%</strong> (-50% ではない)、(3) Phase D 30k memory footprint は packed で <strong>~12 MB</strong> (6.75 MB ではない)。bound math: rasterize fwd+bwd の wallclock 比率が 83k 時 ~10% → 375k で best-case ~30% に成長しても、11% × 30% = <strong>~3.3% wallclock 上限</strong>。これは旧評価 ~1% の 3 倍だが、user brief の 20-40% 期待からは 6-12× 下回り、また M5 Lego val gate margin (+0.11 dB) より RGB f16 量子化誤差 (0.1-0.5 dB 想定) の方が大きく、M5 gate を割る可能性。trainer 統合 ~2.5 h work × 期待 ROI 1-3% × M5 regression risk を考慮し再着手 reject。bench 不実施 (orientation のみで決着)。
User task brief は事実関係に 3 つの error を含み、それが "再着手すれば 20-40% wallclock ROI が見える" 期待を構築していた。orientation で実コード (commit 5a22770 / d01d6cf / ba740a4) と既存 memory (feat_g_f16_packed_roi.md) を照合した結果、bound math 上限 ~3.3% / M5 gate regression risk / trainer 統合 ~2.5 h cost の組合せで 再着手は net-negative。bench 不実施で halt、本 finding が durable な記録。
User task brief の事実関係 error 3 件 + bound math 上限低: (1) Splat2DPacked は 36→32 byte (18 byte は誤、RGB のみ f16 / xy+conic+α は f32 維持)、(2) bandwidth 削減は -11% (-50% 半減ではない)、(3) Phase D 30k memory footprint は packed で ~12 MB (375k × 32 byte、6.75 MB ではない)。 wallclock ROI 上限 bound = (rasterize fwd+bwd wallclock share 30% 仮定) × (bandwidth 削減 11%) = ~3.3%。M5 Lego val gate margin は +0.11 dB (36.106 vs 36 dB target)、RGB f16 round-trip rel error 5e-4 が compositing 累積で 0.1-0.5 dB 程度 PSNR drift 起こすと M5 を割る。trainer 統合 ~2.5 h work × bounded ROI × M5 regression risk で 再着手 reject。
| 項目 | user brief 主張 | feat.G 実装現実 (commit 確認済) | 出典 |
|---|---|---|---|
| Splat2D size | 36 byte (正しい) | 36 byte = 9 × f32 | splat-core/types.rs:14-25 |
| Splat2DPacked size | **18 byte (半減)** | **32 byte** (6 × f32 + 4 × f16) | 5a22770 commit body: "layout (32 bytes)" |
| bandwidth 削減 | **memory bandwidth 半減 (50%)** | **11% 削減** (32/36 = 0.89) | ba740a4 commit body: "global memory bandwidth ~11% 削減" |
| packed の f16 化対象 | 全 9 field f16 | **RGB 3 個のみ f16** (xy+conic+α は f32 維持) | 5a22770 body: "color_rgb_pad_bits ... 4 u16 = 8 bytes" |
| Phase D 30k memory | 13.5 MB → **6.75 MB 帯** | 13.5 MB → **~12 MB** (375k × 32 byte) | 計算: 375,146 × 32 = 12.0 MB |
| 期待 wallclock ROI | **-20〜-40%** | **~1-3% 上限** (bound math、後述) | memory feat_g_f16_packed_roi.md + 本 bound check |
memory feat_g_f16_packed_roi.md に記録された旧評価 (~1% wallclock) は 83k splat baseline での timing breakdown に依拠:
旧 timing breakdown (83k splats、broken H.A 30k bench から):
ts_forward 49.5% (forward 全体)
ts_fw_sort 22.3% ← bandwidth 削減対象外
ts_fw_emit 18.1% ← bandwidth 削減対象外
ts_fw_rasterize 5.4% ← packed forward 対象 (rasterize.metal)
ts_fw_offsets 2.2%
ts_fw_project 1.5% ← packed project 対象 (project.metal)
ts_project_back 0.5% ← packed backward 対象 (rasterize_backwards.metal)
(backward ~5% 推定)
packed 削減対象合計 ≈ 12% of wallclock
× 11% bandwidth 削減 = **~1.3% wallclock 改善 (83k splat 時)**
Phase D 375k へのスケーリング bound:
Phase D 375k 文脈で f16 packed の wallclock ROI は realistic 1.7-2.2% / ceiling 3.3%。user brief の 20-40% 期待値からは 6-12 倍下回る。実装の物理特性 (RGB のみ f16 化、bandwidth 削減 11%) と Phase D 30k の timing structure (sort 22% / emit 18% が bandwidth 削減対象外で支配的) を考慮すると、user brief の期待は何らかの prior misunderstanding (恐らく全 field f16 化を仮定) に由来する。
| 項目 | 値 | 出典 / 計算 |
|---|---|---|
| RGB f16 max rel error (per-splat round-trip) | 5e-4 | feat.G stage 1 unit test (splat2d_packed_color_within_f16_precision) |
| compositing 累積後の RGB drift | ~1e-3 帯 | feat.G stage 2 forward eq test: tol 5e-3 で pass、現実 drift は 1e-3 オーダー |
| PSNR drift 想定 (RGB error → log10 PSNR) | 0.1-0.5 dB | 保守的推定: 1e-3 RGB drift × 2 (compositing) → MSE 増加 ~2e-6 → ΔPSNR 0.1-0.5 dB |
| M5 Lego val gate margin (現状) | **+0.11 dB** | Phase D 30k 36.106 dB vs M5 target 36 dB |
| **Net**: M5 gate 維持確率 | **低** | 想定 drift 0.1-0.5 dB > margin 0.11 dB |
memory feat_g_branch_state.md に記録された通り、feat.G stage 3a (cherry-pick 対象) は trainer dispatch 未統合。kernel pair + Rust glue + test は完成しているが、`Trainer::forward_step` / `Trainer::backward_step` から packed kernel を呼ぶ route が無く、`splat-cli/src/cmd/train.rs` で B.1 (RunSummary 統合) と merge conflict 必至。
BackendConfig.splat2d_layout: "fp32" | "packed" 追加、ForwardState に packed buffer 持たせる、forward/backward で switch、ParamBuffer pool 拡張~2.5 h subagent work × bounded ~1.7-2.2% wallclock × M5 regression probability ~50% (drift 0.1-0.5 dB vs margin 0.11 dB) = negative expected utility。同 2.5 h を使うなら sort kernel 高速化 (share 22%、ROI 上限大) や emit kernel 高速化 (share 18%) の方が leverage 桁違いに大きい。
user brief の根本動機が "Phase D 375k で bandwidth bound を可視化したい" なら、より大 ROI の alternative がある:
| alternative | scope | 期待 wallclock ROI | PSNR risk |
|---|---|---|---|
| **full f16 Splat2D** (xy + conic も f16) | kernel 再書き直し、precision 検証必要 | ~5-8% (32→18 byte で本物の bandwidth 半減) | xy/conic 精度低下で sort 順序変化、>1 dB drift リスク |
| **sort kernel 高速化** (radix 8-bit prefix) | 新 kernel、A.x で 1 件 reject 済 (variance) | ~5-10% (share 22% × ~30-50%) | ゼロ (algorithm 等価) |
| **emit kernel 高速化** (tile_bin 並列度上げ) | 新 kernel、未調査 | ~3-6% (share 18% × ~15-30%) | ゼロ |
| **rasterize threadgroup memory layout 最適化** | 既存 kernel 改変、A.x で深掘り余地 | ~2-4% | ゼロ |
| A.6 f16 packed (RGB のみ、現実装) | trainer 統合 ~2.5 h | **~1.7-2.2%** | 0.1-0.5 dB |
a-6-feat-g-packed-investigation.toml (2026-05-23) で既に A.6 は "kernel pair 完成 + ROI ~1% で close" としていた。本 finding は同じ結論を Phase D 文脈で再検証 したもの:
orientation 段階で halt、bench 不実施。bound math (~1.7-2.2% realistic / ~3.3% ceiling) × M5 gate regression risk (drift 0.1-0.5 dB vs margin 0.11 dB) × 統合 cost (~2.5 h) で net-negative expected utility。卒論 central evaluation の "M5 gate 達成" 主張を守るため、PSNR drift を伴う optimization は Phase 6 (post-thesis or 軸 1 native kernel 完成後) に再考。同 budget は sort/emit kernel 高速化または full f16 Splat2D 検証に振るべき。
a-6-feat-g-packed-investigation (2026-05-23)p1-d-stage2-30k-resultsfeat_g_f16_packed_roi.mdfeat_g_branch_state.md5a22770 (stage 1 struct), d01d6cf (stage 2 forward kernel), ba740a4 (stage 3a backward kernel)feat-g-f16-packed-takeup