v1.2: 修正dValue定义(ND连续维非乘积)+重切约束推导+自包含搬移效率解释

This commit is contained in:
2026-08-27 07:07:17 +00:00
parent 0182224a18
commit 68dbdcd3d4

View File

@@ -1,6 +1,6 @@
# ASW_Basic 分支BMM 兜底分支的理论最优实现分析
> 目标芯片:昇腾 950PRDAV_3510。本文从《BMM 算子优化分析 v0.98》第八章抽出独立成篇自包含完整推导链。v1.2 新增与源码实现的对比分析。
> 目标芯片:昇腾 950PRDAV_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
GML1 搬移使用 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非转置时连续维为 NdValue = $\text{singleCoreN} \cdot dtype$转置时连续维为 KdValue = $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 同一标准GML1 搬移 B 矩阵时dValue = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot \text{dtype}$。v0.98 §六约束 3 要求 dValue min_TileSize推荐 16KB带宽利用率保障硬件最低要求 dValue 256BDMA 突发下限)。两级阈值
*重切约束的推导*沿 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 替换 singleCoreNdValue 约束作用于 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 边界对齐)。