v1.2: 同步HTML

This commit is contained in:
2026-08-27 07:07:25 +00:00
parent 68dbdcd3d4
commit ec65ac0d43

View File

@@ -41,7 +41,7 @@ MathJax = {
<body>
<div class="page">
<h1>ASW_Basic 分支BMM 兜底分支的理论最优实现分析</h1>
<blockquote>目标芯片:昇腾 950PRDAV_3510。本文从《BMM 算子优化分析 v0.98》第八章抽出独立成篇自包含完整推导链。v1.2 新增与源码实现的对比分析。</blockquote>
<blockquote>目标芯片:昇腾 950PRDAV_3510。本文为 ASW_Basic 分支的独立分析自包含完整推导链。v1.2 修正 dValue 定义与尾轮重切约束,新增与源码实现的对比分析。</blockquote>
<h2>摘要</h2>
<p>ASW_Basic 是 BMM 的兜底分支——核间切 M/N或混合切不做 batch 合并或 K 维切分。本文给出完整的时延建模、核间分配策略分析(证明 B 优先分组在任何场景下都不优于线性映射)、实现方案的逐步推导,以及尾轮处理策略。</p>
<p>v1.2 新增 §七:与 [cann-ops-nn](https://gitcode.com/cann/ops-nn/tree/master/matmul/batch_mat_mul_v3) 源码实现的逐维度对比。核心结论:<b>源码的 swizzle、核间分配、AL1 全载与理论高度一致主要差距在降核模式未实现、IsCapable 无并行度校验、以及大量经验常数硬编码。</b></p>
@@ -82,6 +82,18 @@ MathJax = {
<tr><td>$mCnt, nCnt$</td><td>单 batch 内 M/N 向块数</td><td>$\lceil M/\text{singleCoreM} \rceil$</td></tr>
<tr><td>$W$</td><td>swizzle 窗口宽度</td><td>$\max\{d : d \mid C, d \le \lfloor\sqrt{C}\rfloor\}$</td></tr></table>
<p>层次关系:$K = \text{singleCoreK} \ge k_{L1} \ge baseK$$\text{singleCoreM} \ge \text{BaseM}$$\text{singleCoreN} \ge \text{BaseN}$。</p>
<h3>1.4 GM→L1 搬移效率dValue 与 min_TileSize</h3>
<p>GM→L1 搬移使用 Nd2Nz DMA每次搬移的关键参数</p>
<table><tr><th>参数</th><th>含义</th><th>A 矩阵 [singleCoreM, $k_{L1}$]</th><th>B 矩阵 [$k_{L1}$, singleCoreN]</th></tr>
<tr><td>nValue</td><td>行数(非连续维)</td><td>singleCoreM</td><td>$k_{L1}$</td></tr>
<tr><td>dValue</td><td>每行连续字节数(连续维)</td><td>$k_{L1} \cdot dtype$</td><td>$\text{singleCoreN} \cdot dtype$</td></tr>
<tr><td>总搬移量</td><td>nValue × dValue</td><td>$\text{singleCoreM} \cdot k_{L1} \cdot dtype$</td><td>$k_{L1} \cdot \text{singleCoreN} \cdot dtype$</td></tr></table>
<p><b>dValue 是 ND 排布中连续维的字节数</b>——对 ND 格式的右矩阵 B非转置时连续维为 NdValue = $\text{singleCoreN} \cdot dtype$;转置时连续维为 KdValue = $k_{L1} \cdot dtype$。<b>dValue 不是两个维度的乘积</b></p>
<p>两级搬移效率阈值:</p>
<ol class="tight">
<li><b>dValue ≥ 256B</b>DMA 硬件突发下限):每行连续数据量不足 256B 时DMA 突发效率急剧下降;</li>
<li><b>总搬移量 ≥ min_TileSize</b>(推荐 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 对齐)。</li>
</ol>
<hr>
<h2>二、进入条件</h2>
<p>同时满足:</p>
@@ -174,12 +186,23 @@ $$</div>
\frac{\Delta T_{saved}}{T_{total}} \approx \frac{1 - 1/s}{n_{wave}}
$$</div>
<p>$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$ 时收益显著,应重切。**</p>
<p>*重切约束的推导*:沿 N 切 $s$ 份后,小块的 N 维度变为 $\text{singleCoreN}_{tail} = \text{singleCoreN}/s$。小块仍须满足两类约束</p>
<p>*重切约束的推导*:沿 N 切 $s$ 份后,小块变为 $[\text{singleCoreM},\; \text{singleCoreN}/s]$。B 矩阵搬移的 dValue 受影响ND 非转置时连续维为 N</p>
<div class="math">$$
\text{dValue}_B^{tail} = \frac{\text{singleCoreN}}{s} \cdot dtype
$$</div>
<p>A 矩阵搬移的 dValue 不受影响(连续维为 K$\text{dValue}_A = k_{L1} \cdot dtype$,与 M 向切分无关)。</p>
<p>小块须满足三类约束:</p>
<ol class="tight">
<li><b>搬移效率</b>与主 tile 同一标准GM→L1 搬移 B 矩阵时dValue = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot \text{dtype}$。v0.98 §六约束 3 要求 dValue ≥ min_TileSize推荐 16KB带宽利用率保障硬件最低要求 dValue ≥ 256BDMA 突发下限)。两级阈值</li>
<li><b>dValue 下限</b>DMA 硬件突发效率):$\text{dValue}_B^{tail} \ge 256\text{B}$</li>
</ol>
<div class="math">$$
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{硬件底线})
s \le \frac{\text{singleCoreN} \cdot dtype}{256\text{B}}
$$</div>
<ol class="tight">
<li><b>单次搬移量</b>带宽利用率保障B 矩阵单次搬移量 = $k_{L1} \cdot \text{singleCoreN}_{tail} \cdot dtype \ge min\_TileSize$(推荐 16KB</li>
</ol>
<div class="math">$$
s \le \frac{k_{L1} \cdot \text{singleCoreN} \cdot dtype}{min\_TileSize}
$$</div>
<ol class="tight">
<li><b>对齐</b>$\text{singleCoreN}_{tail} \ge 16$Cube 基本块 N 向粒度):</li>
@@ -187,14 +210,21 @@ $$</div>
<div class="math">$$
s \le \frac{\text{singleCoreN}}{16}
$$</div>
<p>沿 M 切时对称singleCoreM 替换 singleCoreNdValue 约束作用于 A 矩阵的 $\text{singleCoreM}_{tail} \cdot k_{L1} \cdot \text{dtype}$)。</p>
<p>*最优切分因子*:在不违反上述约束的前提下尽量让 $r \cdot s$ 接近 $C$。优先用推荐阈值min_TileSize若 $s$ 太小导致 $r \cdot s \ll C$重切收益不明显退而用硬件底线256B</p>
<p>沿 M 切时对称B 矩阵 dValue 不受影响(连续维 N 未变A 矩阵单次搬移量 $= \text{singleCoreM}_{tail} \cdot k_{L1} \cdot dtype \ge min\_TileSize$,对齐 $\text{singleCoreM}_{tail} \ge 16$。<b>沿 M 切无 dValue 约束</b>A 矩阵 dValue = $k_{L1} \cdot dtype$ 不变)。</p>
<p>*最优切分因子*:在不违反约束的前提下尽量让 $r \cdot s$ 接近 $C$</p>
<div class="math">$$
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)
$$</div>
<p>若 $r \cdot s^* &lt; C/2$(重切后仍不满半),改用硬件底线重算 $s^*$;若仍 $&lt; C/2$,退化为不重切。</p>
<p>*例*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%。</p>
<p>*切分方向选择*:优先沿 N 切(保持 A 行带完整L2 中 A 数据不变);若 N 向约束不满足($s^*$ 被 min_TileSize 或对齐卡住),改沿 M 切。M/N 都不可行时退化为不重切。</p>
<p>*例*C=32、$N_{blk}=40$、$n_{wave}=2$、$r=8$、singleCoreM=singleCoreN=256、$k_{L1}$=128、BF16</p>
<ul class="tight">
<li>dValue$s \le 256 \times 2 / 256 = 2$</li>
<li>搬移量:$s \le 128 \times 256 \times 2 / 16384 = 4$</li>
<li>对齐:$s \le 256/16 = 16$</li>
<li>核数:$\lfloor 32/8 \rfloor = 4$</li>
</ul>
<p>$s^* = \min(4, 2, 4, 16) = 2$——<b>dValue 约束是瓶颈</b>。尾轮 8 块沿 N 切 2 份 → 16 个小块(每块 [256, 128]dValue = 128×2 = 256B 恰好达标16 核满载,尾波时延从 $T_{block}$ 降至 $T_{block}/2$。总时延节省 25%。</p>
<p>若 dValue 卡死导致 $r \cdot s^* &lt; C/2$(重切后仍不满半),改沿 M 切(无 dValue 约束M/N 都不可行时退化为不重切。</p>
<p>*切分方向选择*:优先沿 N 切(保持 A 行带完整L2 中 A 数据不变);若 N 向 dValue 约束太紧,改沿 M 切A 矩阵 dValue 不变,仅受搬移量和对齐约束)。</p>
<p><b>结论</b>$n_{wave} \le 3$ 且 $r &lt; C$ 时应重切尾轮——host 端零代价NPU 端收益 $T_{block}(1-1/s^*)$。$n_{wave} \ge 4$ 时收益 &lt; 25%,可不重切(通过选择使尾波占比小的 mCnt/nCnt 组合来优化)。</p>
<h3>5.3 尾轮影响的量化</h3>
<p>设总块数 $N_{blk} = B \cdot mCnt \cdot nCnt$,总波数 $n_{wave} = \lceil N_{blk} / C \rceil$,尾波块数 $r = N_{blk} \bmod C$$r = 0$ 时无尾波)。</p>
@@ -256,9 +286,12 @@ $$</div>
<div class="math">$$
2 \cdot (\text{singleCoreM} + \text{singleCoreN}) \cdot k_{L1} \cdot \text{dtype} \le L1,\qquad k_{L1} \cdot \text{dtype} \ge 256\text{B}
$$</div>
<p><b>约束 3——搬移效率</b></p>
<p><b>约束 3——搬移效率</b>dValue 见 §1.4</p>
<div class="math">$$
\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非转置}}
$$</div>
<div class="math">$$
\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 单次搬移量}}
$$</div>
<p><b>约束 4——SingleCoreM/N 是 BaseM/N 的整数倍</b>(工程实现要求,保证 L0 tile 边界对齐)。</p>
<p>*选取策略*:在满足约束 1 的前提下SingleCoreM/N 尽量大(搬移效率和 L2 复用最大化)。长宽比跟随 M/N$\text{singleCoreM}/\text{singleCoreN} \approx M/N$),对齐到 BaseM/BaseN 的整数倍。</p>