diff --git a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html index 190c2fd..26558f1 100644 --- a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html +++ b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html @@ -44,7 +44,7 @@ MathJax = {
目标芯片:昇腾 950PR(DAV_3510)。本文为 ASW_Basic 分支的独立分析,自包含完整推导链。v1.2 修正 dValue 定义与尾轮重切约束,新增与源码实现的对比分析。

摘要

ASW_Basic 是 BMM 的兜底分支——核间切 M/N(或混合切),不做 batch 合并或 K 维切分。本文给出完整的时延建模、核间分配策略分析(证明 B 优先分组在任何场景下都不优于线性映射)、实现方案的逐步推导,以及尾轮处理策略。

-

v1.2 新增 §七:与 [cann-ops-nn](https://gitcode.com/cann/ops-nn/tree/master/matmul/batch_mat_mul_v3) 源码实现的逐维度对比。核心结论:源码的 swizzle、核间分配、AL1 全载与理论高度一致;主要差距在降核模式未实现、IsCapable 无并行度校验、以及大量经验常数硬编码。

+

v1.2 修正:dValue 正确定义(ND 连续维字节数)、尾轮重切约束分访存 Bound/计算 Bound 两级(计算 Bound 下 dValue 可放宽)、§七源码对比。核心结论:源码的 swizzle、核间分配、AL1 全载与理论高度一致;主要差距在降核模式未实现、IsCapable 无并行度校验、尾轮未按 Bound 类型区分重切策略。


一、问题定义与执行模型

1.1 分支定位

@@ -170,7 +170,7 @@ $$

因此 ASW_Basic 采用 B→M→N 线性映射作为核间分配策略。


-

五、尾轮处理

+

五、尾轮处理与负载均衡

5.1 尾轮的定义

当 $B \cdot mCnt \cdot nCnt \;\%\; C \neq 0$ 时,总块数不能被 C 整除,最后一波(尾轮)不满载——只有 $B \cdot mCnt \cdot nCnt \;\%\; C$ 个核有活干,其余核空闲。

5.2 尾轮重切:是否值得?

@@ -186,45 +186,47 @@ $$ \frac{\Delta T_{saved}}{T_{total}} \approx \frac{1 - 1/s}{n_{wave}} $$

$n_{wave} = 2$、$s = C/r$ 时:$r=16$ → 收益 25%;$r=8$ → 收益 37.5%。$n_{wave} = 3$ 时:$r=16$ → 16.7%;$r=8$ → 25%。**$n_{wave} \le 3$ 时收益显著,应重切。**

-

*重切约束的推导*:沿 N 切 $s$ 份后,小块变为 $[\text{singleCoreM},\; \text{singleCoreN}/s]$。B 矩阵搬移的 dValue 受影响(ND 非转置时连续维为 N):

-
$$ -\text{dValue}_B^{tail} = \frac{\text{singleCoreN}}{s} \cdot dtype -$$
-

A 矩阵搬移的 dValue 不受影响(连续维为 K,$\text{dValue}_A = k_{L1} \cdot dtype$,与 M 向切分无关)。

-

小块须满足三类约束:

+

*重切约束的推导*:沿 N 切 $s$ 份后,小块变为 $[\text{singleCoreM},\; \text{singleCoreN}/s]$。小块须满足两类约束——但约束的严格程度取决于算子是访存 Bound 还是计算 Bound

+

**访存 Bound($T_{MTE2} \ge T_{MMAD}$)**:搬移是瓶颈,小块的 dValue 和搬移量不能降——否则搬移更慢,总时延反而增加。约束与主 tile 相同:

    -
  1. dValue 下限(DMA 硬件突发效率):$\text{dValue}_B^{tail} \ge 256\text{B}$:
  2. +
  3. dValue 下限:B 矩阵 dValue = $\text{singleCoreN}_{tail} \cdot dtype \ge 256\text{B}$(沿 N 切时):
$$ s \le \frac{\text{singleCoreN} \cdot dtype}{256\text{B}} $$
    -
  1. 单次搬移量(带宽利用率保障):B 矩阵单次搬移量 = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot dtype \ge min\_TileSize$(推荐 16KB):
  2. +
  3. 单次搬移量:$k_{L1} \cdot \text{singleCoreN}_{tail} \cdot dtype \ge min\_TileSize$:
$$ s \le \frac{k_{L1} \cdot \text{singleCoreN} \cdot dtype}{min\_TileSize} $$
    -
  1. 对齐:$\text{singleCoreN}_{tail} \ge 16$(Cube 基本块 N 向粒度):
  2. +
  3. 对齐:$\text{singleCoreN}_{tail} \ge 16$:
$$ s \le \frac{\text{singleCoreN}}{16} $$
-

沿 M 切时对称:B 矩阵 dValue 不受影响(连续维 N 未变),A 矩阵单次搬移量 $= \text{singleCoreM}_{tail} \cdot k_{L1} \cdot dtype \ge min\_TileSize$,对齐 $\text{singleCoreM}_{tail} \ge 16$。沿 M 切无 dValue 约束(A 矩阵 dValue = $k_{L1} \cdot dtype$ 不变)。

-

*最优切分因子*:在不违反约束的前提下尽量让 $r \cdot s$ 接近 $C$:

+

**计算 Bound($T_{MMAD} > T_{MTE2}$)**:搬移被计算掩盖,dValue 和搬移量约束可放宽——即使搬移效率降低,只要搬移时间仍 ≤ 计算时间,总时延不变。放宽的定量依据:

+

小块计算时延 $T_{comp}^{tail} = 2 \cdot \text{singleCoreM} \cdot \text{singleCoreN}_{tail} \cdot K / Q_{16}$,搬移时延 $T_{load}^{tail} = (\text{singleCoreM} + \text{singleCoreN}_{tail}) \cdot k_{L1} \cdot dtype / BW_{pc}$。搬移被掩盖的条件:

$$ -s^* = \min\Big(\Big\lfloor \frac{C}{r} \Big\rfloor,\; \frac{\text{singleCoreN} \cdot dtype}{256\text{B}},\; \frac{k_{L1} \cdot \text{singleCoreN} \cdot dtype}{min\_TileSize},\; \frac{\text{singleCoreN}}{16}\Big) +T_{load}^{tail} \le T_{comp}^{tail} \iff \text{singleCoreN}_{tail} \ge \frac{\text{singleCoreM} \cdot k_{L1} \cdot dtype \cdot Q_{16}}{BW_{pc} \cdot (2 \cdot \text{singleCoreM} \cdot K - k_{L1} \cdot dtype \cdot Q_{16} / BW_{pc})} +$$
+

记右端为 $x_{min}$(搬移掩盖下限),则计算 Bound 下的约束为:

+
$$ +s \le \min\Big(\frac{\text{singleCoreN}}{x_{min}},\; \frac{\text{singleCoreN}}{16}\Big) +$$
+

**计算 Bound 越严重(K 越大),$x_{min}$ 越小,$s$ 上限越大**——极端情况 $x_{min} \to 16$(对齐底线),$s \le \text{singleCoreN}/16$。

+

*例*(singleCoreM=singleCoreN=256、$k_{L1}$=128、K=1024、BF16):$x_{min} = 256 \times 128 \times 2 \times 15.2 \times 10^{12} / (50 \times 10^9 \times (2 \times 256 \times 1024 - 128 \times 2 \times 15.2 \times 10^{12} / 50 \times 10^9)) \approx 1$——几乎无约束,$s \le 256/16 = 16$。

+

*最优切分因子*:先判定 Bound 类型($T_{MMAD}$ vs $T_{MTE2}$),再选约束集:

+
$$ +s^* = \min\Big(\Big\lfloor \frac{C}{r} \Big\rfloor,\; s_{max}\Big),\qquad s_{max} = \begin{cases} \min\big(\frac{\text{singleCoreN} \cdot dtype}{256\text{B}},\; \frac{k_{L1} \cdot \text{singleCoreN} \cdot dtype}{min\_TileSize},\; \frac{\text{singleCoreN}}{16}\big) & \text{访存 Bound} \\ \frac{\text{singleCoreN}}{16} & \text{计算 Bound} \end{cases} $$

*例*(C=32、$N_{blk}=40$、$n_{wave}=2$、$r=8$、singleCoreM=singleCoreN=256、$k_{L1}$=128、BF16):

-

$s^* = \min(4, 2, 4, 16) = 2$——dValue 约束是瓶颈。尾轮 8 块沿 N 切 2 份 → 16 个小块(每块 [256, 128],dValue = 128×2 = 256B 恰好达标),16 核满载,尾波时延从 $T_{block}$ 降至 $T_{block}/2$。总时延节省 25%。

-

若 dValue 卡死导致 $r \cdot s^* < C/2$(重切后仍不满半),改沿 M 切(无 dValue 约束);M/N 都不可行时退化为不重切。

-

*切分方向选择*:优先沿 N 切(保持 A 行带完整,L2 中 A 数据不变);若 N 向 dValue 约束太紧,改沿 M 切(A 矩阵 dValue 不变,仅受搬移量和对齐约束)。

+

*切分方向选择*:优先沿 N 切(保持 A 行带完整,L2 中 A 数据不变)。计算 Bound 下若 N 向对齐卡住($\text{singleCoreN}/16 < C/r$),改沿 M 切(A 矩阵 dValue = $k_{L1} \cdot dtype$ 不变,仅受对齐约束 $\text{singleCoreM}/16$)。

结论:$n_{wave} \le 3$ 且 $r < C$ 时应重切尾轮——host 端零代价,NPU 端收益 $T_{block}(1-1/s^*)$。$n_{wave} \ge 4$ 时收益 < 25%,可不重切(通过选择使尾波占比小的 mCnt/nCnt 组合来优化)。

5.3 尾轮影响的量化

设总块数 $N_{blk} = B \cdot mCnt \cdot nCnt$,总波数 $n_{wave} = \lceil N_{blk} / C \rceil$,尾波块数 $r = N_{blk} \bmod C$($r = 0$ 时无尾波)。