v0.91: 同步HTML
This commit is contained in:
@@ -153,22 +153,23 @@ $$</div>
|
||||
<tr><td>$T_{load}$</td><td>每 K 分块搬移时延</td><td>$k_{L1}(M{+}N)\cdot\text{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_{bd}$</td><td>batch 边界固定开销</td><td>fixpipe 同步 + L1 状态切换 + 流水线冲刷</td></tr>
|
||||
<tr><td>$T_{bd}$</td><td>batch 边界固定开销</td><td>fixpipe 启动握手(详见下文物理成因)</td></tr>
|
||||
<tr><td>$BW_{pc}$</td><td>单核 GM 带宽份额</td><td>$W_{GM}/C$</td></tr></table>
|
||||
<p> *一阶流水模型*(unitflag 交叠 batch 间 drain/startup):</p>
|
||||
<div class="math"> $$T_{iter} = b_{core} \cdot n_K \cdot \max(T_{load},\, T_{comp}) + T_{comp} + T_{write}$$</div>
|
||||
<p> MergeBatch 合并后 $k_{L1}^m = \min(K,\; k_{L1}/b_0)$——L1 绑定($k_{L1}<K$)时 $k_{L1}^m = k_{L1}/b_0$;K 截断($k_{L1}=K$)时 $k_{L1}^m = K$ 不减半。以 L1 绑定为例:</p>
|
||||
<div class="math"> $$T_{mb} = b_{core} \cdot n_K \cdot \max(T_{load},\; b_0 T_{comp}) + b_0(T_{comp} + T_{write})$$</div>
|
||||
<p> 条件 5 保证合并后仍访存 Bound($T_{load} > b_0 T_{comp}$),此时:</p>
|
||||
<div class="math"> $$T_{mb} - T_{iter} = (b_0-1)(T_{comp} + T_{write}) > 0$$</div>
|
||||
<p> <b>一阶模型下 MergeBatch 始终不优于 IterBatch</b>——稳态吞吐相同(总搬移量、每块大小、总块数都相同),MergeBatch 的 drain 暴露是 IterBatch 的 $b_0$ 倍。</p>
|
||||
<p> *二阶修正——batch 边界固定开销*:每 batch 边界有固定开销 $T_{bd}$,MergeBatch 边界数少 $b_0$ 倍:</p>
|
||||
<div class="math"> $$T_{iter} = \text{一阶} + b_{core} \cdot T_{bd},\qquad T_{mb} = \text{一阶} + \frac{b_{core}}{b_0} \cdot T_{bd}$$</div>
|
||||
<p> <b>分界条件</b>(MergeBatch 优于 IterBatch 当且仅当 $\Delta = T_{mb} - T_{iter} < 0$):</p>
|
||||
<p> *端到端时延模型*:对每核执行过程建模。稳态流水(unitflag 交叠 batch 间 drain/startup)加上 batch 边界固定开销 $T_{bd}$(每边界一次):</p>
|
||||
<div class="math"> $$T_{iter} = \underbrace{b_{core} \cdot n_K \cdot \max(T_{load},\, T_{comp})}_{\text{稳态流水}} + \underbrace{T_{comp} + T_{write}}_{\text{末 batch drain}} + \underbrace{b_{core} \cdot T_{bd}}_{\text{边界开销}}$$</div>
|
||||
<div class="math"> $$T_{mb} = \underbrace{b_{core} \cdot n_K \cdot \max(T_{load},\, b_0 T_{comp})}_{\text{稳态流水}} + \underbrace{b_0(T_{comp} + T_{write})}_{\text{末合并 batch drain}} + \underbrace{\frac{b_{core}}{b_0} \cdot T_{bd}}_{\text{边界开销}}$$</div>
|
||||
<p> 其中 MergeBatch 合并后 $k_{L1}^m = \min(K,\; k_{L1}/b_0)$——L1 绑定($k_{L1}<K$)时 $k_{L1}^m = k_{L1}/b_0$;K 截断($k_{L1}=K$)时 $k_{L1}^m = K$ 不减半。以 L1 绑定为例。</p>
|
||||
<p> 条件 5 保证合并后仍访存 Bound($T_{load} > b_0 T_{comp}$),两式相减:</p>
|
||||
<div class="math"> $$\Delta = 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_{bd}}_{\text{边界节省}}$$</div>
|
||||
<p> <b>分界条件</b>(MergeBatch 优于 IterBatch 当且仅当 $\Delta < 0$):</p>
|
||||
<div class="math"> $$b_{core} > \frac{b_0 \cdot \text{penalty}}{T_{bd}},\qquad
|
||||
\text{penalty} = \begin{cases} (b_0-1)(T_{comp} + T_{write}) & \text{L1 绑定(}k_{L1} \lt K\text{)} \\ (b_0^2-1)T_{comp} + (b_0-1)T_{write} & \text{K 截断(}k_{L1} = K\text{)} \end{cases}$$</div>
|
||||
<p> K 截断时 MergeBatch 的 $k_{L1}$ 不减半 → 每分块计算量 $b_0^2$ 倍(而非 $b_0$ 倍)→ drain 惩罚更大。小 MN 时 $T_{comp}$ 小 → penalty 小 → MergeBatch 更容易赢;大 B 时 $b_{core}$ 大 → 边界节省多 → MergeBatch 更容易赢。</p>
|
||||
<p> 条件 1($b_{core} \ge 2b_0$)是该分界在典型 $T_{bd}$ 下的保守近似。精确边界依赖 $T_{bd}$ 实测标定。</p>
|
||||
<p> penalty 两种情形的含义:drain 暴露 = 末(合并)batch 最后一个 K 分块的计算时延 + 输出写回时延——这部分没有下一块搬移可交叠,是流水线的 drain 尾部。</p>
|
||||
<ul class="tight">
|
||||
<li><b>L1 绑定</b>($k_{L1} < K$):L1 容量限制了 K 分块粒度,MergeBatch 合并后 tile 更大 → $k_{L1}$ 减半 → 每分块计算量 $b_0$ 倍 → drain 惩罚 $= (b_0-1)(T_{comp}+T_{write})$;</li>
|
||||
<li><b>K 截断</b>($k_{L1} = K$):整个 K 装入 L1 一块,MergeBatch 合并后 $k_{L1}$ 不减半(仍等于 K)→ 每分块计算量 $b_0^2$ 倍($b_0^2 MN$ 输出 $\times$ $K$ 深度)→ drain 惩罚 $= (b_0^2-1)T_{comp} + (b_0-1)T_{write}$,更严格。</li>
|
||||
</ul>
|
||||
<p> 小 MN 时 $T_{comp}$ 小 → penalty 小 → MergeBatch 更容易赢;大 B 时 $b_{core}$ 大 → 边界节省多 → MergeBatch 更容易赢。条件 1($b_{core} \ge 2b_0$)是该分界在典型 $T_{bd}$ 下的保守近似,精确边界依赖 $T_{bd}$ 实测标定。</p>
|
||||
<p> **$T_{bd}$ 的物理成因**(batch 边界处硬件必须完成的固定动作):</p>
|
||||
<p> 从 IterBatch 的 kernel 侧源码(<code>cmct/block/block_mmad_iterbatch.h</code>)可直接观察到 batch 边界的 Set/Wait 同步序列:</p>
|
||||
<pre><code> // 当前 batch 最后一个 K 分块结束后:
|
||||
@@ -187,9 +188,9 @@ $$</div>
|
||||
<p> <b>证据来源</b>:</p>
|
||||
<table><tr><th>证据</th><th>文件</th><th>内容</th></tr>
|
||||
<tr><td>MMAD→Fixpipe 同步开销存在</td><td><code>CANN社区版9.2.0-beta.1/02_API参考/AscendC_API/180_..._UnitFlag.md</code></td><td>"未开启UnitFlag功能时,MMAD和FIXPIPE是指令级别的同步……流水串行";实测 7.3% 改善(M=128,N=30720,K=64)</td></tr>
|
||||
<tr><td>同步指令是高开销指令</td><td><code>CANN社区版9.2.0-beta.1/01_AscendC算子开发/260_..._SIMT算子性能优化.md</code></td><td>"除法、取模、<b>同步</b>、原子操作等都属于<b>高开销指令</b>"</td></tr>
|
||||
<tr><td>编译器默认插入同步指令</td><td><code>CANN社区版9.2.0-beta.1/01_AscendC算子开发/048_..._算子编译基本用法.md</code></td><td>"默认会插入内存同步指令……这些同步指令<b>会带来性能开销</b>"</td></tr>
|
||||
<tr><td>同步机制是架构级关注点</td><td><code>00_硬件/昇腾950_NPU架构白皮书.pdf</code> §4.1.6</td><td>新增 BufferID 同步机制替代 set_flag/wait_flag——"降低了同步的复杂度"</td></tr></table>
|
||||
<p> 注:非融合场景下 IterBatch/MergeBatch 仅使用 AIC(Cube),AIV 不参与(<code>kernel_matmul_iterbatch.h</code> line 295-297:<code>if (!enableFusion) { if ASCEND_IS_AIV { return; } }</code>),故不引用 AIV 侧同步文献。</p>
|
||||
<p> $T_{bd}$ ≈ fixpipe 启动握手延迟(寄存器写入 + DMA 启动),量级估计为数十 ns。知识库未给出精确数值,需实测标定。</p>
|
||||
<p> 这些开销<b>与 batch 的计算量无关</b>,是每次 batch 切换的固定成本。大 batch 时被大量计算分摊,占比可忽略;小 batch 时每个 batch 绝对时延短,边界开销占比显著。MergeBatch 把 $b_0$ 个 batch 并为一次大矩阵计算,边界数降 $b_0$ 倍——<b>这是 MergeBatch 的结构性收益来源</b>。</p>
|
||||
<p> <b>MergeBatch vs IterBatch 优势总结</b>:</p>
|
||||
|
||||
Reference in New Issue
Block a user