移动 BMM从分块计算到四大分支的逻辑推导.html 到 BMM/ 目录

This commit is contained in:
2026-08-27 11:22:13 +00:00
parent 32bdce820a
commit 8ec3702401

View File

@@ -0,0 +1,363 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>从分块计算到四大分支BMM 最优实现的逻辑推导</title>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<script>
MathJax = {
tex: {
inlineMath: [['$','$'], ['\\(','\\)']],
displayMath: [['$$','$$'], ['\\[','\\]']],
tags: 'ams'
}
};
</script>
<style>
:root{--bg:#fefefe;--panel:#1a2230;--ink:#1f2933;--muted:#5f6b7a;--accent:#0b6bcb;--accent2:#0e9f6e;--warn:#b45309;--line:#d9e2ec;--code-bg:#f4f6f9;--hl:#fff7e6}
*{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:48px;border-left:6px solid var(--accent);padding-left:12px;color:#0b3d73}
h3{font-size:18px;margin-top:32px;color:#0b3d73;border-bottom:1px dashed var(--line);padding-bottom:6px}
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;white-space:nowrap}
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;color:#243447}
blockquote p{margin:0}
.meta{color:var(--muted);font-size:13px;margin-bottom:24px}
</style>
</head>
<body>
<div class="page">
<h1>从分块计算到四大分支BMM 最优实现的逻辑推导</h1>
<blockquote>
<p>昇腾 BatchMatMulV3 算子 | 目标芯片 950PRDAV_351032 AIC / 1.65GHz
上游文档《BMM分块计算数学公式》分块计算&quot;是什么&quot; · 下游文档《BMM最优软件实现方案设计》第六章四大分支&quot;怎么用&quot;
本文定位:补上中间缺失的一层——<strong>为什么从&quot;分块计算 + 最优实现&quot;出发,恰好推导出 MergeBatch / IterBatch / ASW_Basic / StreamK 这四大分支,不多也不少。</strong></p>
</blockquote>
<hr />
<h2>0. 问题陈述:缺失的那层逻辑是什么</h2>
<p>《BMM分块计算数学公式》告诉我们BMM 的 4 重循环 $(b, m, n, k)$ 可以按硬件容量做嵌套分块,并用 swizzle 函数 $\sigma$ 重排块到核的映射。《BMM最优软件实现方案设计》第六章直接给出了四大分支。但中间有一跳没有论证</p>
<blockquote>
<p>分块参数 $(B^t, M^t, N^t, K^t)$、核间切分方式、swizzle 函数 $\sigma$ 有无穷多种取法。凭什么最优实现的搜索空间恰好收敛到 <strong>4 个分支</strong></p>
</blockquote>
<p>本文的推导链条如下,每一节对应链条上的一环:</p>
<pre><code>分块计算公式(自由度)
→ 硬件强加的两条不变式(规则)
→ 四个维度核间切分的代价表(代价不对称)
&quot;最优&quot;的三个必要条件(目标函数展开)
→ 决策树:按代价从低到高购买并行度(推导)
→ 15 种切分组合坍缩为 4 个等价类(完备性 + 极小性证明)
→ 与分块公式的参数特化对应(闭环)
</code></pre>
<hr />
<h2>1. 起点:分块计算公式给出的自由度</h2>
<p>分块计算把 BMM 重组为两层结构记号同《BMM分块计算数学公式》</p>
<p><strong>核间</strong>$\tilde{B} \times \tilde{M} \times \tilde{N}$ 个基本块,经 swizzle $\sigma$ 映射到 $C$ 个核:</p>
<p>$$
(\beta, \mu, \nu) = \sigma^{-1}\big((c + rC) \bmod \tilde{B}\tilde{M}\tilde{N}\big), \qquad c \in [0, C)
$$</p>
<p><strong>核内</strong>K 循环在 L0C 上原地累加,经 L1/L0 两级缓冲流水:</p>
<p>$$
C_{(\beta,\mu,\nu)}^{\text{L0C}} = \sum_{\kappa=0}^{\tilde{K}-1} \mathrm{mmad}\big(A[\beta,\mu,\kappa],\; B[\beta,\kappa,\nu]\big)
$$</p>
<p>这个数学结构里,<strong>自由决策只有三类</strong></p>
<table>
<thead>
<tr>
<th>自由度</th>
<th>数学对象</th>
<th>物理含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>F1核间切分</td>
<td>$\tilde B, \tilde M, \tilde N$ 如何对 $C$ 分解;$\kappa$ 是否跨核</td>
<td>哪些维度的块被分到<strong>不同核</strong></td>
</tr>
<tr>
<td>F2核内组织</td>
<td>$B^t, M^t, N^t, K^t$ 及 L1/L0 驻留深度 $d_A, d_B$</td>
<td>单核内如何折叠/驻留/流水</td>
</tr>
<tr>
<td>F3执行顺序</td>
<td>swizzle 函数 $\sigma$</td>
<td>时间上相邻的块在空间上的排布L2 复用)</td>
</tr>
</tbody>
</table>
<p><strong>&quot;四大分支&quot;问题,本质上就是 F1 和 F2 的选择问题</strong>F3 是每个分支内部的二级优化)。所以推导的主线是:<strong>F1 有哪些本质上不同的选择,各自的代价是什么。</strong></p>
<hr />
<h2>2. 规则:硬件强加的两条不变式</h2>
<p>分块公式里有句话写得轻描淡写,却是整个分支体系的根:</p>
<blockquote>
<p>&quot;<strong>K 循环 ($\kappa$) 在 L0C 上累加,不写回 GM。</strong>&quot;</p>
</blockquote>
<p>把它和输出写回方式放在一起,就是硬件强加给所有实现的两条不变式:</p>
<p><strong>不变式 I1L0C 累加不变式)</strong>:一个输出块 $C_{(\beta,\mu,\nu)}$ 的 $\tilde K$ 轮 mmad 结果驻留在 L0C256KBFP32上原地累加中间不产生任何 GM/L2 流量。</p>
<ul>
<li>推论 1<strong>核内切 K 是免费的</strong>$\tilde K$ 只是循环次数)。</li>
<li>推论 2<strong>核间切 K 必然打破 I1</strong>——每个核只算了一段 K 的部分和L0C 驻留不住&quot;别人的 K&quot;,部分和必须写出到 GM/L2 workspace再由 AIV 做核间归约。分块公式第六章的 STREAM_K 行写的就是这个:</li>
</ul>
<p>$$
C_{(\beta,\mu,\nu)} = \sum_{c \in \text{group}} C_{(\beta,\mu,\nu)}^{(c)} \quad \text{(部分和经 workspace 归约)}
$$</p>
<p><strong>不变式 I2输出专属不变式</strong>:若输出块 $C_{(\beta,\mu,\nu)}$ 由一个核独占负责,则该核只写出最终结果,无核间同步;反之(切 K则引入核间依赖与归约流量。</p>
<p>两条不变式合起来给出本文最重要的结构性事实:</p>
<blockquote>
<p><strong>K 维和其他三维在核间切分中的地位根本不对等</strong>:切 B/M/N 保持 I1、I2切 K 同时打破 I1、I2。这就是为什么&quot;是否切 K&quot;天然是分支的第一分界线StreamK 必然自成一支。</p>
</blockquote>
<hr />
<h2>3. 关键一步:四个维度核间切分的代价表</h2>
<p>对 F1核间切分的本质选择是&quot;4 个维度中切哪些&quot;。逐维度分析切分代价依据batch 语义、数据通路、GM/L2 带宽差):</p>
<h3>3.1 切 B —— 零代价并行</h3>
<p>不同 batch 的 $A[b], B[b], C[b]$ 在内存中天然不相交。因此:</p>
<ul>
<li><strong>读入</strong>:每个数据块被且仅被 1 个核读取,零重复;</li>
<li><strong>计算</strong>:每核独立产出最终结果,无核间依赖(保持 I1、I2</li>
<li><strong>写出</strong>:只有最终结果,无中间写出。</li>
</ul>
<p>代价 = 0。但并行度上限 = $B$,且单核分到的计算是**单个 batch 的 $[M,K]\times[K,N]$**——Cube 效率完全由单 batch 的 $M, N$ 决定(第 4 节会看到这是 MergeBatch 与 IterBatch 分家的原因)。</p>
<h3>3.2 切 M 或切 N —— 低代价并行(代价可被 L2 吸收)</h3>
<p>切 M同一 batch 的右矩阵 $B[b,:,:]$(大小 $K \times N$)被负责不同 M 行块的所有核**重复读取**;切 N 对称(左矩阵 $M \times K$ 被重复读)。</p>
<ul>
<li><strong>读入</strong>:重复因子 = M或 N方向的核间切分数 $g_M$$g_N$)。若被共享矩阵能驻留 L2$K N \cdot \text{dtype} \le 128\text{MB}$),则重复读取以 5.2TB/s 命中 L2 而非 1.6TB/s 的 GM——代价大部分被 L2 吸收swizzle $\sigma$(滑窗蛇形)进一步压缩同时活跃的工作集。</li>
<li><strong>计算</strong>:无核间依赖(保持 I1、I2</li>
<li><strong>写出</strong>:只有最终结果。</li>
</ul>
<p>代价 = 共享矩阵的重复读取,受 L2 容量约束,属于<strong>有上限的低代价</strong></p>
<h3>3.3 切 K —— 高代价并行(结构性代价,无法吸收)</h3>
<ul>
<li><strong>读入</strong>:无重复(各核读不同 K 段);</li>
<li><strong>计算</strong><strong>打破 I1、I2</strong>——每个输出块由 $\text{grid}_K$ 个核共同产生,部分和写 workspace再归约</li>
<li><strong>写出</strong>:存在中间结果写出。额外时延项 $T_{\text{REDUCE}} \propto \text{grid}_K \times B_c M_c N_c \times 4\text{B} / \text{BW}$AtomicAdd 到 L2 约 5.2TB/s、到 GM 约 1.6TB/s另有同步开销</li>
</ul>
<p>代价 = 归约流量 + 核间同步,是<strong>随 grid_K 线性增长的结构性代价</strong>L2 吸收不掉。</p>
<h3>3.4 代价不对称性总结</h3>
<p>$$
\boxed{\;\text{cost}(\text{切}B) = 0 \;<\; \text{cost}(\text{切}M) \approx \text{cost}(\text{切}N) \;\ll\; \text{cost}(\text{切}K)\;}
$$</p>
<p>这个排序不是经验,是三条硬件事实的推论:① batch 维在数学上独立BMM 语义);② L0C 累加机制I1使切 K 产生独一份的归约开销;③ L25.2TB/s / 128MB恰好能把 M/N 共享读取的代价吸收掉大半。<strong>整条决策树就是按这个代价排序&quot;从便宜到贵&quot;地购买并行度。</strong></p>
<hr />
<h2>4. 目标:最短端到端时延展开为三个必要条件</h2>
<p>最优实现的判据是 $T_{total} = \max(T_{MMAD}, T_{MTE2}, T_{MTE1}, T_{FIXPIPE} [, T_{REDUCE}])$ 最小。逐项拆开,$\min\max$ 等价于三个必要条件:</p>
<p><strong>R1 核占满(并行度条件)</strong>。$T_{MMAD}$ 与活跃核数成反比GM 带宽也要求 ≥ 3/4 核24 核)并发才能达到 90%+ 利用率。设不切 K 时的独立输出块数</p>
<p>$$
P \;=\; B \times \Big\lceil \tfrac{M}{16} \Big\rceil \times \Big\lceil \tfrac{N}{16} \Big\rceil
$$</p>
<p>16 是 mmad 的 fractal 粒度,即输出块的最小可分单元)。$P \ge C = 32$ 是满核的必要条件;$P &lt; 32$ 时必然有核闲置,闲置部分纯浪费。</p>
<p><strong>R2 搬运最快(复用条件)</strong>。MTE2 有效带宽由 L2 命中率决定:</p>
<p>$$
BW_{MTE2} \approx (1 - h) \times 1.6 + h \times 5.2 \ \text{TB/s}
$$</p>
<p>baseM = baseN = 256 时达成 Cube Bound 需要 $BW_{MTE2} \ge 2.64$ TB/s即 $h \gtrsim 28.9%$。GM 流量必须最小化(每份数据 GM 只读一次),重复读取尽量落在 L2/L1。</p>
<p><strong>R3 Cube 喂饱(效率条件)</strong>。单核每次 mmad 序列的 tile 要足够大L0C 利用率</p>
<p>$$
U = \frac{M^t \times N^t \times 4\text{B}}{256\text{KB}} = \frac{M^t N^t}{65536}
$$</p>
<p>越接近 1Cube 空转越少;$M^t, N^t$ 需 16 对齐,且 MTE1 不拖后腿要求 baseM, baseN ≥ 80 左右。</p>
<p><strong>分支推导 = 在 R1/R2/R3 约束下,按 §3 的代价排序购买并行度与 Cube 效率。</strong> 下面逐分支看它们各自是哪一组约束矛盾的&quot;最优解&quot;</p>
<hr />
<h2>5. 推导主链:四种典型矛盾 → 四个最优响应</h2>
<h3>5.1 情形一:$B \ge C$ 且单 batch $M \times N$ 大 → <strong>IterBatch</strong></h3>
<ul>
<li>R1零代价并行度 $B \ge 32$ 已足够,无需切 M/N省掉共享读取更无需切 K。</li>
<li>R3$M \times N$ 大(如 ≥ 128×128单 batch 就能开出 baseM×baseN ≈ 256×256 的 tile$U$ 接近 1Cube 喂得饱。</li>
<li>R2核内走标准三级流水L1→L0→Cube→L0CM/N 大 tile 保证复用。</li>
</ul>
<p>此时<strong>任何额外的切分都只会引入代价而无收益</strong>,最优解就是&quot;每核分若干 batch核内逐个 batch 做完整 Matmul&quot;。这正是分块公式中 $B^t = 1$、batch 作为核间最外层维度的特化。</p>
<p><strong>判据</strong>$B \ge C$ 且 $M N \gtrsim 128^2$L0C 利用率 ≥ 25% 量级)。</p>
<h3>5.2 情形二:$B \ge C$ 但单 batch $M \times N$ 小 → <strong>MergeBatch</strong></h3>
<ul>
<li>R1满足$B \ge 32$)。</li>
<li>R3<strong>不满足</strong>。$M = N = 64$ 时 $U = 64^2/256^2 = 6.25%$Cube 大片闲置;$M = N = 16$ 时 $U = 0.4%$mmad 几乎全在空转。并行度够,但每个核&quot;吃不饱&quot;</li>
</ul>
<p>矛盾在 R3。唯一的解法<strong>&quot;折叠维度&quot;用在 batch 上</strong>——核内把 $b$ 个 batch 的 A 沿 M 拼接、B 沿 N 拼接,等效大矩阵 $[bM, K] \times [K, bN] \to [bM, bN]$L0C 利用率从 $MN/65536$ 提升到 $b^2MN/65536$(受 L0C 约束 $b^2MN \le 65536$,如 $M{=}N{=}64$ 时 $b \le 4$),最后用 BlockTrace 取 $b$ 个对角线 $M \times N 块作为有效输出。</p>
<p>代价是交叉项算力浪费 $(b-1)/b$。为什么这个代价值得付?因为小 $M, N$ 意味着算术强度低:</p>
<p>$$
AI = \frac{b M N K \cdot 2}{(b M K + K b N + b^2 M N)\,\text{dtype}} < 270 \ \text{FLOP/B} \;\Rightarrow\; \text{访存 Bound}
$$</p>
<p>单核分摊的 GM 带宽约 50GB/sCube 要满转需要 AI ≈ 270 FLOP/B小 $M,N$ 的 case 远低于此,<strong>瓶颈本来就在搬运Cube 浪费的拍数被 MTE2 时延掩盖</strong>——浪费是免费的。这就是&quot;为什么是 MergeBatch&quot;的定量理由:它不是牺牲算力换效率,而是在算力本就用不完时回收闲置。</p>
<p><strong>判据</strong>$B \ge 2C$(每核至少 2 batch且 $MN &lt; 128^2$ 且 $AI &lt; 270$。</p>
<h3>5.3 情形三:$B < C$ $B \times \lceil M/16 \rceil \times \lceil N/16 \rceil \ge C$ <strong>ASW_Basic</strong></h3>
<ul>
<li>R1零代价维度 B 买不够 32 核,但低代价维度 M/N 可以补齐($P \ge 32$)。</li>
<li>R2切 M/N 引入共享矩阵的重复读取——必须靠 L2 驻留 + swizzle 把代价压到最低,这正是 swizzle 函数 $\sigma$ 的主战场(滑窗 $W = \max{d \mid d \mid C, d \le \lfloor\sqrt C\rfloor}$ 使同窗口 A 行块与 B 列块的 L2 足迹最小)。</li>
</ul>
<p>矛盾是&quot;R1 缺并行、只能靠低代价维度补&quot;。最优解是一个<strong>通用框架</strong>:允许切 B/M/N 的任意组合(不切 K核间切分维度与 swizzle 由 shape 决定——切 B 优先零共享B 不够切 M 或 N共享一侧矩阵L2 吸收),再不够混合切。这就是 ASW_Basic它不是一个具体切法而是&quot;所有不切 K、含 M/N 共享切法&quot;的总框架,$\sigma$ 取 ASW 滑窗蛇形。</p>
<p><strong>判据</strong>$P \ge C$ 且不满足情形一/二B 不够,或 M/N 大到不需要折叠 batch</p>
<blockquote>
<p>与 IterBatch 的竞争边界:$B \ge 32$ 且 $M \times N$ 中等时两者都可行。分野在 L2IterBatch 每核做完整 $M \times N \times K$,若单 batch 工作集 $MK + KN$ 超 L2 则 M/N 外循环反复挤兑 L2ASW 切 M 时右矩阵 $KN \le 128$MB 可驻留 L2 供 32 核共享。谁的工作集能驻留 L2谁优——这是时延模型比较不是硬阈值见 §7</p>
</blockquote>
<h3>5.4 情形四:$P = B \lceil M/16 \rceil \lceil N/16 \rceil &lt; C$ → <strong>StreamK</strong></h3>
<ul>
<li>R1<strong>无法满足</strong>。B、M、N 三个便宜维度全部用尽(切到 16 粒度)仍凑不满 32 核。典型:$B = 1, M = N = 64$ 时 $P = 16 < 32$一半核闲置</li>
<li>此时<strong>唯一剩余的并行维度是 K</strong>。切 K 虽然代价高(打破 I1/I2付 $T_{REDUCE}$),但不切的代价是核闲置——两害相权,当</li>
</ul>
<p>$$
T_{MMAD/\text{core}} \gg T_{REDUCE} \;\Longleftrightarrow\; K \;\gtrsim\; \text{grid}_K^2 \times 1690
$$</p>
<p>(推导:要求计算时延 ≥ 10× 归约时延,代入 8192 FLOP/拍、1.65GHz、GM 1.6TB/s切 K 净收益为正。K 越大,可承担的 grid_K 越大K 不够大时,减少 grid_K配合切 B/M/N即 grid_K × grid_B × grid_M × grid_N ≤ 32 的组合)来降低归约组大小。</p>
<p>矛盾是&quot;便宜维度用尽仍缺并行&quot;。最优解是<strong>付归约代价买 K 维并行</strong>,且归约组能小则小。这就是 StreamK——分块公式中 $\tilde K$ 跨核拆分、部分和经 workspace 归约的特化。</p>
<p><strong>判据</strong>$P < C$ P 虽够但核内 M/N 范围被压得太碎且存在 grid_K 使 $K/\text{grid}_K \ge 256$ 且满足上式</p>
<h3>5.5 一条链总结</h3>
<pre><code>R1 缺并行?────────────────────────────────────────────
│ 不缺 │ 缺
▼ ▼
R3 缺 Cube 效率? 便宜维度(B/M/N)用尽?
│ 不缺 │ 缺 │ 用尽
▼ ▼ ▼
B 够切? MergeBatch StreamK切K付归约代价
│B≥C │B&lt;C 折叠batch
▼ ▼ 换Cube效率
Iter ASW_Basic 浪费被访存Bound掩盖
Batch 切M/N共享
L2+swizzle吸收代价
</code></pre>
<p><strong>四大分支各自是唯一最优解的&quot;矛盾区域&quot;互不相同</strong>IterBatch 解&quot;零代价并行已够&quot;的区域MergeBatch 解&quot;并行够但 Cube 饿&quot;的区域ASW_Basic 解&quot;并行缺、低代价维度可补&quot;的区域StreamK 解&quot;便宜维度用尽&quot;的区域。区域不同,最优响应不同——这就是四个分支的存在性证明。</p>
<hr />
<h2>6. 完备性与极小性:为什么恰好四个,不多不少</h2>
<h3>6.1 完备性15 种切分组合按代价特征坍缩为 4 个等价类</h3>
<p>核间切分的所有可能 = 四维 {B, M, N, K} 的非空子集,共 $2^4 - 1 = 15$ 种《方案设计》§6.1 已枚举 C1~C15。关键观察<strong>一个切分组合的代价结构只由两个布尔特征决定</strong>——</p>
<ul>
<li><strong>是否含 K</strong>(决定要不要付归约代价,打破 I1/I2</li>
<li><strong>是否含 M 或 N</strong>(决定有没有共享矩阵的重复读取)。</li>
</ul>
<table>
<thead>
<tr>
<th>含 K</th>
<th>含 M/N</th>
<th>组合</th>
<th>代价结构</th>
<th>归入分支</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>任意</td>
<td>C4, C7, C9, C10, C12~C158 个)</td>
<td>必有归约grid_K×grid_B×grid_M×grid_N 只是参数差异</td>
<td><strong>StreamK</strong></td>
</tr>
<tr>
<td></td>
<td></td>
<td>C2, C3, C5, C6, C8, C116 个)</td>
<td>必有共享读取;切哪几维只是 grid 参数</td>
<td><strong>ASW_Basic</strong></td>
</tr>
<tr>
<td></td>
<td>否(纯 {B}</td>
<td>C11 个)</td>
<td>零共享零归约</td>
<td>核内只有两种组织方式,见下</td>
</tr>
</tbody>
</table>
<p>纯 {B} 的核内组织方式只有两种——<strong>把多个 batch 合并成一个大 tile 算MergeBatch或逐个 batch 算IterBatch</strong>——不存在第三种(要么利用 batch 间的 tile 级合并,要么不利用)。于是:</p>
<p>$$
15 \;\xrightarrow{\text{按 (含K, 含M/N) 归并}}\; 1 + 1 + 2 \;=\; \boxed{4}
$$</p>
<p>任何合法 case 的任意切法都落在这 4 个等价类之一 ⇒ <strong>完备</strong></p>
<blockquote>
<p>与源码对照arch35 源码有 10 个策略,为什么这里只有 4 个?因为源码策略 = 4 个切分等价类 × 两个正交维度的笛卡尔积:① <strong>计算通路</strong>Cube vs AIVK=0 的 K_EQUAL_ZERO、K=1 的 TO_MUL 是 K 退化时的通路切换,发生在切分决策之前,属于预处理层);② <strong>驻留策略</strong>AL1/BL1_FULL_LOAD 是 ASW_Basic 内部 $M^t = M$ / $N^t = N$ 的 tiling 极限ITER_BATCH_BROADCAST 是 IterBatch 在广播输入下的数据复用特化)。它们是分支<strong>内部</strong>的参数特化,不构成新的切分等价类。源码尾部还有 BASE=999 无条件兜底,也印证&quot;特判 ⊂ 通用&quot;的层级结构。</p>
</blockquote>
<h3>6.2 极小性:每个分支都有它是唯一最优的 shape 区域</h3>
<p>去掉任何一个分支,都存在 case 失去最优实现:</p>
<table>
<thead>
<tr>
<th>分支</th>
<th>独占最优的示例 caseBF16</th>
<th>替代方案的劣势</th>
</tr>
</thead>
<tbody>
<tr>
<td>IterBatch</td>
<td>B=32, M=N=K=4096</td>
<td>ASW 切 M/N 引入无谓共享读取MergeBatch 引入无谓浪费</td>
</tr>
<tr>
<td>MergeBatch</td>
<td>B=64, M=N=64, K=256</td>
<td>IterBatch 的 L0C 利用率仅 6.25%Cube 闲置 ~94%</td>
</tr>
<tr>
<td>ASW_Basic</td>
<td>B=2, M=N=8192, K=1024</td>
<td>切 B 仅 2 核活跃StreamK 付无谓归约</td>
</tr>
<tr>
<td>StreamK</td>
<td>B=1, M=N=64, K=65536</td>
<td>不切 K 只用 16/32 核P=16时延差数量级文档 Case 319.5ms → 0.61μs/核量级)</td>
</tr>
</tbody>
</table>
<p>⇒ 四者<strong>互为不可替代,构成极小完备集</strong></p>
<hr />
<h2>7. 边界是软的:竞争区域由时延模型仲裁</h2>
<p>上面的判据给出的是分支的&quot;主场&quot;,但相邻分支的边界不是硬切换。重叠区域(如 B ≥ 32 且 M×N 中等时 IterBatch 与 ASW 切 B 等效M×N 在 64²~128² 之间时 MergeBatch 与 IterBatch 互有胜负)必须由统一点评仲裁:</p>
<p>$$
\text{branch}^* = \arg\min_{\text{cand} \in \bigcup \text{4 分支候选}} \max\big(T_{MMAD}, T_{MTE2}, T_{MTE1}, T_{FIXPIPE}, T_{REDUCE}\big)
$$</p>
<p>这就是《方案设计》§6.7 决策算法&quot;全分支生成候选 → 时延模型评估 → 取 min&quot;的合理性来源:<strong>分支体系保证候选集完备且无冗余(每个等价类只派一个代表框架),时延模型在等价类内部和边界上做精细仲裁。</strong> 两层结构缺一不可——只有时延模型没有分支体系,搜索空间是 15 种组合 × 全部 grid爆炸且重复只有分支体系没有时延模型边界 case 会被错误硬切。</p>
<hr />
<h2>8. 闭环:与分块计算公式的参数特化对应</h2>
<p>最后把推导结果写回分块公式的语言验证链条闭合对应《BMM分块计算数学公式》第六章但现在每行都有了&quot;理由&quot;</p>
<table>
<thead>
<tr>
<th>分支</th>
<th>分块参数特化</th>
<th>推导出处</th>
</tr>
</thead>
<tbody>
<tr>
<td>IterBatch</td>
<td>$B^t = 1$$\tilde B \ge C$batch 为核间最外层;核内标准 K 累加</td>
<td>§5.1:零代价并行够 + Cube 饱</td>
</tr>
<tr>
<td>MergeBatch</td>
<td>$B^t = b > 1$ 折叠进 $M^t_{eff} = bM^t, N^t_{eff} = bN^t$L0C 二次方程求最优 $b$BlockTrace 取对角</td>
<td>§5.2Cube 饿 → 折叠 batch 换 $U \uparrow$,浪费被访存 Bound 掩盖</td>
</tr>
<tr>
<td>ASW_Basic</td>
<td>通用 $(\beta, \mu, \nu)$ 展开;$\sigma$ = ASW 滑窗蛇形($W \le \lfloor\sqrt C\rfloor$ 的最大因子) | §5.3:低代价维度补并行,$\sigma$ 压缩 L2 足迹</td>
<td></td>
</tr>
<tr>
<td>StreamK</td>
<td>$\tilde K$ 跨核拆分,$C_{(\beta,\mu,\nu)} = \sum_c C^{(c)}$ 部分和归约grid_K×grid_B×grid_M×grid_N ≤ C</td>
<td>§5.4:便宜维度用尽,付归约代价买 K 维并行</td>
</tr>
</tbody>
</table>
<hr />
<h2>9. 总结:一句话逻辑链</h2>
<blockquote>
<p><strong>分块计算给出自由度4 维怎么切硬件给出规则L0C 累加使切 K 独贵、batch 独立使切 B 免费、L2 使切 M/N 廉价最优目标给出约束核要满、Cube 要饱、搬运要省)。按&quot;最便宜的维度优先购买并行度、Cube 不够大就折叠 batch、便宜维度用尽才切 K&quot;的原则展开15 种切分组合在 (含K, 含M/N) 两个代价特征下恰好坍缩为 4 个等价类——这就是 MergeBatch / IterBatch / ASW_Basic / StreamK 四大分支,完备且极小;边界区域由端到端时延模型统一仲裁。</strong></p>
</blockquote>
<hr />
<p><em>文档版本v1.0 | 上游《BMM分块计算数学公式》v1.1+ | 下游《BMM最优软件实现方案设计》v4.0 第六章</em></p>
</div>
</body>
</html>