From c3c9e803533773d97d9fddfd40e3c2c606f56731 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 26 Aug 2026 11:43:16 +0000 Subject: [PATCH] =?UTF-8?q?v1.0:=20=E5=90=8C=E6=AD=A5HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MergeBatch_vs_IterBatch分析_v1.0.html | 87 +++++++++++++++---- 1 file changed, 69 insertions(+), 18 deletions(-) diff --git a/BMM算子优化分析_Release/MergeBatch_vs_IterBatch分析_v1.0.html b/BMM算子优化分析_Release/MergeBatch_vs_IterBatch分析_v1.0.html index 36995fb..75d6c33 100644 --- a/BMM算子优化分析_Release/MergeBatch_vs_IterBatch分析_v1.0.html +++ b/BMM算子优化分析_Release/MergeBatch_vs_IterBatch分析_v1.0.html @@ -113,36 +113,87 @@ $$

若 $k_{L1}^* > 512B/dtype$,$k_{L1}$ 被 512B 截断,省出的 L1 空间可容纳更多 batch($b_{L1} > b_0$),提升 batch 间流水深度。


四、MergeBatch vs IterBatch 分界分析

-

4.1 核心差异:GM→L1 搬移粒度

-

从 kernel 侧源码可直接观察:

+

4.1 执行模型与符号定义

+

两分支的核间切分相同——B 维切分到 C 核,每核 $b_{core} = B/C$ 个 batch;核内不切 M/N。差异在核内 K 维处理和 GM→L1 搬移粒度:

-

每次 GM→L1 DMA 搬移有固定开销 $T_{cmd}$(描述符配置 + 地址生成 + 突发启动),与搬移数据量无关。MergeBatch 把 $b_0$ 次搬移合并为 1 次,$T_{cmd}$ 节省 $b_0$ 倍。

-

4.2 分情形分析

-

K 截断情形($k_{L1} = K$,整个 K 装入 L1 一块):

-

IterBatch 每 batch 一次 GM→L1 搬移;MergeBatch 每合并 batch 一次(覆盖 $b_0$ 个 batch),搬移次数少 $b_0$ 倍:

+

*符号表*:

+ + + + + + + + + + + + + +
符号含义表达式/取值
$C$AIC 核数32
$b_{core}$每核 batch 数$B/C$
$b_0$合并因子(单次合并的 batch 数)由 L0C + 算存比双上限确定
$k_{L1}$L1 级 K 分块粒度$\min(K,\; L1/(2(M{+}N) \cdot dtype))$
$n_K$K 分块数$\lceil K/k_{L1} \rceil$
$T_{load}$每 K 分块搬移时延$k_{L1}(M{+}N) \cdot dtype / BW_{pc}$
$T_{comp}$每 K 分块计算时延$2MN \cdot k_{L1} / Q_{16}$
$T_{write}$单 batch 输出写回时延$MN \cdot outB / W_{GM}$
$T_{cmd}$单次 GM→L1 DMA 搬移固定开销描述符配置 + 地址生成 + 突发启动
$BW_{pc}$单核 GM 带宽份额$W_{GM}/C = 50$ GB/s
$Q_{16}$单核 Cube BF16 峰值算力486/32 ≈ 15.2 TFLOPS
$W_{GM}$GM 带宽1.6 TB/s
$outB$输出元素字节数BF16 → 2B
+

4.2 端到端时延建模

+

L0C 双缓冲使 fixpipe 与 Cube 完全交叠,batch 边界无额外同步开销。两分支的差异仅来自 GM→L1 搬移次数和 drain 暴露。

+

IterBatch 时延(每核处理 $b_{core}$ 个 batch,每 batch $n_K$ 个 K 分块):

$$ -\Delta_K = \underbrace{(b_0-1)(T_{comp} + T_{write})}_{\text{drain 惩罚}} - \underbrace{b_{core}\Big(1-\frac{1}{b_0}\Big) T_{cmd}}_{\text{搬移命令节省}} +T_{iter} = \underbrace{b_{core} \cdot n_K \cdot (T_{load} + T_{cmd})}_{\text{搬移(逐 batch,每次含 } T_{cmd}\text{)}} + \underbrace{T_{comp} + T_{write}}_{\text{末 batch drain}} $$
-

L1 绑定情形($k_{L1} < K$,K 需分块):

-

MergeBatch 合并后 tile 更大 → $k_{L1}^m = k_{L1}/b_0$ → $n_K^m = b_0 \cdot n_K$。搬移次数相同($b_{core} \cdot n_K$),每次搬移量也相同——MergeBatch 无搬移优势,只剩 drain 惩罚:

+

MergeBatch 时延(每核处理 $b_{core}/b_0$ 个合并 batch,每合并 batch $n_K^m$ 个 K 分块):

$$ -\Delta_L = (b_0-1)(T_{comp} + T_{write}) > 0 +T_{mb} = \underbrace{\frac{b_{core}}{b_0} \cdot n_K^m \cdot (T_{load}^m + T_{cmd})}_{\text{搬移(合并,每次含 } T_{cmd}\text{)}} + \underbrace{b_0 \cdot (T_{comp} + T_{write})}_{\text{末合并 batch drain}} $$
-

