MergeBatch 合并搬移效率收益建模 (tile=nValue*dValue*dt 放大 b0 倍) + t_cmd_ns 置 0 #36

Closed
opened 2026-09-07 12:48:11 +00:00 by admin · 1 comment
Owner

用户物理澄清 (建模依据)

MergeBatch 与 IterBatch 的本质区别不只是 DMA 命令数 (T_cmd): MergeBatch 把多个 batch 的左/右矩阵合并一起搬移和计算, 使单块 tile (= nValue × dValue × input_dtype) 放大 b0 倍, 搬移效率更高 —— 即便 T_cmd=0 也有收益

合并堆叠方向视转置/排布而定, 例: 左矩阵 A 为 ND 排布且不转置时, dValue 对应 K 维 (连续), nValue 对应 M 维; 各 batch 的 A 在 M 维 (nValue) 上堆叠合并 -> 单块 tile = (b0·M) × (k_l1·dt) 放大 b0 倍。B 矩阵 ND 非转置 ([K,N], N 连续) 时合并沿 N (dValue 维) 堆叠。两侧乘积口径一致: A 侧 tile = b0·M·k_l1^m·dt, B 侧 tile = b0·N·k_l1^m·dt。

现状缺陷

当前模型两分支 GM→L1 数据时延都按 V_in/BW_gm 满带宽计, 差异只有 T_cmd 项 —— 合并的搬移效率收益完全未建模; T_cmd 又是未标定估计值 (50ns), 以此为主要收益依据不牢靠。

改动方案

  1. 搬移效率模型 (models.move_eff): 单命令 tile 越大有效带宽越高, eff(tile) = min(1, tile / min_TileSize), 达 16KB (min_TileSize, 即进入条件 4 的效率下限常数) 饱和, 之下线性退化。GM→L1 数据时延按 A/B 两侧字节加权: t_data = (V_A/eff_A + V_B/eff_B) / BW_gm; GM 字节量不变 (仍 = V_in, 效率只影响时间列)。
  2. IterBatch 四形态单命令 tile 口径: a/b 形态双侧全 K (tile_A=M·K·dt, tile_B=K·N·dt); c 形态驻留侧全 K + 对侧 k_l1 分块; d 形态双侧 k_l1 分块。l1_form 返回值补驻留侧信息。
  3. MergeBatch: 合并 tile = b0 倍 (A': b0·M·k_l1^m·dt; B': b0·N·k_l1^m·dt), 小 M/N case 下效率差显著 (如 M=1: IterBatch A tile=1KB eff=1/16 vs 合并 1.9KB eff=0.12)。
  4. beats_iterbatch 净收益泛化: 命令节省 (cmds 差 × T_cmd) + 效率节省 (t_data 差) − drain 惩罚; T_cmd=0 时效率项仍在, 合并凭效率胜出 —— 与用户澄清一致。K 截断且 T_cmd>0 时仍退化为 v1.1 §4.5 闭式。
  5. t_cmd_ns 默认 50 -> 0 (未标定按 0; 命令固定开销不再作为收益来源); router 退役 "T_cmd<=0 策略优先 MergeBatch" 覆盖逻辑 —— 效率已建模, 时延模型统一终审, 分界条件作交叉验证。
  6. 作用域说明: 效率模型只接入切B 两分支 (IterBatch/MergeBatch, 逐命令 tile 小、效率差显著); ASW/StreamK 单命令 tile 通常 ≥ 数百 KB 已饱和 (极端小 tile 形状已有"效率降级"标注通道), 文档注明。
  7. demo 调整: merge_demo_k_trunc 原形状 (2048,32,32,256) 在 t_cmd=0 下 IterBatch 单侧 tile 已达 16KB 饱和、合并无效率差 -> 转 IterBatch (物理正确); demo 形状改为 (2048,16,64,128) 保持 MergeBatch 胜出演示 (iter A tile 4KB eff=0.25 vs 合并 16KB eff=1.0, 且仍 K 截断)。

影响面

  • 切B 两分支 t_mte2_gm (效率加权) 与仲裁; 字节列不变; ASW/StreamK/特殊/转Matmul 不动;
  • 测试: TestIssue35 路由家族期望随 t_cmd=0+效率模型更新 (小 M 端 MergeBatch 胜出区扩大); TestZeroCmdHandling 语义重写 (默认即 t_cmd=0); 新增 TestIssue36;
  • docs/01_MergeBatch、02_IterBatch、05、README 同步。
