v1.0: 同步HTML

This commit is contained in:
2026-08-26 11:43:16 +00:00
parent 9f2a1501fc
commit c3c9e80353

View File

@@ -113,36 +113,87 @@ $$</div>
<p>若 $k_{L1}^* &gt; 512B/dtype$$k_{L1}$ 被 512B 截断,省出的 L1 空间可容纳更多 batch$b_{L1} &gt; b_0$),提升 batch 间流水深度。</p>
<hr>
<h2>四、MergeBatch vs IterBatch 分界分析</h2>
<h3>4.1 核心差异GM→L1 搬移粒度</h3>
<p>从 kernel 侧源码可直接观察</p>
<h3>4.1 执行模型与符号定义</h3>
<p>两分支的核间切分相同——B 维切分到 C 核,每核 $b_{core} = B/C$ 个 batch核内不切 M/N。差异在核内 K 维处理和 GM→L1 搬移粒度</p>
<ul class="tight">
<li><b>IterBatch</b><code>block_mmad_iterbatch.h</code> CopyInA1<code>ndNum = curIterBatchL1</code>多块独立寻址<code>srcNdMatrixStride = M*K</code></li>
<li><b>MergeBatch</b><code>block_mmad_mergebatch.h</code> CopyInA1<code>ndNum = 1</code>(合并为单块连续搬移<code>nValue = b0 × M</code></li>
<li><b>IterBatch</b>:逐 batch 处理。每 batch 的 $A[M,K]+B[K,N]$ 作为独立 DMA 操作搬入 L1源码 <code>ndNum = curIterBatchL1</code>多块独立寻址),然后在 L1 内逐 batch 计算</li>
<li><b>MergeBatch</b>:合并处理。$b_0$ 个 batch 的 $A'[b_0 M, K]+B'[K, b_0 N]$ 合并为一个大矩阵,作为<b>单次 DMA 操作</b>搬入 L1源码 <code>ndNum = 1</code>单块连续搬移),然后合并计算</li>
</ul>
<p>每次 GM→L1 DMA 搬移有固定开销 $T_{cmd}$(描述符配置 + 地址生成 + 突发启动与搬移数据量无关。MergeBatch 把 $b_0$ 次搬移合并为 1 次,$T_{cmd}$ 节省 $b_0$ 倍。</p>
<h3>4.2 分情形分析</h3>
<p><b>K 截断情形</b>$k_{L1} = K$,整个 K 装入 L1 一块):</p>
<p>IterBatch 每 batch 一次 GM→L1 搬移MergeBatch 每合并 batch 一次(覆盖 $b_0$ 个 batch搬移次数少 $b_0$ 倍:</p>
<p>*符号表*</p>
<table><tr><th>符号</th><th>含义</th><th>表达式/取值</th></tr>
<tr><td>$C$</td><td>AIC 核数</td><td>32</td></tr>
<tr><td>$b_{core}$</td><td>每核 batch 数</td><td>$B/C$</td></tr>
<tr><td>$b_0$</td><td>合并因子(单次合并的 batch 数)</td><td>由 L0C + 算存比双上限确定</td></tr>
<tr><td>$k_{L1}$</td><td>L1 级 K 分块粒度</td><td>$\min(K,\; L1/(2(M{+}N) \cdot dtype))$</td></tr>
<tr><td>$n_K$</td><td>K 分块数</td><td>$\lceil K/k_{L1} \rceil$</td></tr>
<tr><td>$T_{load}$</td><td>每 K 分块搬移时延</td><td>$k_{L1}(M{+}N) \cdot dtype / BW_{pc}$</td></tr>
<tr><td>$T_{comp}$</td><td>每 K 分块计算时延</td><td>$2MN \cdot k_{L1} / Q_{16}$</td></tr>
<tr><td>$T_{write}$</td><td>单 batch 输出写回时延</td><td>$MN \cdot outB / W_{GM}$</td></tr>
<tr><td>$T_{cmd}$</td><td>单次 GM→L1 DMA 搬移固定开销</td><td>描述符配置 + 地址生成 + 突发启动</td></tr>
<tr><td>$BW_{pc}$</td><td>单核 GM 带宽份额</td><td>$W_{GM}/C = 50$ GB/s</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 带宽</td><td>1.6 TB/s</td></tr>
<tr><td>$outB$</td><td>输出元素字节数</td><td>BF16 → 2B</td></tr></table>
<h3>4.2 端到端时延建模</h3>
<p>L0C 双缓冲使 fixpipe 与 Cube 完全交叠,<b>batch 边界无额外同步开销</b>。两分支的差异仅来自 GM→L1 搬移次数和 drain 暴露。</p>
<p><b>IterBatch 时延</b>(每核处理 $b_{core}$ 个 batch每 batch $n_K$ 个 K 分块):</p>
<div class="math">$$
\Delta_K = \underbrace{(b_0-1)(T_{comp} + T_{write})}_{\text{drain 惩罚}} - \underbrace{b_{core}\Big(1-\frac{1}{b_0}\Big) T_{cmd}}_{\text{搬移命令节省}}
T_{iter} = \underbrace{b_{core} \cdot n_K \cdot (T_{load} + T_{cmd})}_{\text{搬移(逐 batch每次含 } T_{cmd}\text{}} + \underbrace{T_{comp} + T_{write}}_{\text{末 batch drain}}
$$</div>
<p><b>L1 绑定情形</b>$k_{L1} &lt; K$K 分块):</p>
<p>MergeBatch 合并后 tile 更大 → $k_{L1}^m = k_{L1}/b_0$ → $n_K^m = b_0 \cdot n_K$。搬移次数相同($b_{core} \cdot n_K$),每次搬移量也相同——<b>MergeBatch 无搬移优势</b>,只剩 drain 惩罚:</p>
<p><b>MergeBatch 时延</b>(每核处理 $b_{core}/b_0$ 个合并 batch每合并 batch $n_K^m$ 个 K 分块):</p>
<div class="math">$$
\Delta_L = (b_0-1)(T_{comp} + T_{write}) > 0
T_{mb} = \underbrace{\frac{b_{core}}{b_0} \cdot n_K^m \cdot (T_{load}^m + T_{cmd})}_{\text{搬移(合并,每次含 } T_{cmd}\text{}} + \underbrace{b_0 \cdot (T_{comp} + T_{write})}_{\text{末合并 batch drain}}
$$</div>
<p><b>L1 绑定情形 MergeBatch 恒劣于 IterBatch</b></p>
<h3>4.3 统一分界条件</h3>
<p>其中 $T_{load}^m$ 是合并后每 K 分块的搬移时延,$n_K^m$ 是合并后的 K 分块数——两者的取值取决于 $k_{L1}$ 是否截断(见下)</p>
<p><b>合并后 K 分块粒度</b>MergeBatch 合并 $b_0$ 个 batch 后L1 中的 tile 变为 $[b_0 M, k_{L1}^m] + [k_{L1}^m, b_0 N]$。L1 容量约束:</p>
<div class="math">$$
\text{MergeBatch 最优} \iff k_{L1} = K \;\land\; b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}}
2 \cdot k_{L1}^m \cdot b_0 \cdot (M+N) \cdot dtype \le L1 \Rightarrow k_{L1}^m = \min\Big(K,\; \frac{k_{L1}}{b_0}\Big)
$$</div>
<p>即 MergeBatch 仅在 <b>K 截断</b>(小 M/N 使 $L1/(2(M+N) \cdot dtype) \ge K$)且 $b_{core}$ 足够大时才优于 IterBatch。</p>
<ul class="tight">
<li><b>K 截断</b>$k_{L1} = K$$k_{L1}^m = K$ 不减半,$n_K^m = 1$——整个 K 装入 L1 一块</li>
<li><b>L1 绑定</b>$k_{L1} &lt; K$$k_{L1}^m = k_{L1}/b_0$ 减半,$n_K^m = b_0 \cdot n_K$——K 分块数 $b_0$ 倍</li>
</ul>
<h3>4.3 K 截断情形($k_{L1} = K$</h3>
<p>$n_K = n_K^m = 1$$T_{load}^m = b_0 \cdot T_{load}$(合并后单次搬移数据量 $b_0$ 倍):</p>
<div class="math">$$
T_{iter} = b_{core}(T_{load} + T_{cmd}) + T_{comp} + T_{write}
$$</div>
<div class="math">$$
T_{mb} = \frac{b_{core}}{b_0}(b_0 \cdot T_{load} + T_{cmd}) + b_0(T_{comp} + T_{write})
$$</div>
<p>两式相减:</p>
<div class="math">$$
\Delta_K = T_{mb} - T_{iter} = \underbrace{(b_0-1)(T_{comp} + T_{write})}_{\text{drain 惩罚}} - \underbrace{b_{core}\Big(1-\frac{1}{b_0}\Big) T_{cmd}}_{\text{搬移命令节省}}
$$</div>
<p><b>分界条件</b>MergeBatch 优于 IterBatch 当且仅当 $\Delta_K &lt; 0$</p>
<div class="math">$$
b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}}
$$</div>
<p>小 MN → $T_{comp}$ 小 → 惩罚小 → MergeBatch 更容易赢;大 B → $b_{core}$ 大 → 搬移节省多 → MergeBatch 更容易赢。</p>
<h3>4.4 L1 绑定情形($k_{L1} &lt; K$</h3>
<p>$k_{L1}^m = k_{L1}/b_0$$n_K^m = b_0 \cdot n_K$$T_{load}^m = T_{load}$(每块搬移量相同,因为 $k_{L1}^m \cdot b_0 = k_{L1}$</p>
<div class="math">$$
T_{iter} = b_{core} \cdot n_K \cdot (T_{load} + T_{cmd}) + T_{comp} + T_{write}
$$</div>
<div class="math">$$
T_{mb} = \frac{b_{core}}{b_0} \cdot b_0 n_K \cdot (T_{load} + T_{cmd}) + b_0(T_{comp} + T_{write}) = b_{core} \cdot n_K \cdot (T_{load} + T_{cmd}) + b_0(T_{comp} + T_{write})
$$</div>
<p>搬移次数相同($b_{core} \cdot n_K$),每次搬移量相同——<b>MergeBatch 无搬移优势</b></p>
<div class="math">$$
\Delta_L = T_{mb} - T_{iter} = (b_0-1)(T_{comp} + T_{write}) > 0
$$</div>
<p><b>L1 绑定情形 MergeBatch 恒劣于 IterBatch</b>——合并只放大了 drain 暴露,没有换来搬移命令节省。</p>
<h3>4.5 统一分界条件</h3>
<div class="math">$$
\text{MergeBatch 最优} \iff \underbrace{k_{L1} = K}_{\text{K 截断}} \;\land\; \underbrace{b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}}}_{\text{搬移节省} > \text{drain 惩罚}}
$$</div>
<p>K 截断的物理含义:$L1/(2(M{+}N) \cdot dtype) \ge K$——小 M/N 使 L1 一次装下整个 K 维。</p>
<table><tr><th>维度</th><th>IterBatch</th><th>MergeBatch</th><th>差异</th></tr>
<tr><td>稳态搬移吞吐</td><td>相同</td><td>相同</td><td>总搬移量相同</td></tr>
<tr><td>GM→L1 搬移命令数</td><td>$b_{core}$ 次</td><td>$b_{core}/b_0$ 次</td><td>**MergeBatch 少 $b_0$ 倍** ← 核心优势</td></tr>
<tr><td>GM→L1 搬移命令数</td><td>$b_{core}$ 次</td><td>$b_{core}/b_0$ 次K 截断时)</td><td>**MergeBatch 少 $b_0$ 倍** ← 核心优势</td></tr>
<tr><td>drain 暴露</td><td>$T_{comp} + T_{write}$</td><td>$b_0(T_{comp} + T_{write})$</td><td>IterBatch 少 $b_0$ 倍 ← 核心劣势</td></tr>
<tr><td>L0C 利用率</td><td></td><td></td><td>访存 Bound 下不影响时延</td></tr></table>
<h3>4.4 $T_{cmd}$ 的物理成因</h3>
<h3>4.6 $T_{cmd}$ 的物理成因</h3>
<p>每次 GM→L1 DMA 搬移的固定开销包括Nd2Nz 描述符配置ndNum/nValue/dValue/srcStride 等 7 个字段写入 DMA 寄存器)、地址生成与突发启动、与 L1 buffer 的同步握手(<code>SetFlag&lt;MTE2_MTE1&gt;</code> / <code>WaitFlag&lt;MTE1_MTE2&gt;</code>)。量级估计为数十 ns精确值需实测标定。</p>
<hr>
<h2>五、与源码实现的对比</h2>