From 68dbdcd3d4f17778bef854541e04116d59442cb1 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 27 Aug 2026 07:07:17 +0000 Subject: [PATCH] =?UTF-8?q?v1.2:=20=E4=BF=AE=E6=AD=A3dValue=E5=AE=9A?= =?UTF-8?q?=E4=B9=89(ND=E8=BF=9E=E7=BB=AD=E7=BB=B4=E9=9D=9E=E4=B9=98?= =?UTF-8?q?=E7=A7=AF)+=E9=87=8D=E5=88=87=E7=BA=A6=E6=9D=9F=E6=8E=A8?= =?UTF-8?q?=E5=AF=BC+=E8=87=AA=E5=8C=85=E5=90=AB=E6=90=AC=E7=A7=BB?= =?UTF-8?q?=E6=95=88=E7=8E=87=E8=A7=A3=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ASW_Basic分支分析_v1.2.md | 70 +++++++++++++++---- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.md b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.md index 1d64921..023b522 100644 --- a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.md +++ b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.2.md @@ -1,6 +1,6 @@ # ASW_Basic 分支:BMM 兜底分支的理论最优实现分析 -> 目标芯片:昇腾 950PR(DAV_3510)。本文从《BMM 算子优化分析 v0.98》第八章抽出独立成篇,自包含完整推导链。v1.2 新增与源码实现的对比分析。 +> 目标芯片:昇腾 950PR(DAV_3510)。本文为 ASW_Basic 分支的独立分析,自包含完整推导链。v1.2 修正 dValue 定义与尾轮重切约束,新增与源码实现的对比分析。 ## 摘要 @@ -65,6 +65,23 @@ GM ──MTE2──> L1 ──MTE1──> L0A/L0B ──MMAD──> L0C ──Fi 层次关系:$K = \text{singleCoreK} \ge k_{L1} \ge baseK$,$\text{singleCoreM} \ge \text{BaseM}$,$\text{singleCoreN} \ge \text{BaseN}$。 +### 1.4 GM→L1 搬移效率:dValue 与 min_TileSize + +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 不是两个维度的乘积**。 + +两级搬移效率阈值: + +1. **dValue ≥ 256B**(DMA 硬件突发下限):每行连续数据量不足 256B 时,DMA 突发效率急剧下降; +2. **总搬移量 ≥ min_TileSize**(推荐 16KB):单次搬移量太小则带宽利用率不足([昇腾 950 NPU 架构白皮书](https://public-download.obs.cn-east-2.myhuaweicloud.com/ascend/%E6%98%87%E8%85%BE950%20NPU%E6%9E%B6%E6%9E%84%E7%99%BD%E7%9A%AE%E4%B9%A6.pdf)推荐 dValue 256B/512B 对齐)。 + --- ## 二、进入条件 @@ -205,33 +222,54 @@ $$ $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$。小块仍须满足两类约束: - -1. **搬移效率**(与主 tile 同一标准):GM→L1 搬移 B 矩阵时,dValue = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot \text{dtype}$。v0.98 §六约束 3 要求 dValue ≥ min_TileSize(推荐 16KB,带宽利用率保障);硬件最低要求 dValue ≥ 256B(DMA 突发下限)。两级阈值: +*重切约束的推导*:沿 N 切 $s$ 份后,小块变为 $[\text{singleCoreM},\; \text{singleCoreN}/s]$。B 矩阵搬移的 dValue 受影响(ND 非转置时连续维为 N): $$ -s \le \frac{k_{L1} \cdot \text{singleCoreN} \cdot \text{dtype}}{min\_TileSize} \quad (\text{推荐}),\qquad s \le \frac{k_{L1} \cdot \text{singleCoreN} \cdot \text{dtype}}{256\text{B}} \quad (\text{硬件底线}) +\text{dValue}_B^{tail} = \frac{\text{singleCoreN}}{s} \cdot dtype $$ -2. **对齐**:$\text{singleCoreN}_{tail} \ge 16$(Cube 基本块 N 向粒度): +A 矩阵搬移的 dValue 不受影响(连续维为 K,$\text{dValue}_A = k_{L1} \cdot dtype$,与 M 向切分无关)。 + +小块须满足三类约束: + +1. **dValue 下限**(DMA 硬件突发效率):$\text{dValue}_B^{tail} \ge 256\text{B}$: + +$$ +s \le \frac{\text{singleCoreN} \cdot dtype}{256\text{B}} +$$ + +2. **单次搬移量**(带宽利用率保障):B 矩阵单次搬移量 = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot dtype \ge min\_TileSize$(推荐 16KB): + +$$ +s \le \frac{k_{L1} \cdot \text{singleCoreN} \cdot dtype}{min\_TileSize} +$$ + +3. **对齐**:$\text{singleCoreN}_{tail} \ge 16$(Cube 基本块 N 向粒度): $$ s \le \frac{\text{singleCoreN}}{16} $$ -沿 M 切时对称(singleCoreM 替换 singleCoreN,dValue 约束作用于 A 矩阵的 $\text{singleCoreM}_{tail} \cdot k_{L1} \cdot \text{dtype}$)。 +沿 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$。优先用推荐阈值(min_TileSize),若 $s$ 太小导致 $r \cdot s \ll C$(重切收益不明显),退而用硬件底线(256B): +*最优切分因子*:在不违反约束的前提下尽量让 $r \cdot s$ 接近 $C$: $$ -s^* = \min\Big(\Big\lfloor \frac{C}{r} \Big\rfloor,\; \frac{k_{L1} \cdot \text{singleCoreN} \cdot \text{dtype}}{min\_TileSize},\; \frac{\text{singleCoreN}}{16}\Big) +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) $$ -若 $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): -*例*(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%。 +- dValue:$s \le 256 \times 2 / 256 = 2$ +- 搬移量:$s \le 128 \times 256 \times 2 / 16384 = 4$ +- 对齐:$s \le 256/16 = 16$ +- 核数:$\lfloor 32/8 \rfloor = 4$ -*切分方向选择*:优先沿 N 切(保持 A 行带完整,L2 中 A 数据不变);若 N 向约束不满足($s^*$ 被 min_TileSize 或对齐卡住),改沿 M 切。M/N 都不可行时退化为不重切。 +$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 组合来优化)。 @@ -328,10 +366,14 @@ $$ 2 \cdot (\text{singleCoreM} + \text{singleCoreN}) \cdot k_{L1} \cdot \text{dtype} \le L1,\qquad k_{L1} \cdot \text{dtype} \ge 256\text{B} $$ -**约束 3——搬移效率**: +**约束 3——搬移效率**(dValue 见 §1.4): $$ -\text{singleCoreM} \cdot k_{L1} \cdot \text{dtype} \ge min\_TileSize,\qquad k_{L1} \cdot \text{singleCoreN} \cdot \text{dtype} \ge min\_TileSize +\underbrace{k_{L1} \cdot \text{dtype} \ge 256\text{B}}_{\text{A 矩阵 dValue}},\qquad \underbrace{\text{singleCoreN} \cdot \text{dtype} \ge 256\text{B}}_{\text{B 矩阵 dValue(非转置)}} +$$ + +$$ +\underbrace{\text{singleCoreM} \cdot k_{L1} \cdot \text{dtype} \ge min\_TileSize}_{\text{A 单次搬移量}},\qquad \underbrace{k_{L1} \cdot \text{singleCoreN} \cdot \text{dtype} \ge min\_TileSize}_{\text{B 单次搬移量}} $$ **约束 4——SingleCoreM/N 是 BaseM/N 的整数倍**(工程实现要求,保证 L0 tile 边界对齐)。