## 用户物理澄清 (建模依据) MergeBatch 与 IterBatch 的本质区别不只是 DMA 命令数 (T_cmd): **MergeBatch 把多个 batch 的左/右矩阵合并一起搬移和计算**, 使单块 tile (= nValue × dValue × input_dtype) 放大 b0 倍, 搬移效率更高 —— **即便 T_cmd=0 也有收益**。 合并堆叠方向视转置/排布而定, 例: 左矩阵 A 为 ND 排布且不转置时, dValue 对应 K 维 (连续), nValue 对应 M 维; 各 batch 的 A 在 M 维 (nValue) 上堆叠合并 -> 单块 tile = (b0·M) × (k_l1·dt) 放大 b0 倍。B 矩阵 ND 非转置 ([K,N], N 连续) 时合并沿 N (dValue 维) 堆叠。两侧乘积口径一致: A 侧 tile = b0·M·k_l1^m·dt, B 侧 tile = b0·N·k_l1^m·dt。 ## 现状缺陷 当前模型两分支 GM→L1 数据时延都按 V_in/BW_gm 满带宽计, 差异只有 T_cmd 项 —— 合并的搬移效率收益完全未建模; T_cmd 又是未标定估计值 (50ns), 以此为主要收益依据不牢靠。 ## 改动方案 1. **搬移效率模型** (models.move_eff): 单命令 tile 越大有效带宽越高, eff(tile) = min(1, tile / min_TileSize), 达 16KB (min_TileSize, 即进入条件 4 的效率下限常数) 饱和, 之下线性退化。GM→L1 数据时延按 A/B 两侧字节加权: t_data = (V_A/eff_A + V_B/eff_B) / BW_gm; **GM 字节量不变** (仍 = V_in, 效率只影响时间列)。 2. **IterBatch 四形态单命令 tile 口径**: a/b 形态双侧全 K (tile_A=M·K·dt, tile_B=K·N·dt); c 形态驻留侧全 K + 对侧 k_l1 分块; d 形态双侧 k_l1 分块。l1_form 返回值补驻留侧信息。 3. **MergeBatch**: 合并 tile = b0 倍 (A': b0·M·k_l1^m·dt; B': b0·N·k_l1^m·dt), 小 M/N case 下效率差显著 (如 M=1: IterBatch A tile=1KB eff=1/16 vs 合并 1.9KB eff=0.12)。 4. **beats_iterbatch 净收益泛化**: 命令节省 (cmds 差 × T_cmd) + **效率节省 (t_data 差)** − drain 惩罚; T_cmd=0 时效率项仍在, 合并凭效率胜出 —— 与用户澄清一致。K 截断且 T_cmd>0 时仍退化为 v1.1 §4.5 闭式。 5. **t_cmd_ns 默认 50 -> 0** (未标定按 0; 命令固定开销不再作为收益来源); router 退役 "T_cmd<=0 策略优先 MergeBatch" 覆盖逻辑 —— 效率已建模, 时延模型统一终审, 分界条件作交叉验证。 6. **作用域说明**: 效率模型只接入切B 两分支 (IterBatch/MergeBatch, 逐命令 tile 小、效率差显著); ASW/StreamK 单命令 tile 通常 ≥ 数百 KB 已饱和 (极端小 tile 形状已有"效率降级"标注通道), 文档注明。 7. **demo 调整**: merge_demo_k_trunc 原形状 (2048,32,32,256) 在 t_cmd=0 下 IterBatch 单侧 tile 已达 16KB 饱和、合并无效率差 -> 转 IterBatch (物理正确); demo 形状改为 (2048,16,64,128) 保持 MergeBatch 胜出演示 (iter A tile 4KB eff=0.25 vs 合并 16KB eff=1.0, 且仍 K 截断)。 ## 影响面 - 切B 两分支 t_mte2_gm (效率加权) 与仲裁; 字节列不变; ASW/StreamK/特殊/转Matmul 不动; - 测试: TestIssue35 路由家族期望随 t_cmd=0+效率模型更新 (小 M 端 MergeBatch 胜出区扩大); TestZeroCmdHandling 语义重写 (默认即 t_cmd=0); 新增 TestIssue36; - docs/01_MergeBatch、02_IterBatch、05、README 同步。
admin closed this issue 2026-09-07 13:09:51 +00:00
Author
Owner

