v1.4: 同步HTML

This commit is contained in:
2026-08-27 09:40:15 +00:00
parent 93f8730f89
commit 93411c15b7

View File

@@ -256,29 +256,40 @@ $$</div>
\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 单次搬移量}} \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> $$</div>
<p><b>约束 4——SingleCoreM/N 是 BaseM/N 的整数倍</b>(工程实现要求,保证 L0 tile 边界对齐)。</p> <p><b>约束 4——SingleCoreM/N 是 BaseM/N 的整数倍</b>(工程实现要求,保证 L0 tile 边界对齐)。</p>
<p>*选取策略*在满足约束 1 的前提下SingleCoreM/N 尽量大(搬移效率和 L2 复用最大化)。<b>长宽比由搬入时延建模确定</b></p> <p>*选取策略*<b>最少切分原则 + 切分时方形分配</b></p>
<p>*建模*:每每块的 GM→L1 搬入A 块 $[\text{singleCoreM}, k_{L1}]$ + B 块 $[k_{L1}, \text{singleCoreN}]$)时延为 $(\text{singleCoreM} + \text{singleCoreN}) \cdot k_{L1} \cdot dtype / BW$。每核处理 $mCnt \cdot nCnt \cdot B / C$ 块,单核总搬入时延:</p> <p>*建模*:每 batch 有 $mCnt \cdot nCnt$ 块,每块的 GM→L1 搬入A 块 $[\text{singleCoreM}, k_{L1}]$ + B 块 $[k_{L1}, \text{singleCoreN}]$)时延为 $(\text{singleCoreM} + \text{singleCoreN}) \cdot k_{L1} \cdot dtype / BW$。每核处理 $B \cdot mCnt \cdot nCnt / C$ 块,单核总搬入时延:</p>
<div class="math">$$ <div class="math">$$
T_{MTE2} = \frac{MN}{C/B} \cdot \Big(\frac{1}{\text{singleCoreM}} + \frac{1}{\text{singleCoreN}}\Big) \cdot \frac{k_{L1} \cdot dtype}{BW} = \frac{MN}{C/B} \cdot \Big(\frac{mCnt}{M} + \frac{nCnt}{N}\Big) \cdot \frac{k_{L1} \cdot dtype}{BW} T_{MTE2} = \frac{MN}{C/B} \cdot \Big(\frac{mCnt}{M} + \frac{nCnt}{N}\Big) \cdot \frac{k_{L1} \cdot dtype}{BW}
$$</div> $$</div>
<p>$MN/(C/B)$ 与 $k_{L1} \cdot dtype/BW$ 为常数,目标函数化为:</p> <p>(展开验证:每 batch 总搬入 = $(M \cdot nCnt + N \cdot mCnt) \cdot k_{L1} \cdot dtype$——A 矩阵每 batch 被 $nCnt$ 个列块共享读 $nCnt$ 次、B 矩阵被 $mCnt$ 个行块共享读 $mCnt$ 次,与直觉一致。)</p>
<p>目标函数 $mCnt/M + nCnt/N$ 在 $mCnt = nCnt = 1$ 时取得<b>全局最小值</b>$1/M + 1/N$)——<b>不切分时每 batch 的 A/B 只搬一次,零重复读</b>。因此第一步是<b>尝试最少切分</b></p>
<div class="math">$$ <div class="math">$$
\min\;\Big(\frac{mCnt}{M} + \frac{nCnt}{N}\Big),\qquad \text{s.t.}\; mCnt \cdot nCnt \ge \lceil C/B \rceil mCnt \cdot nCnt = \Big\lceil \frac{C}{B} \Big\rceil \triangleq P
$$</div> $$</div>
<p>拉格朗日:$nCnt = P/mCnt$$P = \lceil C/B \rceil$),求导 $1/M - P/(mCnt^2 N) = 0$</p> <p>(多切无益:切分越多重复读越多,搬入量单调增大。)</p>
<p><b>情形 1B ≥ CP = 1</b>——不切分,$mCnt = nCnt = 1$$\text{singleCoreM} = M$、$\text{singleCoreN} = N$。<b>tile 跟随 M/N非方形</b>。前提是 L1 容量与 dValue 满足(约束 2/3不满足时须 K 分块($k_{L1} &lt; K$)或退化为情形 2。</p>
<p><b>情形 2B &lt; CP &gt; 1</b>——必须切分。在 $mCnt \cdot nCnt = P$ 下最小化 $mCnt/M + nCnt/N$</p>
<div class="math">$$ <div class="math">$$
mCnt^* = \sqrt{\frac{P \cdot M}{N}},\qquad nCnt^* = \sqrt{\frac{P \cdot N}{M}} \Rightarrow \frac{mCnt^*}{nCnt^*} = \frac{M}{N} \frac{\partial}{\partial mCnt}\Big(\frac{mCnt}{M} + \frac{P}{mCnt \cdot N}\Big) = 0 \Rightarrow mCnt^* = \sqrt{\frac{P \cdot M}{N}},\; nCnt^* = \sqrt{\frac{P \cdot N}{M}}
$$</div> $$</div>
<p>代入得 $\text{singleCoreM} = M/mCnt^* = \sqrt{MN/P} = N/nCnt^* = \text{singleCoreN}$——<b>方形</b></p> <div class="math">$$
<p><b>结论:搬入时延最优 ⟺ mCnt/nCnt ≈ M/N ⟺ SingleCoreM ≈ SingleCoreN方形 tile</b>。之前的"SingleCoreM/N 长宽比跟随 M/N"说法是错的——跟随 M/N 的是<b>块数比</b> mCnt/nCnt其效果恰恰是 singleCoreM/N 方形。</p> \frac{mCnt^*}{nCnt^*} = \frac{M}{N} \Rightarrow \text{singleCoreM} = \text{singleCoreN} = \sqrt{\frac{MN}{P}}
<p>*数值验证*M=4096、N=1024、P=32mCnt=16,nCnt=2sM=256,sN=512比 0.5)成本 0.005859mCnt=11,nCnt=3sM=372,sN=341比 1.09)成本 0.005615——<b>方形更优,搬入时延省 4.2%</b></p> $$</div>
<p>*约束 4 的修正*:方形受 BaseM/N 整数倍约束,实际取离 $\sqrt{MN/P}$ 最近且满足 $\text{singleCoreM} \ge \text{BaseM}$、$\text{singleCoreN} \ge \text{BaseN}$ 的 16 对齐组合;当 N 太小($\text{singleCoreN} = N &lt; \text{BaseN}$ 的 case 不存在,因为 $\text{BaseN} \le \min(256, N)$)时方形自然退化为跟随 N</p> <p>——<b>方形</b>(连续松弛下的理论最优)。整数 + BaseM/N 对齐约束下取离方形最近的可行组合</p>
<p>*数值验证*M=2048、N=512、C=32</p>
<table><tr><th>B</th><th>P = ⌈C/B⌉</th><th>最优 (mCnt, nCnt)</th><th>sM × sN</th><th>形状</th></tr>
<tr><td>32</td><td>1</td><td>(1, 1)</td><td>2048 × 512</td><td>跟随 M/N不切分</td></tr>
<tr><td>16</td><td>2</td><td>(2, 1)</td><td>1024 × 512</td><td>2:1整数约束偏离方形</td></tr>
<tr><td>8</td><td>4</td><td>(4, 1)</td><td>512 × 512</td><td>方形M/N=4 与 P=4 匹配)</td></tr>
<tr><td>4</td><td>8</td><td>(4, 2)</td><td>512 × 256</td><td>2:1</td></tr></table>
<p>B=32 时不切分 cost = 0.002441 &lt; B=8 时方形 0.003906——<b>切分越少搬入越少,方形只是"被迫切分"时的次优选择</b>。用户反例成立M=2048、N=512、B≥32 时 SingleCoreM=2048、SingleCoreN=512 优于方形 512×512每 batch 零重复读)。</p>
<p>*此前推导的错误*:把 $mCnt \cdot nCnt = P$ 当作固定等式且未讨论 P=1 的情形——方形结论只适用于 B &lt; C 的强制切分场景,不适用于 B ≥ C 的不切分场景。</p>
<p>*SingleCoreM/N 的具体确定过程*host 端枚举,与尾轮处理联动):</p> <p>*SingleCoreM/N 的具体确定过程*host 端枚举,与尾轮处理联动):</p>
<ol class="tight"> <ol class="tight">
<li>从约束 1 得到最小块数:$mnCnt_{min} = \lceil C/B \rceil$</li> <li>计算最少切分 $P = \lceil C/B \rceil$</li>
<li>枚举 $(mCnt, nCnt)$ 组合,$mCnt \cdot nCnt \ge mnCnt_{min}$,从大到小遍历 singleCoreM = $\lceil M/mCnt \rceil_{16}$、singleCoreN = $\lceil N/nCnt \rceil_{16}$</li> <li><b>若 P = 1</b>$mCnt = nCnt = 1$$\text{singleCoreM} = M$、$\text{singleCoreN} = N$;检查约束 2L1 容量)与约束 3dValue满足则确定不满足则 K 分块($k_{L1} = \lfloor L1/(2(M{+}N) \cdot dtype) \rfloor_{16}$,须 $k_{L1} \cdot dtype \ge 256\text{B}$),仍不满足则进入步骤 3</li>
<li>对每个组合检查约束 2/3/4L1 容量、搬移效率、BaseM/N 整数倍)</li> <li><b>若 P &gt; 1</b>:枚举 $(mCnt, nCnt)$$mCnt \cdot nCnt \ge P$,从 $\sqrt{PM/N}$ 附近的整数开始(方形优先),检查约束 2/3/4L1 容量、搬移效率、BaseM/N 整数倍)</li>
<li>计算尾波占比:$r = B \cdot mCnt \cdot nCnt \bmod C$,优先选 $r = 0$ 或 $r$ 大的组合(尾波核数多 → 重切后 $s^*$ 小 → 小块 dValue 有保障)</li> <li>计算尾波占比:$r = B \cdot mCnt \cdot nCnt \bmod C$,优先选 $r = 0$ 或 $r$ 大的组合</li>
<li>若 $n_{wave} = \lceil B \cdot mCnt \cdot nCnt / C \rceil \le 3$ 且 $r &gt; 0$,计算尾轮重切参数 $s^*$ 并评估重切后收益</li> <li>若 $n_{wave} = \lceil B \cdot mCnt \cdot nCnt / C \rceil \le 3$ 且 $r &gt; 0$,计算尾轮重切参数 $s^*$ 并评估重切后收益</li>
<li>选总时延最短的组合:$T_{total} = (n_{wave} - 1) \cdot T_{block} + T_{tail}$,其中 $T_{tail} = T_{block}/s^*$(重切)或 $T_{block}$(不重切)</li> <li>选总时延最短的组合:$T_{total} = (n_{wave} - 1) \cdot T_{block} + T_{tail}$,其中 $T_{tail} = T_{block}/s^*$(重切)或 $T_{block}$(不重切)</li>
</ol> </ol>