L1 绑定情形 MergeBatch 恒劣于 IterBatch

-

4.3 统一分界条件

+

其中 $T_{load}^m$ 是合并后每 K 分块的搬移时延,$n_K^m$ 是合并后的 K 分块数——两者的取值取决于 $k_{L1}$ 是否截断(见下)。

+

合并后 K 分块粒度:MergeBatch 合并 $b_0$ 个 batch 后,L1 中的 tile 变为 $[b_0 M, k_{L1}^m] + [k_{L1}^m, b_0 N]$。L1 容量约束:

$$ -\text{MergeBatch 最优} \iff k_{L1} = K \;\land\; b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}} +2 \cdot k_{L1}^m \cdot b_0 \cdot (M+N) \cdot dtype \le L1 \Rightarrow k_{L1}^m = \min\Big(K,\; \frac{k_{L1}}{b_0}\Big) $$
-

即 MergeBatch 仅在 K 截断(小 M/N 使 $L1/(2(M+N) \cdot dtype) \ge K$)且 $b_{core}$ 足够大时才优于 IterBatch。

+ +

4.3 K 截断情形($k_{L1} = K$)

+

$n_K = n_K^m = 1$,$T_{load}^m = b_0 \cdot T_{load}$(合并后单次搬移数据量 $b_0$ 倍):

+
$$ +T_{iter} = b_{core}(T_{load} + T_{cmd}) + T_{comp} + T_{write} +$$
+
$$ +T_{mb} = \frac{b_{core}}{b_0}(b_0 \cdot T_{load} + T_{cmd}) + b_0(T_{comp} + T_{write}) +$$
+

两式相减:

+
$$ +\Delta_K = T_{mb} - T_{iter} = \underbrace{(b_0-1)(T_{comp} + T_{write})}_{\text{drain 惩罚}} - \underbrace{b_{core}\Big(1-\frac{1}{b_0}\Big) T_{cmd}}_{\text{搬移命令节省}} +$$
+

分界条件(MergeBatch 优于 IterBatch 当且仅当 $\Delta_K < 0$):

+
$$ +b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}} +$$
+

小 MN → $T_{comp}$ 小 → 惩罚小 → MergeBatch 更容易赢;大 B → $b_{core}$ 大 → 搬移节省多 → MergeBatch 更容易赢。

+

4.4 L1 绑定情形($k_{L1} < K$)

+

$k_{L1}^m = k_{L1}/b_0$,$n_K^m = b_0 \cdot n_K$,$T_{load}^m = T_{load}$(每块搬移量相同,因为 $k_{L1}^m \cdot b_0 = k_{L1}$):

+
$$ +T_{iter} = b_{core} \cdot n_K \cdot (T_{load} + T_{cmd}) + T_{comp} + T_{write} +$$
+
$$ +T_{mb} = \frac{b_{core}}{b_0} \cdot b_0 n_K \cdot (T_{load} + T_{cmd}) + b_0(T_{comp} + T_{write}) = b_{core} \cdot n_K \cdot (T_{load} + T_{cmd}) + b_0(T_{comp} + T_{write}) +$$
+

搬移次数相同($b_{core} \cdot n_K$),每次搬移量相同——MergeBatch 无搬移优势

+
$$ +\Delta_L = T_{mb} - T_{iter} = (b_0-1)(T_{comp} + T_{write}) > 0 +$$
+

L1 绑定情形 MergeBatch 恒劣于 IterBatch——合并只放大了 drain 暴露,没有换来搬移命令节省。

+

4.5 统一分界条件

+
$$ +\text{MergeBatch 最优} \iff \underbrace{k_{L1} = K}_{\text{K 截断}} \;\land\; \underbrace{b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}}}_{\text{搬移节省} > \text{drain 惩罚}} +$$
+

K 截断的物理含义:$L1/(2(M{+}N) \cdot dtype) \ge K$——小 M/N 使 L1 一次装下整个 K 维。

- +
维度IterBatchMergeBatch差异
稳态搬移吞吐相同相同总搬移量相同
GM→L1 搬移命令数$b_{core}$ 次$b_{core}/b_0$ 次**MergeBatch 少 $b_0$ 倍** ← 核心优势
GM→L1 搬移命令数$b_{core}$ 次$b_{core}/b_0$ 次(K 截断时)**MergeBatch 少 $b_0$ 倍** ← 核心优势
drain 暴露$T_{comp} + T_{write}$$b_0(T_{comp} + T_{write})$IterBatch 少 $b_0$ 倍 ← 核心劣势
L0C 利用率访存 Bound 下不影响时延
-

4.4 $T_{cmd}$ 的物理成因

+

4.6 $T_{cmd}$ 的物理成因

每次 GM→L1 DMA 搬移的固定开销包括:Nd2Nz 描述符配置(ndNum/nValue/dValue/srcStride 等 7 个字段写入 DMA 寄存器)、地址生成与突发启动、与 L1 buffer 的同步握手(SetFlag<MTE2_MTE1> / WaitFlag<MTE1_MTE2>)。量级估计为数十 ns,精确值需实测标定。


五、与源码实现的对比