已实现, commit b0b48b9 已推送 main。

落地内容

  1. 搬移效率模型 (models.move_eff / gm_move_time): eff(tile) = min(1, tile/min_TileSize), 单命令 tile = nValue×dValue×input_dtype 达 16KB (进入条件 4 的效率下限常数) 饱和, 之下线性退化。GM→L1 数据时延按 A/B 两侧字节加权 t = (V_A/eff_A + V_B/eff_B)/W_gm; GM 字节量不变 (仍 = V_in, issue#31 口径由 TestIssue36 锁死)。
  2. IterBatch: l1_form 补驻留侧返回; move_tiles 分侧口径 (a/b 双侧整 K; c 驻留侧整 K + 对侧 k_l1 分块; d 双侧 k_l1 分块), evaluate 接入效率加权。
  3. MergeBatch: 合并 tile 放大 b0 倍 (A' = b0·M·k_l1^m·dt, B' = b0·N·k_l1^m·dt; 堆叠方向视转置/排布, 乘积不变) 接入效率加权 —— 用户澄清的"T_cmd=0 也有收益"由此刻画。
  4. beats_iterbatch 净收益泛化: 命令节省(cmds 差×T_cmd) + 效率节省(t_data 差) − drain 惩罚; K 截断且效率打平且 T_cmd>0 时严格退化为 v1.1 §4.5 闭式; T_cmd≤0 特判分支删除 (效率项使该路径自然成立)。
  5. t_cmd_ns: 50 → 0 (未标定按 0); router 退役 "T_cmd≤0 策略优先 MergeBatch" 覆盖 —— 效率已建模, 时延模型统一终审, 分界条件作交叉验证 (现已全家族一致)。
  6. demo 调整: merge_demo_k_trunc 形状 (2048,32,32,256) → (2048,16,64,128)。原形状 IterBatch 单命令 tile 已达 16KB 饱和、合并无效率差, t_cmd=0 下转 IterBatch (物理正确但失去演示意义); 新形状 iter A tile=4KB eff=0.25 vs 合并 16KB eff=1.0, 效率节省 15.7us ≫ drain 0.17us, 保持 MergeBatch 胜出演示且仍 K 截断 (b0=4, k_l1=128=K)。

用户 case 家族最终行为 (B=128, N=128, K=512, bf16, t_cmd=0)

M iter A tile / eff 合并 A' tile / eff 效率节省 drain 惩罚 路由 (分界+时延一致)
1 1KB / 1/16 1.9KB / 0.12 0.61us 0.04us MergeBatch
2 2KB / 1/8 3.8KB / 0.23 0.61us 0.08us MergeBatch
4 4KB / 1/4 7.7KB / 0.47 0.61us 0.17us MergeBatch
8 8KB / 1/2 15.4KB / 0.94 0.61us 0.33us MergeBatch
16 16KB / 1.0 (饱和) 28.7KB / 1.0 0 0.66us IterBatch

语义: iter A 侧 tile 随 M 线性增长, m=16 恰达 16KB 饱和点, 效率差归零后 drain 惩罚决定胜负 —— 交叉点物理自洽。

验证

  • unittest 74/74 (新增 TestIssue36 5 例: t_cmd 默认 0/效率曲线/效率差胜出/GM 字节不变/小 tile 时延差; TestArbitration 与 TestZeroCmdHandling 按新语义重写; TestIssue35 家族期望更新为 m≤8 MergeBatch);
  • examples 重生成可复现 0 diff; 影响面: merge_demo_k_trunc (形状调整) + 6 个切B case 时延更新 (小 tile IterBatch 变严、T_cmd 项归零), 无意外分支翻转;
  • 压力回归 seed7/6000 + seed2024/4000 = 10000 例: 0 崩溃/0 NaN/0 违规/0 不可行/0 GM<V_in, 七分支覆盖 (MergeBatch 386 例);
  • 文档同步: 01_MergeBatch §4/§5 (效率模型+泛化净收益式)、02_IterBatch 口径注、00_总纲胜出条件、01_软件架构 T_cmd 标定说明、05 时间列效率口径注、README 时延模型要点。
已实现, commit b0b48b9 已推送 main。 ## 落地内容 1. **搬移效率模型** (`models.move_eff` / `gm_move_time`): eff(tile) = min(1, tile/min_TileSize), 单命令 tile = nValue×dValue×input_dtype 达 16KB (进入条件 4 的效率下限常数) 饱和, 之下线性退化。GM→L1 数据时延按 A/B 两侧字节加权 t = (V_A/eff_A + V_B/eff_B)/W_gm; **GM 字节量不变** (仍 = V_in, issue#31 口径由 TestIssue36 锁死)。 2. **IterBatch**: l1_form 补驻留侧返回; move_tiles 分侧口径 (a/b 双侧整 K; c 驻留侧整 K + 对侧 k_l1 分块; d 双侧 k_l1 分块), evaluate 接入效率加权。 3. **MergeBatch**: 合并 tile 放大 b0 倍 (A' = b0·M·k_l1^m·dt, B' = b0·N·k_l1^m·dt; 堆叠方向视转置/排布, 乘积不变) 接入效率加权 —— 用户澄清的"T_cmd=0 也有收益"由此刻画。 4. **beats_iterbatch 净收益泛化**: 命令节省(cmds 差×T_cmd) + 效率节省(t_data 差) − drain 惩罚; K 截断且效率打平且 T_cmd>0 时严格退化为 v1.1 §4.5 闭式; T_cmd≤0 特判分支删除 (效率项使该路径自然成立)。 5. **t_cmd_ns: 50 → 0** (未标定按 0); **router 退役 "T_cmd≤0 策略优先 MergeBatch" 覆盖** —— 效率已建模, 时延模型统一终审, 分界条件作交叉验证 (现已全家族一致)。 6. **demo 调整**: merge_demo_k_trunc 形状 (2048,32,32,256) → (2048,16,64,128)。原形状 IterBatch 单命令 tile 已达 16KB 饱和、合并无效率差, t_cmd=0 下转 IterBatch (物理正确但失去演示意义); 新形状 iter A tile=4KB eff=0.25 vs 合并 16KB eff=1.0, 效率节省 15.7us ≫ drain 0.17us, 保持 MergeBatch 胜出演示且仍 K 截断 (b0=4, k_l1=128=K)。 ## 用户 case 家族最终行为 (B=128, N=128, K=512, bf16, t_cmd=0) | M | iter A tile / eff | 合并 A' tile / eff | 效率节省 | drain 惩罚 | 路由 (分界+时延一致) | |---|---|---|---|---|---| | 1 | 1KB / 1/16 | 1.9KB / 0.12 | 0.61us | 0.04us | **MergeBatch** | | 2 | 2KB / 1/8 | 3.8KB / 0.23 | 0.61us | 0.08us | **MergeBatch** | | 4 | 4KB / 1/4 | 7.7KB / 0.47 | 0.61us | 0.17us | **MergeBatch** | | 8 | 8KB / 1/2 | 15.4KB / 0.94 | 0.61us | 0.33us | **MergeBatch** | | 16 | 16KB / 1.0 (饱和) | 28.7KB / 1.0 | 0 | 0.66us | IterBatch | 语义: iter A 侧 tile 随 M 线性增长, m=16 恰达 16KB 饱和点, 效率差归零后 drain 惩罚决定胜负 —— 交叉点物理自洽。 ## 验证 - unittest 74/74 (新增 TestIssue36 5 例: t_cmd 默认 0/效率曲线/效率差胜出/GM 字节不变/小 tile 时延差; TestArbitration 与 TestZeroCmdHandling 按新语义重写; TestIssue35 家族期望更新为 m≤8 MergeBatch); - examples 重生成可复现 0 diff; 影响面: merge_demo_k_trunc (形状调整) + 6 个切B case 时延更新 (小 tile IterBatch 变严、T_cmd 项归零), 无意外分支翻转; - 压力回归 seed7/6000 + seed2024/4000 = 10000 例: 0 崩溃/0 NaN/0 违规/0 不可行/0 GM<V_in, 七分支覆盖 (MergeBatch 386 例); - 文档同步: 01_MergeBatch §4/§5 (效率模型+泛化净收益式)、02_IterBatch 口径注、00_总纲胜出条件、01_软件架构 T_cmd 标定说明、05 时间列效率口径注、README 时延模型要点。
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#36
No description provided.