目录整理:删除旧路径(已移入 ASW_Basic分支分析/ 子目录)
This commit is contained in:
@@ -1,304 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>BMM 尾轮处理策略对比分析 v1.0</title>
|
||||
<script>
|
||||
MathJax = {
|
||||
tex: {
|
||||
inlineMath: [['$','$']],
|
||||
displayMath: [['$$','$$']],
|
||||
tags: 'ams',
|
||||
processEscapes: true
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
||||
<style>
|
||||
:root{--ink:#1f2933;--muted:#5f6b7a;--accent:#0b6bcb;--accent2:#0e9f6e;--line:#d9e2ec;--code-bg:#f4f6f9}
|
||||
*{box-sizing:border-box}
|
||||
body{font-family:"PingFang SC","Microsoft YaHei","Helvetica Neue",Arial,sans-serif;color:var(--ink);background:#eef2f6;margin:0;line-height:1.8}
|
||||
.page{max-width:1020px;margin:0 auto;padding:32px 44px 80px;background:#fff;box-shadow:0 0 24px rgba(0,0,0,.06)}
|
||||
h1{font-size:28px;border-bottom:3px solid var(--accent);padding-bottom:12px;margin-top:8px}
|
||||
h2{font-size:22px;margin-top:44px;border-left:6px solid var(--accent);padding-left:12px;color:#0b3d73}
|
||||
h3{font-size:18px;margin-top:30px;color:#0b3d73;border-bottom:1px dashed var(--line);padding-bottom:6px}
|
||||
h4{font-size:16px;margin-top:20px;color:#123}
|
||||
table{border-collapse:collapse;width:100%;margin:14px 0;font-size:14px}
|
||||
th,td{border:1px solid var(--line);padding:7px 10px;text-align:left;vertical-align:top}
|
||||
th{background:#eaf2fb;color:#0b3d73}
|
||||
tr:nth-child(even) td{background:#f8fafc}
|
||||
code,pre{font-family:"JetBrains Mono",Consolas,Menlo,monospace;font-size:13px}
|
||||
code{background:var(--code-bg);padding:1px 5px;border-radius:4px;color:#9d2c5e}
|
||||
pre{background:var(--code-bg);border:1px solid var(--line);border-radius:8px;padding:14px;overflow-x:auto;line-height:1.55}
|
||||
pre code{background:none;color:#243447;padding:0}
|
||||
blockquote{background:#eafaf3;border-left:5px solid var(--accent2);padding:10px 16px;border-radius:0 8px 8px 0;margin:14px 0}
|
||||
.math{background:#fafbfc;border:1.5px solid #c3d6ee;border-radius:10px;padding:10px 22px;margin:14px 0;overflow-x:auto}
|
||||
ul.tight li,ol.tight li{margin:3px 0}
|
||||
hr{border:none;border-top:1px solid var(--line);margin:24px 0}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<h1>BMM 尾轮处理策略对比分析:不重切 / 尾轮重切 / 整轮均匀重切</h1>
|
||||
<blockquote>目标芯片:昇腾 950PR(DAV_3510)。本文自包含——不依赖其他分析文档,全部推导在文内完成;仅引用外部公开资料(昇腾白皮书、CANN 文档、开源算子源码仓)。<br>版本:v1.0,2026-08-31</blockquote>
|
||||
<hr>
|
||||
<h2>摘要</h2>
|
||||
<p>BMM(BatchMatMul)算子在核间切分 M/N 后,总输出块数 $N_{blk} = B \cdot mCnt \cdot nCnt$ 一般不是核数 C 的整数倍,尾轮只有 $r = N_{blk} \bmod C$ 个核工作、其余核空转。本文对四种尾轮处理策略做严格的两两对比:<b>A0(不重切)、A1a(尾轮整数倍切分)、A1b(尾轮 tile 重选凑满核)、B(整轮均匀重切)</b>,在计算 Bound 与访存 Bound 两类场景下给出完整的时延公式与适用条件分界。</p>
|
||||
<p>核心结论:</p>
|
||||
<ol class="tight">
|
||||
<li><b>A0 从来不是最优</b>($r > 0$ 时 A1 或 B 严格优);</li>
|
||||
<li><b>A1a 是 A1b 的真子集</b>(枚举空间包含关系),A1b 恒不劣于 A1a;</li>
|
||||
<li><b>计算 Bound</b>:A1b 与 B 理论时延严格相等(总计算量/C 守恒),A1b 搬移周长和恒 ≤ B(均值不等式)——时延打平、按工程权衡选择;</li>
|
||||
<li><b>访存 Bound</b>:$\rho \ge \rho_{dv}$(尾轮占比 ≥ dValue 平方阈值)时 A1b 严格优;$\rho < \rho_{dv}$ 时 A1b 被 dValue 卡死,B 严格优当且仅当 $\sqrt{\rho_{dv}} > n_{wave}/\sqrt{g} - (n_{wave}-1)$——<b>B 反超的唯一通道是 dValue</b>:A1b 的尾轮 tile 缩放 $\sqrt{\rho}$ 恒狠于 B 的 $1/\sqrt{g}$($\rho < 1/g$ 恒成立),卡死更深时 B 胜出,该区间窄且临界实测打平;</li>
|
||||
<li>给出<b>基于 B/M/K/N/dtype 的闭式判定流程</b>:五步前置计算 + 决策表,无需逐项仿真。</li>
|
||||
</ol>
|
||||
<hr>
|
||||
<h2>一、问题背景与执行模型</h2>
|
||||
<h3>1.1 BMM 的核间切分与数据流</h3>
|
||||
<p>BatchMatMulV3 在昇腾 NPU 上的兜底分支(ASW_Basic)按输出块并行:输出平面 $M \times N$ 被切为 $mCnt \times nCnt$ 个块,乘上 batch 维共 $N_{blk} = B \cdot mCnt \cdot nCnt$ 个独立输出块,按序分配到 $C$ 个 AIC 核。每个核内执行标准 Cube 数据流:</p>
|
||||
<pre><code>GM ──MTE2──> L1 ──MTE1──> L0A/L0B ──MMAD──> L0C ──Fixpipe──> GM
|
||||
↑_____________ L2 Cache(读 5.2TB/s)_____________↑</code></pre>
|
||||
<p>核间不切 K(singleCoreK = K),每个输出块独立累加完成后经 Fixpipe 写出 GM。块与块之间无依赖——这是尾轮可以独立重切的前提。</p>
|
||||
<h3>1.2 尾轮问题</h3>
|
||||
<p>块按序分配:核 $i$ 处理块 $i, i+C, i+2C, \ldots$。总块数 $N_{blk}$ 不能被 $C$ 整除时,最后一轮(尾轮)只有 $r = N_{blk} \bmod C$ 个核有块可算,$C - r$ 个核空转一个整块时间。</p>
|
||||
<p><b>问题</b>:给定 B、M、K、N、dtype 与首轮切分(singleCoreM/N),如何处理尾轮使端到端时延最小?</p>
|
||||
<h3>1.3 硬件规格与符号定义</h3>
|
||||
<p>昇腾 950PR 关键规格([昇腾 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)):</p>
|
||||
<table><tr><th>符号</th><th>含义</th><th>取值</th></tr>
|
||||
<tr><td>$C$</td><td>AIC 核数</td><td>32</td></tr>
|
||||
<tr><td>$Q_{16}$</td><td>单核 Cube BF16 峰值算力</td><td>486/32 ≈ 15.2 TFLOPS</td></tr>
|
||||
<tr><td>$W_{GM}$</td><td>GM(HBM)总带宽</td><td>1.6 TB/s</td></tr>
|
||||
<tr><td>$BW_{pc}$</td><td>单核 GM 带宽份额</td><td>$W_{GM}/C = 50$ GB/s</td></tr>
|
||||
<tr><td>$L1$</td><td>L1 容量/核</td><td>512 KB</td></tr>
|
||||
<tr><td>$L0C$</td><td>L0C 容量/核</td><td>256 KB</td></tr>
|
||||
<tr><td>$dtype$ / $outB$</td><td>输入/输出元素字节数</td><td>BF16 → 2B</td></tr></table>
|
||||
<p>*Tiling 符号*:$sM, sN$ = 单核输出 tile 的 M/N 维度(singleCoreM/N 的简写);$k_{L1}$ = GM→L1 的 K 向粒度;$mCnt = \lceil M/sM \rceil$、$nCnt = \lceil N/sN \rceil$。</p>
|
||||
<p>*尾轮符号*:$N_{blk} = B \cdot mCnt \cdot nCnt$(总块数);$n_{wave} = \lceil N_{blk}/C \rceil$(总轮次);$r = N_{blk} \bmod C$(尾轮块数);$\rho = r/C$(尾轮占比)。</p>
|
||||
<hr>
|
||||
<h2>二、基础模型</h2>
|
||||
<h3>2.1 单块时延三项</h3>
|
||||
<p>单个输出块 $[sM, sN]$(K 维全量累加)的三段时延:</p>
|
||||
<div class="math">$$
|
||||
T_{MMAD} = \frac{2 \cdot sM \cdot sN \cdot K}{Q_{16}},\qquad T_{MTE2} = \frac{(sM + sN) \cdot k_{L1} \cdot dtype}{BW_{pc}},\qquad T_{FIX} = \frac{sM \cdot sN \cdot outB}{BW_{pc}}
|
||||
$$</div>
|
||||
<p>其中 $k_{L1} = \min\big(K,\; \lfloor L1/(2(sM{+}sN) \cdot dtype) \rfloor_{16}\big)$(L1 双缓冲容量约束)。单块时延取主导项:$T_{block} = \max(T_{MMAD}, T_{MTE2}, T_{FIX})$(三段流水掩盖,瓶颈项决定)。</p>
|
||||
<p><b>Bound 判据</b>(由 $T_{MMAD} = T_{MTE2}$ 解出):</p>
|
||||
<div class="math">$$
|
||||
K^* = \frac{k_{L1} \cdot dtype \cdot Q_{16}}{2 \cdot BW_{pc}}\Big(\frac{1}{sM} + \frac{1}{sN}\Big)
|
||||
$$</div>
|
||||
<p>$K \ge K^*$ 为计算 Bound,否则访存 Bound(例:$sM=sN=256$、$k_{L1}=256$、BF16 时 $K^* \approx 608$)。</p>
|
||||
<h3>2.2 块几何缩放律(全文分析的枢纽)</h3>
|
||||
<p>把块数放大 $g$ 倍(面积缩 $g$ 倍、线性尺寸缩 $\sqrt{g}$ 倍,近方形比例)时:</p>
|
||||
<table><tr><th>时延项</th><th>依赖</th><th>缩放律</th></tr>
|
||||
<tr><td>$T_{MMAD}$</td><td>$\propto$ 面积 $sM \cdot sN$</td><td>$\propto g^{-1}$</td></tr>
|
||||
<tr><td>$T_{MTE2}$</td><td>$\propto$ 周长 $(sM + sN)$</td><td>$\propto g^{-1/2}$</td></tr>
|
||||
<tr><td>$T_{FIX}$</td><td>$\propto$ 面积</td><td>$\propto g^{-1}$(总量与切分无关)</td></tr></table>
|
||||
<p><b>搬移随周长缩放是关键</b>:切分越多,计算缩 $g$ 倍而搬移只缩 $\sqrt{g}$ 倍——"切分越多重复读越多"在每块粒度上的体现(输出是面积、输入搬运是周长:A 行带 $sM \times K$ + B 列带 $K \times sN$)。</p>
|
||||
<h3>2.3 搬移效率约束</h3>
|
||||
<p>GM→L1 搬移(Nd2Nz DMA)的两级效率阈值:</p>
|
||||
<ol class="tight">
|
||||
<li><b>dValue ≥ 256B</b>(DMA 硬件突发下限):dValue 是 ND 排布中连续维的字节数——B 矩阵非转置 $[K, N]$ 时连续维为 N,dValue = $sN \cdot dtype$;B 转置 $[N, K]$ 时连续维为 K,dValue = $k_{L1} \cdot dtype$;A 非转置 $[M, K]$ 的 dValue = $k_{L1} \cdot dtype$(**A 的 dValue 由 K 向保证,不约束 $sM$;B 非转置时 $sN$ 有 256B 下限——约束非对称**);</li>
|
||||
<li><b>单次搬移量 ≥ min_TileSize</b>(推荐 16KB):如 $k_{L1} \cdot sN \cdot dtype \ge 16$KB。</li>
|
||||
</ol>
|
||||
<h3>2.4 带宽模型声明</h3>
|
||||
<p>昇腾 950PR 每核 MTE2 为独立 DMA 引擎、带宽按核数配平,建模为**每核带宽上限 $BW_{pc} = W_{GM}/C$**。该假设下尾轮 $r$ 核聚合带宽仅 $r \cdot BW_{pc} < W_{GM}$,尾轮搬移不加速——$r$ 个整块用 $r$ 核、每核 1 块,时延仍为一个整块搬移时间 $T_{load} = T_{MTE2}$。HBM 全局共享池模型的敏感性见 §六边界说明。</p>
|
||||
<h3>2.5 首轮切分基准(近方形的来源与适用条件)</h3>
|
||||
<p>尾轮策略建立在首轮切分 $(mCnt, nCnt, sM, sN)$ 之上。首轮由<b>搬入时延最小化</b>确定:$T_{MTE2}^{total} \propto (1/sM + 1/sN) \cdot k_{L1}$,在块数约束下枚举取最优。其连续极限为<b>方形</b>($sM = sN$):$k_{L1} = K$(K 全载)时,面积固定使周长最小化 → 均值不等式给出方形严格最优;$k_{L1}$ 被 L1 容量压低(K 大)时,$(1/sM+1/sN) \cdot L1/(2(sM{+}sN)dtype) = L1/(2 \cdot sM \cdot sN \cdot dtype)$——<b>只与面积有关、与长宽比无关</b>,形状自由度释放。本文的缩放律以近方形为基准形态(线性尺寸 $\sqrt{g}$ 缩放);非方形分解的实际收益由同一目标函数另行评估(§四的"非方形惩罚"即此体现)。</p>
|
||||
<hr>
|
||||
<h2>三、四种策略定义与实现方式</h2>
|
||||
<h3>3.1 策略定义</h3>
|
||||
<table><tr><th>策略</th><th>做法</th><th>块大小</th></tr>
|
||||
<tr><td><b>A0:不重切</b></td><td>尾轮 $r$ 核各处理 1 个整块,$C-r$ 核空转</td><td>主轮尾轮同大小</td></tr>
|
||||
<tr><td><b>A1a:尾轮整数倍切分</b></td><td>尾轮每块沿 N(或 M)切 $s^*$ 份,$r \cdot s^*$ 个小块分给 C 核</td><td>主轮整块 + 尾轮 $1/s^*$ 小块</td></tr>
|
||||
<tr><td><b>A1b:尾轮 tile 重选凑满核</b></td><td>尾轮 $r$ 个原块覆盖的区域(面积 $r \cdot sM \cdot sN$)用更小 tile $(sM_t, sN_t)$ 重新切分,凑满 C 核</td><td>主轮整块 + 尾轮小 tile</td></tr>
|
||||
<tr><td><b>B:整轮均匀重切</b></td><td>总块数向上取整到 $N_{blk}' = n_{wave} \cdot C$,全局重新枚举 tile 使每轮每核恰好一个同样大小的块</td><td>全部块同大小</td></tr></table>
|
||||
<p><b>实现方式对比</b>:</p>
|
||||
<table><tr><th>策略</th><th>host 侧 tiling</th><th>kernel 侧执行</th><th>tile 参数套数</th></tr>
|
||||
<tr><td>A0</td><td>一套参数</td><td>线性映射 <code>index = blockIdx + round × usedCoreNum</code>,尾轮不满载核跳过</td><td>1</td></tr>
|
||||
<tr><td>A1a</td><td>主参数 + 尾轮切分参数($s^*$)</td><td>最后一轮切换小块尺寸</td><td>2</td></tr>
|
||||
<tr><td>A1b</td><td>主参数 + 尾轮 tile($sM_t, sN_t$)</td><td>尾轮区域独立子网格映射</td><td>2</td></tr>
|
||||
<tr><td>B</td><td>一套重切后参数</td><td>全程统一 tile,无尾轮分支</td><td>1</td></tr></table>
|
||||
<p><b>对齐约束的平等性</b>:16 对齐是 Cube 计算粒度(16×16×16 基本块)的硬件要求,<b>四种策略的 tile——无论重切前后——都必须是 16 的倍数</b>,无一例外。差异只在枚举空间(A1b 对尾轮子区域、B 对全局)与 tile 套数。</p>
|
||||
<h3>3.2 A1b 的 tile 确定与 A1a ⊆ A1b 证明</h3>
|
||||
<p>A1b 的理想 tile(方形同步缩小):</p>
|
||||
<div class="math">$$
|
||||
s_t^* = sM \cdot \sqrt{\frac{r}{C}} \quad (sM = sN \text{ 时})
|
||||
$$</div>
|
||||
<p>再按 16 对齐调整,使重切块数 $\lceil r \cdot sM \cdot sN / (sM_t \cdot sN_t) \rceil \le C$;也允许非方形枚举($(sM_t, sN_t)$ 独立按 16 步进)选最贴合的组合。</p>
|
||||
<p><b>A1a 是 A1b 的真子集</b>:A1a 的尾轮 tile 为 $(sM, sN/s^*)$ 或 $(sM/s^*, sN)$($s^* \in \{2, \ldots, \lfloor C/r \rfloor\}$ 整数),恰为 A1b 枚举空间中 $sM_t = sM$、$sN_t = sN/s^*$ 的特定组合——其 16 对齐、dValue、块数约束在 A1b 枚举中同样检查。记 A1b 枚举空间为 $\Omega_{A1b}$,A1a 解空间 $\Omega_{A1a} \subseteq \Omega_{A1b}$,枚举取最优:</p>
|
||||
<div class="math">$$
|
||||
T_{A1b} = \min_{\Omega_{A1b}} T \;\le\; \min_{\Omega_{A1a} \subseteq \Omega_{A1b}} T = T_{A1a}
|
||||
$$</div>
|
||||
<p><b>A1b 恒不劣于 A1a</b>,且通常严格优:A1a 受"$s^*$ 整数"与"每块切同样份数"双重限制($r > C/2$ 时 $s^* = \lfloor C/r \rfloor = 1$ 完全失效),A1b 允许非整数比例与凑满 C 核(无 $r \le C/2$ 限制)。下文 A1 一律指 A1b(A1a 视为退化形态)。</p>
|
||||
<h3>3.3 三策略通用时延式</h3>
|
||||
<div class="math">$$
|
||||
T_{A0} = n_{wave} \cdot T_{block},\qquad T_{A1} = (n_{wave}-1) \cdot T_{block} + T_{tail},\qquad T_B = n_{wave} \cdot T_{block}'
|
||||
$$</div>
|
||||
<p>A1a 时 $T_{tail} = T_{block}/s^*$(计算 Bound);A1b 凑满 C 核时尾轮小块面积为 $\rho \cdot sM \cdot sN$,计算 Bound 下 $T_{tail}^{A1b} = \rho \cdot T_{block}$。</p>
|
||||
<hr>
|
||||
<h2>四、计算 Bound 完整推导($T_{MMAD} > T_{MTE2}$)</h2>
|
||||
<h3>4.1 A0 vs A1</h3>
|
||||
<p>A1a 可行时($r \le C/2$):$\Delta_{A0 \to A1a} = T_{MMAD}(1 - 1/s^*)$。$r > C/2$ 时 A1a 失效,但 A1b 不退化:</p>
|
||||
<div class="math">$$
|
||||
\Delta_{A0 \to A1b}^{calc} = T_{MMAD}\Big(1 - \frac{r}{C}\Big)
|
||||
$$</div>
|
||||
<p><b>A1 恒优于 A0</b>($r > 0$),A0 在计算 Bound 下永不最优。</p>
|
||||
<h3>4.2 A0 vs B</h3>
|
||||
<p>代入 $T_{block}' = T_{MMAD}/g$ 与 $n_{wave}/g = N_{blk}/C = n_{wave}-1+\rho$:</p>
|
||||
<div class="math">$$
|
||||
\Delta_{A0 \to B}^{calc} = n_{wave} T_{MMAD} - T_{MMAD}\Big(n_{wave} - 1 + \frac{r}{C}\Big) = T_{MMAD} \cdot \frac{C - r}{C} > 0
|
||||
$$</div>
|
||||
<p><b>B 恒优于 A0</b>(可行性校验:搬移掩盖 $\sqrt{g} \le T_{MMAD}/T_{MTE2}$;分解对齐)。</p>
|
||||
<h3>4.3 A1 vs B</h3>
|
||||
<p>A1b 凑满核时 $T_{A1b} = T_{MMAD}(n_{wave} - 1 + \rho)$,与 $T_B = T_{MMAD}(n_{wave} - 1 + r/C)$ <b>理论时延严格相等</b>——两者都是"总计算量/C"(计算 Bound 下时延与切分方式无关,只要轮轮满载)。</p>
|
||||
<p>结构性差异在搬移量(周长和):A1b 主轮保持大 tile、只缩尾轮;B 全局均匀缩小。设方形 tile 边长 $s$:</p>
|
||||
<div class="math">$$
|
||||
S_{A1b} = 2sC\big(n_{wave} - 1 + \sqrt{\rho}\big),\qquad S_B = 2sC\sqrt{n_{wave}\big(n_{wave} - 1 + \rho\big)}
|
||||
$$</div>
|
||||
<div class="math">$$
|
||||
\big(n_{wave}-1+\sqrt{\rho}\big)^2 \le n_{wave}(n_{wave}-1+\rho) \iff 2\sqrt{\rho} \le 1 + \rho \iff (\sqrt{\rho}-1)^2 \ge 0 \quad \checkmark
|
||||
$$</div>
|
||||
<p><b>均值不等式:A1b 周长和恒 ≤ B</b>(等号当 $\rho = 1$ 即无尾轮)。搬移少意味着 L2 重复读少、掩盖余量更大。</p>
|
||||
<p><b>结论(计算 Bound)</b>:A1b 与 B 理论时延严格相等;离散 16 对齐后互有胜负(数值依赖、无系统性优劣——对齐约束对两者平等);A1b 搬移周长和恒 ≤ B(结构性)。<b>工程简洁选 B(一套 tile);追求搬移下限选 A1b。</b></p>
|
||||
<h3>4.4 数值实例</h3>
|
||||
<p>*例 1($r > C/2$)*:B=1、M=N=1792、K=4096、BF16、C=32。首轮 $mCnt=nCnt=7$($sM=sN=256$),$N_{blk}=49$、$n_{wave}=2$、$r=17$、$\rho=0.53$。$T_{MMAD}=35.3\mu s$。</p>
|
||||
<ul class="tight">
|
||||
<li>A0:$70.6\mu s$;A1a:$s^* = \lfloor 32/17 \rfloor = 1$ 失效;</li>
|
||||
<li>A1b 非方形枚举 $(sM_t, sN_t) = (224, 160)$:尾轮 $\lceil 17 \times 256^2/35840 \rceil = 32$ 块恰好凑满,尾轮时延 $19.3\mu s$,$T_{A1b} = 54.6\mu s$;</li>
|
||||
<li>B:$N_{blk}'=64=8\times8$、$sM'=sN'=224$,$T_B = 54.1\mu s$。</li>
|
||||
</ul>
|
||||
<p>A1b 与 B 打平(54.6 vs 54.1,差 <1%);周长和此例恰好持平(28672 = 28672)。<b>相对 A0 均省约 23%</b>。</p>
|
||||
<p>*例 2($r \mid C$ 完美点)*:M=1536、N=2048、K=4096、BF16。$N_{blk}=48$、$r=16$。A1a:$s^* = 2 = C/r$ 完美,$T_{A1a} = 53.0\mu s$;B:$T_B = 53.0\mu s$。<b>A1a = B</b>($1/s^* = r/C$),选 A1a(搬移增量小)。</p>
|
||||
<hr>
|
||||
<h2>五、访存 Bound 完整推导($T_{MTE2} \ge T_{MMAD}$)</h2>
|
||||
<p>主导项 $T_{block} = T_{load} = (sM + sN) \cdot k_{L1} \cdot dtype / BW_{pc}$。</p>
|
||||
<h3>5.1 A0 vs A1</h3>
|
||||
<p>A1a($r \le C/2$):尾轮沿 N 切 $s^*$ 份,小块搬移 $(sM + sN/s^*) k_{L1} dtype$(**A 行带 $[sM, k_{L1}]$ 每个小块都要完整搬一次,不随 $s^*$ 缩小**——结构性弱点),方形下 $T_{tail} = T_{load}(1+1/s^*)/2$:</p>
|
||||
<div class="math">$$
|
||||
\Delta_{A0 \to A1a}^{mem} = \frac{T_{load}}{2}\Big(1 - \frac{1}{s^*}\Big)
|
||||
$$</div>
|
||||
<p>受 dValue 硬约束 $s^* \le sN \cdot dtype/256\text{B}$(BF16、sN=256 时 $s^* \le 2$)。</p>
|
||||
<p>A1b(任意 $r$):尾轮区域用 $s_t = s\sqrt{\rho}$ tile 重切凑满 C 核,尾轮总搬移 $= C \cdot 2s\sqrt{\rho} \cdot k_{L1}$,C 核满载聚合带宽 $C \cdot BW_{pc}$:</p>
|
||||
<div class="math">$$
|
||||
T_{tail}^{A1b} = \sqrt{\rho} \cdot T_{load},\qquad \Delta_{A0 \to A1b}^{mem} = T_{load}\big(1 - \sqrt{\rho}\big) > 0
|
||||
$$</div>
|
||||
<p><b>A1 恒优于 A0</b>(dValue 允许时)。</p>
|
||||
<h3>5.2 A0 vs B</h3>
|
||||
<div class="math">$$
|
||||
\Delta_{A0 \to B}^{mem} = n_{wave} T_{load}\Big(1 - \frac{1}{\sqrt{g}}\Big) > 0 \quad (g > 1)
|
||||
$$</div>
|
||||
<p><b>B 恒优于 A0</b>(dValue 约束 $g \le (sN \cdot dtype/256\text{B})^2$ 满足时)。物理解释:尾轮 $r$ 核聚合带宽仅 $r \cdot BW_{pc}$,搬移不加速;B 让所有轮次满核满带宽。</p>
|
||||
<h3>5.3 A1 vs B——完整分界推导</h3>
|
||||
<p>**(i)无约束 regime($\rho \ge \rho_{dv}$,A1b 可凑满)**:总时延正比于周长和(满载轮聚合带宽相同),由 §4.3 的均值不等式:</p>
|
||||
<div class="math">$$
|
||||
\frac{T_{A1b}^{mem}}{T_B^{mem}} = \frac{n_{wave} - 1 + \sqrt{\rho}}{\sqrt{n_{wave}(n_{wave}-1+\rho)}} \le 1
|
||||
$$</div>
|
||||
<p><b>A1b 恒不劣于 B</b>,$\rho$ 小时优势大($\rho=0.1$、$n_{wave}=2$ 时优 11%)。</p>
|
||||
<p><b>(ii)关键结构事实:A1b 的 dValue 约束恒比 B 更严</b>。A1b 的尾轮 tile 缩放因子为 $\sqrt{\rho}$,B 的全局 tile 缩放因子为 $1/\sqrt{g} = \sqrt{(n_{wave}-1+\rho)/n_{wave}}$:</p>
|
||||
<div class="math">$$
|
||||
\rho < \frac{1}{g} \iff \rho \cdot n_{wave} < n_{wave} - 1 + \rho \iff \rho(n_{wave} - 1) < n_{wave} - 1 \iff \rho < 1 \quad \checkmark \text{(} r < C \text{ 恒成立)}
|
||||
$$</div>
|
||||
<p><b>物理含义</b>:A1b 只缩尾轮 $r$ 块的区域去凑满 C 核,tile 必须缩得比 B 的全局缩放更狠——所以 A1b 的尾轮 tile 更早跌破 dValue 下限。<b>这是 B 可能反超的唯一通道</b>。</p>
|
||||
<p><b>(iii)三区间判定</b>($\rho_{dv} = (256\text{B}/(sN \cdot dtype))^2$):</p>
|
||||
<table><tr><th>区间</th><th>条件</th><th>结论</th></tr>
|
||||
<tr><td>I</td><td>$\rho \ge \rho_{dv}$(A1b 凑满可行;此时 $1/g > \rho \ge \rho_{dv}$ 故 B 也可行)</td><td><b>A1b 恒优</b>(均值不等式)</td></tr>
|
||||
<tr><td>II</td><td>$\rho < \rho_{dv} \le 1/g$(A1b 卡死、B 可行)</td><td>分界公式判定(下)</td></tr>
|
||||
<tr><td>III</td><td>$\rho_{dv} > 1/g > \rho$(都卡死)</td><td>A0/A1a 兜底</td></tr></table>
|
||||
<p>区间 II 中 A1b 退化为 $s_t = 256\text{B}/dtype$(dValue 下限),尾轮块数 $= r/\rho_{dv} < C$(凑不满),尾轮时延 $= \sqrt{\rho_{dv}} \cdot T_{load}$(小块搬移按 $s_t/sN = \sqrt{\rho_{dv}}$ 缩放):</p>
|
||||
<div class="math">$$
|
||||
T_{A1b}^{dv} = T_{load}\big(n_{wave} - 1 + \sqrt{\rho_{dv}}\big),\qquad T_B = \frac{n_{wave}}{\sqrt{g}} \cdot T_{load}
|
||||
$$</div>
|
||||
<p><b>B 严格优当且仅当</b>:</p>
|
||||
<div class="math">$$
|
||||
\sqrt{\rho_{dv}} > n_{wave} \cdot \sqrt{\frac{n_{wave} - 1 + \rho}{n_{wave}}} - (n_{wave} - 1)
|
||||
$$</div>
|
||||
<p>物理解读:A1b 卡死后尾轮时延被锁在 $\sqrt{\rho_{dv}} \cdot T_{load}$(dValue 下限决定),不再随 $\rho$ 减小;而 B 的 $n_{wave}/\sqrt{g}$ 随 $\rho$ 减小而降低(全局重切幅度减小)。$\rho$ 足够小(卡死足够深)时 B 反超。</p>
|
||||
<h3>5.4 数值实例</h3>
|
||||
<p>*例 3($\rho$ 小、dValue 卡死,临界打平)*:M=N=1536、K=256、BF16。$mCnt=nCnt=6$、$N_{blk}=36$、$n_{wave}=2$、$r=4$、$\rho=0.125$、$\rho_{dv}=0.25$。$T_{load} = 5.24\mu s$。</p>
|
||||
<ul class="tight">
|
||||
<li>A0:$10.5\mu s$;A1a:$s^* = 2$(dValue 卡死),$T_{A1a} = 9.2\mu s$;</li>
|
||||
<li>A1b:$s_t^* = 256\sqrt{0.125} = 90.5 < 128$(dValue 下限)<b>卡死</b>,只能 $s_t = 128$,尾轮 16 块(半满载),$T_{A1b} = 7.9\mu s$(理论无约束值 $7.1\mu s$ 达不到);</li>
|
||||
<li>B:$N_{blk}'=64$、$sM'=sN'=192$,$T_B = 7.9\mu s$。</li>
|
||||
</ul>
|
||||
<p>分界公式核验:$\sqrt{\rho_{dv}} = 0.5$ vs $2/\sqrt{1.78} - 1 = 0.5$——<b>两侧精确相等</b>,实测 A1b = B = 7.9μs 打平 ✓(公式精确捕捉临界点)。</p>
|
||||
<p>*例 4($\rho \ge \rho_{dv}$,A1b 优)*:M=N=2304、K=256、BF16。$N_{blk}=81$、$n_{wave}=3$、$r=17$、$\rho=0.53$。$\sqrt{\rho} \cdot sN \cdot dtype = 373\text{B} \ge 256\text{B}$ ✓。</p>
|
||||
<ul class="tight">
|
||||
<li>A0:$15.7\mu s$;A1a:$s^* = 1$ 失效;</li>
|
||||
<li>A1b:$s_t = 192$,尾轮 32 块,$T_{A1b} = 2 \times 5.24 + 3.93 = 14.4\mu s$;</li>
|
||||
<li>B:$N_{blk}'=96$、$(8,12)$ 分解($sM'=288, sN'=192$),$T_B = 14.7\mu s$。</li>
|
||||
</ul>
|
||||
<p><b>A1b 优 2.2%</b>(周长和 $45056 < 46080$)。</p>
|
||||
<p>*例 5($\rho$ 更小、临界区)*:M=1280、N=1792、K=256、BF16。$mCnt=5, nCnt=7$、$N_{blk}=35$、$n_{wave}=2$、$r=3$、$\rho=0.094$。</p>
|
||||
<ul class="tight">
|
||||
<li>A1b:$s_t^* = 78.4 < 128$ 卡死,$s_t=128$、尾轮 12 块,$T_{A1b} = 5.24 + 2.62 = 7.9\mu s$;</li>
|
||||
<li>B:$N_{blk}'=64$、$(8,8)$ 分解($sM'=160, sN'=224$),$T_B = 7.9\mu s$。</li>
|
||||
</ul>
|
||||
<p>分界公式:$\sqrt{\rho_{dv}} = 0.5$ vs $2\sqrt{1.094/2} - 1 = 0.479$——公式判定 B 微优(理论差 0.11μs),实际 B 的非方形分解惩罚(周长 384 vs 方形 379)抵消理论优势,实测打平。<b>B 优的区间存在但窄,且实际分解的非方形惩罚会进一步压缩</b>。</p>
|
||||
<hr>
|
||||
<h2>六、决策总表与基于 B/M/K/N 的判定流程</h2>
|
||||
<h3>6.1 决策总表</h3>
|
||||
<table><tr><th>场景</th><th>A0 vs A1</th><th>A0 vs B</th><th>A1 vs B</th><th>最优策略</th></tr>
|
||||
<tr><td>计算 Bound,$r \le C/2$ 且 $r \mid C$</td><td>A1a 优</td><td>B 优</td><td>A1a = B(选 A1a,搬移少)</td><td>A1a</td></tr>
|
||||
<tr><td>计算 Bound,$r \le C/2$ 且 $r \nmid C$</td><td>A1a 优</td><td>B 优</td><td>B 略优(取整损失)</td><td>A1a/B 皆可</td></tr>
|
||||
<tr><td>计算 Bound,$r > C/2$</td><td>A1b 优(不退化)</td><td>B 优</td><td>时延理论相等,离散打平(A1b 周长和 ≤ B)</td><td>A1b 或 B(工程简洁选 B,搬移下限选 A1b)</td></tr>
|
||||
<tr><td>访存 Bound,$\rho \ge \rho_{dv}$</td><td>A1b 优</td><td>B 优</td><td><b>A1b 恒优</b>(均值不等式)</td><td>A1b</td></tr>
|
||||
<tr><td>访存 Bound,$\rho < \rho_{dv}$ 且分界公式成立</td><td>A1b 部分凑满</td><td>B 优</td><td><b>B 严格优</b></td><td>B</td></tr>
|
||||
<tr><td>访存 Bound,$\rho < \rho_{dv}$ 且分界公式不成立</td><td>A1b 部分凑满</td><td>B 优</td><td>打平</td><td>A1b/B 皆可</td></tr>
|
||||
<tr><td>dValue 全面卡死(B 也不可行)</td><td>A1a($s^* \ge 2$)或 A0</td><td>B 不可行</td><td>—</td><td>A1a/A0</td></tr></table>
|
||||
<h3>6.2 基于 B/M/K/N/dtype 的直接判定流程</h3>
|
||||
<p>五步闭式前置计算后查表即得最优策略,无需逐项建模仿真:</p>
|
||||
<ol class="tight">
|
||||
<li><b>首轮切分</b>:按搬入时延最小化枚举得 $mCnt, nCnt, sM, sN, k_{L1}$;</li>
|
||||
<li><b>尾轮参数</b>:$N_{blk} = B \cdot mCnt \cdot nCnt$,$n_{wave} = \lceil N_{blk}/C \rceil$,$r = N_{blk} \bmod C$,$\rho = r/C$;</li>
|
||||
<li><b>Bound 判定</b>:$K^* = \dfrac{k_{L1} \cdot dtype \cdot Q_{16}}{2 BW_{pc}}\Big(\dfrac{1}{sM} + \dfrac{1}{sN}\Big)$,$K \ge K^*$ → 计算 Bound;</li>
|
||||
<li><b>dValue 可行性</b>:$\rho_{dv} = (256\text{B}/(sN \cdot dtype))^2$;$g = n_{wave}C/N_{blk}$;$g_{dv} = (sN \cdot dtype/256\text{B})^2$;</li>
|
||||
<li><b>单块主导项</b>:$T_{block} = \max(T_{MMAD}, T_{load})$。</li>
|
||||
</ol>
|
||||
<p><b>决策表</b>:</p>
|
||||
<table><tr><th>#</th><th>条件</th><th>最优策略</th><th>端到端时延</th></tr>
|
||||
<tr><td>1</td><td>$r = 0$</td><td>A0(无尾轮)</td><td>$n_{wave} \cdot T_{block}$</td></tr>
|
||||
<tr><td>2</td><td>计算 Bound,$0 < r \le C/2$</td><td>A1a,$s^* = \lfloor C/r \rfloor$</td><td>$T_{MMAD}(n_{wave} - 1 + 1/s^*)$</td></tr>
|
||||
<tr><td>3</td><td>计算 Bound,$r > C/2$</td><td>A1b 或 B——时延理论相等</td><td>$T_{MMAD}(n_{wave} - 1 + \rho)$</td></tr>
|
||||
<tr><td>4</td><td>访存 Bound,$\rho \ge \rho_{dv}$</td><td>A1b</td><td>$T_{load}(n_{wave} - 1 + \sqrt{\rho})$</td></tr>
|
||||
<tr><td>5</td><td>访存 Bound,$\rho < \rho_{dv}$ 且 $\sqrt{\rho_{dv}} > n_{wave}/\sqrt{g} - (n_{wave}-1)$ 且 $g \le g_{dv}$</td><td>B</td><td>$T_{load} \cdot n_{wave}/\sqrt{g}$</td></tr>
|
||||
<tr><td>6</td><td>访存 Bound,$\rho < \rho_{dv}$ 但分界公式不满足</td><td>A1b(部分凑满)或 B,打平</td><td>$T_{load}(n_{wave}-1+\sqrt{\rho_{dv}}) \approx T_B$</td></tr>
|
||||
<tr><td>7</td><td>访存 Bound,B 也不可行($g > g_{dv}$)</td><td>A1a($s^* \ge 2$)或 A0</td><td>$T_{load}(n_{wave}-1) + T_{load}(1+1/s^*)/2$</td></tr></table>
|
||||
<p><b>判定流程图</b>:</p>
|
||||
<pre><code>[B, M, K, N, dtype]
|
||||
│
|
||||
▼
|
||||
<首轮枚举 → mCnt, nCnt, sM, sN, kL1>
|
||||
│
|
||||
▼
|
||||
<N_blk, n_wave, r, ρ = r/C>
|
||||
│
|
||||
├─ r = 0 ────────────────▶ A0(无尾轮)
|
||||
▼
|
||||
<K ≥ K* ?(计算 Bound)>
|
||||
│
|
||||
├─ 是 ── r ≤ C/2 ? ──┬─ 是 ─▶ A1a(s* = ⌊C/r⌋)
|
||||
│ └─ 否 ─▶ A1b(s_t = sM√ρ ↓16,可非方形枚举)或 B
|
||||
│ (时延相等;工程简洁选 B)
|
||||
│
|
||||
└─ 否(访存 Bound)── ρ ≥ ρ_dv ? ──┬─ 是 ─▶ A1b(周长和恒 ≤ B)
|
||||
└─ 否 ─▶ 分界公式判定:
|
||||
√ρ_dv > n_wave/√g −(n_wave−1) ? ── 是 ─▶ B
|
||||
└─ 否 ─▶ A1b/B 打平</code></pre>
|
||||
<hr>
|
||||
<h2>七、边界说明</h2>
|
||||
<ol class="tight">
|
||||
<li><b>带宽模型敏感性</b>:访存 Bound 结论依赖"每核 MTE2 带宽上限 $BW_{pc}$"假设。若 HBM 为全局共享池(尾轮 $r$ 核可吃满 $W_{GM}$),A0 尾轮搬移时延已是 $\rho \cdot T_{load}$ 接近理想,A1b/B 的搬移增量无带宽补偿,结论反转。昇腾 950PR 的 MTE2 为每核独立 DMA 引擎、带宽按核数配平,采用固定份额结论;临界 case 建议实测复核。</li>
|
||||
<li><b>A1b 的工程代价</b>:需两套 tile 参数(主轮大 tile + 尾轮小 tile)与尾轮区域的边界处理($r$ 个原块的并一般为 L 形,按矩形分解重切);host 端多一次枚举,NPU 侧 kernel 需支持尾轮 tile 尺寸切换。这些复杂度不改变时延结论,但影响实现成本。</li>
|
||||
<li><b>方形基准的适用条件</b>:§2.5 已述——K 全载时方形严格最优、L1 主导时仅面积相关。非方形分解的实际收益由同一目标函数评估,例 5 的非方形惩罚即此体现。</li>
|
||||
<li>**B 不整除 $N_{blk}'$**:$B \nmid N_{blk}'$ 时按 batch 分组切分、部分 batch 多一块,收益略降,判定不变。</li>
|
||||
</ol>
|
||||
<hr>
|
||||
<h2>参考文献</h2>
|
||||
<ol class="tight">
|
||||
<li>[昇腾 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),华为技术有限公司,2026</li>
|
||||
<li>[cann-ops-nn 源码仓(BatchMatMulV3)](https://gitcode.com/cann/ops-nn/tree/master/matmul/batch_mat_mul_v3):kernel 侧尾轮线性映射见 <code>op_kernel/arch35/batch_mat_mul_v3_asw_block_advanced.h</code>(<code>UpdateBasicIndex</code>:<code>index = newBlockIdx + roundIdx × usedCoreNum</code>,<code>if (index < totalCnt)</code> 跳过空转核——即本文的策略 A0)</li>
|
||||
</ol>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user