v1.2: 尾轮重切分访存/计算Bound两级约束+dValue放宽定量依据

This commit is contained in:
2026-08-27 07:49:52 +00:00
parent ec65ac0d43
commit fcf6b58499

View File

@@ -6,7 +6,7 @@
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 类型区分重切策略。**
---
@@ -194,7 +194,7 @@ B 分组每组空闲 $C_g - mCnt \cdot nCnt$ 个核,总算力浪费 $C - B \cd
---
## 五、尾轮处理
## 五、尾轮处理与负载均衡
### 5.1 尾轮的定义
@@ -222,54 +222,58 @@ $$
$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
*重切约束的推导*沿 N $s$ 份后小块变为 $[\text{singleCoreM},\; \text{singleCoreN}/s]$。小块须满足两类约束——**但约束的严格程度取决于算子是访存 Bound 还是计算 Bound**。
$$
\text{dValue}_B^{tail} = \frac{\text{singleCoreN}}{s} \cdot dtype
$$
**访存 Bound$T_{MTE2} \ge T_{MMAD}$**搬移是瓶颈小块的 dValue 和搬移量不能降——否则搬移更慢总时延反而增加约束与主 tile 相同
A 矩阵搬移的 dValue 不受影响连续维为 K$\text{dValue}_A = k_{L1} \cdot dtype$ M 向切分无关
小块须满足三类约束
1. **dValue 下限**DMA 硬件突发效率$\text{dValue}_B^{tail} \ge 256\text{B}$
1. **dValue 下限**B 矩阵 dValue = $\text{singleCoreN}_{tail} \cdot dtype \ge 256\text{B}$沿 N 切时
$$
s \le \frac{\text{singleCoreN} \cdot dtype}{256\text{B}}
$$
2. **单次搬移量**带宽利用率保障B 矩阵单次搬移量 = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot dtype \ge min\_TileSize$推荐 16KB
2. **单次搬移量**$k_{L1} \cdot \text{singleCoreN}_{tail} \cdot dtype \ge min\_TileSize$
$$
s \le \frac{k_{L1} \cdot \text{singleCoreN} \cdot dtype}{min\_TileSize}
$$
3. **对齐**$\text{singleCoreN}_{tail} \ge 16$Cube 基本块 N 向粒度
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$ 不变
**计算 Bound$T_{MMAD} > T_{MTE2}$**搬移被计算掩盖dValue 和搬移量约束可放宽——即使搬移效率降低只要搬移时间仍 计算时间总时延不变放宽的定量依据
*最优切分因子*在不违反约束的前提下尽量让 $r \cdot s$ 接近 $C$
小块计算时延 $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
- 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$
- **访存 Bound**K dValue $s \le 2$搬移量 $s \le 4$对齐 $s \le 16$。$s^* = 2$——dValue 瓶颈16 核满载尾波减半总时延节省 25%。
- **计算 Bound**K $x_{min} \approx 1$$s^* = \min(4, 16) = 4$——32 核满载尾波降为 1/4总时延节省 37.5%。
$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 组合来优化)。