27. MergeBatch Cube 时延公式复核: 与建议公式一致(附证明), 字节列口径随#29统一 #27

Closed
opened 2026-09-04 08:17:33 +00:00 by admin · 1 comment
Owner

结论先行: 你给的公式与当前实现完全一致, 无计算错误; 但暴露了"字节列每核/芯片口径混用"问题, 一并在本轮 #29 统一。

推导

合并语义 (v0.98 §五): A'[b0M,K] @ B'[K,b0N] 作为单次 GEMM 计算, Cube 硬件算全网格 b0M x b0N(含交叉项, 冗余比例 (b0-1)/b0), 每核合并组数 = b_core/b0:

  • 每次合并计算的 flops = 2*(b0m)(b0*n)*k ← 与你的说法一致
  • 总 flops = (b_core/b0) * 2*(b0m)(b0*n)*k = b_core * b0 * 2MNK
  • 代码 merge_batch.py evaluate: flops_pc = b_core * b0 * 2.0 * m * n * k, t_mmad = flops_pc / Q16 —— 两者相等。

逐行证据 (result_recommend.csv, merge_demo_k_trunc: B=2048 M=N=32 K=256 bf16, b0=4, b_core=64)

每步 flops 2*(b0M)(b0N)K 2128128*256 = 8,388,608
步数 b_core/b0 16
你的公式合计 134,217,728
代码合计 64423232*256 = 134,217,728 ✓
CSV cube_flops 列 134,217,728 ✓
t_mmad = flops/Q16(15.1875T) 8.837us = CSV t_mmad ✓

但确实发现真问题 (随 #29 修)

  1. 字节类列的每核/芯片口径混用: MergeBatch/IterBatch 的 gm_read_bytes/cube_flops 等列记的是每核值 (如该行 gm=2.10MB), 而 ASW/StreamK 记的是整芯片值 → 逐行比对"GM 是否 >= 输入量"必然失真 (2.10MB vs 整 case 输入 67.1MB 的假象)。本轮统一为整芯片口径。
  2. 代码注释对"每步 flops/总步数"表述不够显式, 随本 issue 补充。
## 结论先行: 你给的公式与当前实现**完全一致**, 无计算错误; 但暴露了"字节列每核/芯片口径混用"问题, 一并在本轮 #29 统一。 ### 推导 合并语义 (v0.98 §五): A'[b0*M,K] @ B'[K,b0*N] 作为单次 GEMM 计算, Cube 硬件算**全网格 b0*M x b0*N**(含交叉项, 冗余比例 (b0-1)/b0), 每核合并组数 = b_core/b0: - 每次合并计算的 flops = 2*(b0*m)*(b0*n)*k ← 与你的说法一致 - 总 flops = (b_core/b0) * 2*(b0*m)*(b0*n)*k = **b_core * b0 * 2MNK** - 代码 `merge_batch.py` evaluate: `flops_pc = b_core * b0 * 2.0 * m * n * k`, `t_mmad = flops_pc / Q16` —— 两者相等。 ### 逐行证据 (result_recommend.csv, merge_demo_k_trunc: B=2048 M=N=32 K=256 bf16, b0=4, b_core=64) | 项 | 值 | |---|---| | 每步 flops 2*(b0M)(b0N)K | 2*128*128*256 = 8,388,608 | | 步数 b_core/b0 | 16 | | 你的公式合计 | 134,217,728 | | 代码合计 | 64*4*2*32*32*256 = 134,217,728 ✓ | | CSV cube_flops 列 | 134,217,728 ✓ | | t_mmad = flops/Q16(15.1875T) | 8.837us = CSV t_mmad ✓ | ### 但确实发现真问题 (随 #29 修) 1. **字节类列的每核/芯片口径混用**: MergeBatch/IterBatch 的 gm_read_bytes/cube_flops 等列记的是**每核值** (如该行 gm=2.10MB), 而 ASW/StreamK 记的是**整芯片值** → 逐行比对"GM 是否 >= 输入量"必然失真 (2.10MB vs 整 case 输入 67.1MB 的假象)。本轮统一为整芯片口径。 2. 代码注释对"每步 flops/总步数"表述不够显式, 随本 issue 补充。
Author
Owner

修复 commit: b9e07ed

复核结论: 公式与代码一致, 无需数值修改 (推导与 CSV 逐行证据见 issue 正文):

  • 每步 flops = 2*(b0M)(b0N)K, 步数 = b_core/b0, 总 = b_coreb02MNK —— 代码 evaluate 原式即此, t_mmad 与 CSV 列一致 (merge_demo_k_trunc: 134,217,728 flops -> 8.837us)。

落地:

  1. merge_batch.py 注释/公式显式化为"每步 2*(b0M)(b0N)K x b_core/b0 步" (含总式推导), 供后续审计;
  2. issue 揭示的字节列口径混用 (MergeBatch/IterBatch 记每核值) 已随 #29 统一为整芯片口径列 (该行 gm_read_bytes 2.10MB -> 67.11MB = V_in), cube_flops 列 = Bb02MNK (整芯片);
  3. 新增回归 test_issue27_merge_cube_flops_matches_formula / _gm_chip_col_equals_input。

若未来意图改为"只计算对角块" (冗余比例归零), 那是 v0.98 §五 合并语义的理论变更, 需另行裁决, 本 issue 不做此假设。

修复 commit: b9e07ed **复核结论: 公式与代码一致, 无需数值修改** (推导与 CSV 逐行证据见 issue 正文): - 每步 flops = 2*(b0M)(b0N)K, 步数 = b_core/b0, 总 = b_core*b0*2MNK —— 代码 evaluate 原式即此, t_mmad 与 CSV 列一致 (merge_demo_k_trunc: 134,217,728 flops -> 8.837us)。 落地: 1. merge_batch.py 注释/公式显式化为"每步 2*(b0M)(b0N)K x b_core/b0 步" (含总式推导), 供后续审计; 2. issue 揭示的字节列口径混用 (MergeBatch/IterBatch 记每核值) 已随 #29 统一为整芯片口径列 (该行 gm_read_bytes 2.10MB -> 67.11MB = V_in), cube_flops 列 = B*b0*2MNK (整芯片); 3. 新增回归 test_issue27_merge_cube_flops_matches_formula / _gm_chip_col_equals_input。 若未来意图改为"只计算对角块" (冗余比例归零), 那是 v0.98 §五 合并语义的理论变更, 需另行裁决, 本 issue 不做此假设。
admin closed this issue 2026-09-04 08:26:34 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/matmul-analysis#27
No description provided.