diff --git a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html index ebf3464..190c2fd 100644 --- a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html +++ b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.html @@ -41,7 +41,7 @@ MathJax = {
目标芯片:昇腾 950PR(DAV_3510)。本文从《BMM 算子优化分析 v0.98》第八章抽出独立成篇,自包含完整推导链。v1.2 新增与源码实现的对比分析。+
目标芯片:昇腾 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 无并行度校验、以及大量经验常数硬编码。
@@ -82,6 +82,18 @@ MathJax = {层次关系:$K = \text{singleCoreK} \ge k_{L1} \ge baseK$,$\text{singleCoreM} \ge \text{BaseM}$,$\text{singleCoreN} \ge \text{BaseN}$。
+GM→L1 搬移使用 Nd2Nz DMA,每次搬移的关键参数:
+| 参数 | 含义 | A 矩阵 [singleCoreM, $k_{L1}$] | B 矩阵 [$k_{L1}$, singleCoreN] |
|---|---|---|---|
| nValue | 行数(非连续维) | singleCoreM | $k_{L1}$ |
| dValue | 每行连续字节数(连续维) | $k_{L1} \cdot dtype$ | $\text{singleCoreN} \cdot dtype$ |
| 总搬移量 | nValue × dValue | $\text{singleCoreM} \cdot k_{L1} \cdot dtype$ | $k_{L1} \cdot \text{singleCoreN} \cdot dtype$ |
dValue 是 ND 排布中连续维的字节数——对 ND 格式的右矩阵 B:非转置时连续维为 N,dValue = $\text{singleCoreN} \cdot dtype$;转置时连续维为 K,dValue = $k_{L1} \cdot dtype$。dValue 不是两个维度的乘积。
+两级搬移效率阈值:
+同时满足:
@@ -174,12 +186,23 @@ $$$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$ 份后,小块的 N 维度变为 $\text{singleCoreN}_{tail} = \text{singleCoreN}/s$。小块仍须满足两类约束:
+*重切约束的推导*:沿 N 切 $s$ 份后,小块变为 $[\text{singleCoreM},\; \text{singleCoreN}/s]$。B 矩阵搬移的 dValue 受影响(ND 非转置时连续维为 N):
+A 矩阵搬移的 dValue 不受影响(连续维为 K,$\text{dValue}_A = k_{L1} \cdot dtype$,与 M 向切分无关)。
+小块须满足三类约束:
沿 M 切时对称(singleCoreM 替换 singleCoreN,dValue 约束作用于 A 矩阵的 $\text{singleCoreM}_{tail} \cdot k_{L1} \cdot \text{dtype}$)。
-*最优切分因子*:在不违反上述约束的前提下尽量让 $r \cdot s$ 接近 $C$。优先用推荐阈值(min_TileSize),若 $s$ 太小导致 $r \cdot s \ll C$(重切收益不明显),退而用硬件底线(256B):
+沿 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$:
若 $r \cdot s^* < C/2$(重切后仍不满半),改用硬件底线重算 $s^*$;若仍 $< C/2$,退化为不重切。
-*例*(C=32、$N_{blk}=40$、$n_{wave}=2$、$r=8$、singleCoreM=singleCoreN=256、$k_{L1}$=128、BF16):推荐阈值 $s \le 128 \times 256 \times 2 / 16384 = 4$;对齐 $s \le 256/16 = 16$;$\lfloor C/r \rfloor = 4$。$s^* = \min(4, 4, 16) = 4$。尾轮 8 块沿 N 切 4 份 → 32 个小块(每块 [256, 64]),32 核满载,尾波时延从 $T_{block}$ 降至 $T_{block}/4$。总时延节省 37.5%。
-*切分方向选择*:优先沿 N 切(保持 A 行带完整,L2 中 A 数据不变);若 N 向约束不满足($s^*$ 被 min_TileSize 或对齐卡住),改沿 M 切。M/N 都不可行时退化为不重切。
+*例*(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_{wave} \le 3$ 且 $r < C$ 时应重切尾轮——host 端零代价,NPU 端收益 $T_{block}(1-1/s^*)$。$n_{wave} \ge 4$ 时收益 < 25%,可不重切(通过选择使尾波占比小的 mCnt/nCnt 组合来优化)。
设总块数 $N_{blk} = B \cdot mCnt \cdot nCnt$,总波数 $n_{wave} = \lceil N_{blk} / C \rceil$,尾波块数 $r = N_{blk} \bmod C$($r = 0$ 时无尾波)。
@@ -256,9 +286,12 @@ $$约束 3——搬移效率:
+约束 3——搬移效率(dValue 见 §1.4):
约束 4——SingleCoreM/N 是 BaseM/N 的整数倍(工程实现要求,保证 L0 tile 边界对齐)。
*选取策略*:在满足约束 1 的前提下,SingleCoreM/N 尽量大(搬移效率和 L2 复用最大化)。长宽比跟随 M/N($\text{singleCoreM}/\text{singleCoreN} \approx M/N$),对齐到 BaseM/BaseN 的整数倍。