From 93411c15b7cd683f69635a9128c6c6dc4d10615c Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 27 Aug 2026 09:40:15 +0000 Subject: [PATCH] =?UTF-8?q?v1.4:=20=E5=90=8C=E6=AD=A5HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ASW_Basic分支分析_v1.4.html | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.4.html b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.4.html index b68fba5..f6a568a 100644 --- a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.4.html +++ b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.4.html @@ -256,29 +256,40 @@ $$ \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 单次搬移量}} $$

约束 4——SingleCoreM/N 是 BaseM/N 的整数倍(工程实现要求,保证 L0 tile 边界对齐)。

-

*选取策略*:在满足约束 1 的前提下,SingleCoreM/N 尽量大(搬移效率和 L2 复用最大化)。长宽比由搬入时延建模确定

-

*建模*:每核每块的 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$ 块,单核总搬入时延:

+

*选取策略*:最少切分原则 + 切分时方形分配

+

*建模*:每 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$ 块,单核总搬入时延:

$$ -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} $$
-

$MN/(C/B)$ 与 $k_{L1} \cdot dtype/BW$ 为常数,目标函数化为:

+

(展开验证:每 batch 总搬入 = $(M \cdot nCnt + N \cdot mCnt) \cdot k_{L1} \cdot dtype$——A 矩阵每 batch 被 $nCnt$ 个列块共享读 $nCnt$ 次、B 矩阵被 $mCnt$ 个行块共享读 $mCnt$ 次,与直觉一致。)

+

目标函数 $mCnt/M + nCnt/N$ 在 $mCnt = nCnt = 1$ 时取得全局最小值($1/M + 1/N$)——不切分时每 batch 的 A/B 只搬一次,零重复读。因此第一步是尝试最少切分

$$ -\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 $$
-

拉格朗日:$nCnt = P/mCnt$($P = \lceil C/B \rceil$),求导 $1/M - P/(mCnt^2 N) = 0$:

+

(多切无益:切分越多重复读越多,搬入量单调增大。)

+

情形 1:B ≥ C(P = 1)——不切分,$mCnt = nCnt = 1$,$\text{singleCoreM} = M$、$\text{singleCoreN} = N$。tile 跟随 M/N,非方形。前提是 L1 容量与 dValue 满足(约束 2/3);不满足时须 K 分块($k_{L1} < K$)或退化为情形 2。

+

情形 2:B < C(P > 1)——必须切分。在 $mCnt \cdot nCnt = P$ 下最小化 $mCnt/M + nCnt/N$:

$$ -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}} $$
-

代入得 $\text{singleCoreM} = M/mCnt^* = \sqrt{MN/P} = N/nCnt^* = \text{singleCoreN}$——方形

-

结论:搬入时延最优 ⟺ mCnt/nCnt ≈ M/N ⟺ SingleCoreM ≈ SingleCoreN(方形 tile)。之前的"SingleCoreM/N 长宽比跟随 M/N"说法是错的——跟随 M/N 的是块数比 mCnt/nCnt,其效果恰恰是 singleCoreM/N 方形。

-

*数值验证*(M=4096、N=1024、P=32):mCnt=16,nCnt=2(sM=256,sN=512,比 0.5)成本 0.005859;mCnt=11,nCnt=3(sM=372,sN=341,比 1.09)成本 0.005615——方形更优,搬入时延省 4.2%

-

*约束 4 的修正*:方形受 BaseM/N 整数倍约束,实际取离 $\sqrt{MN/P}$ 最近且满足 $\text{singleCoreM} \ge \text{BaseM}$、$\text{singleCoreN} \ge \text{BaseN}$ 的 16 对齐组合;当 N 太小($\text{singleCoreN} = N < \text{BaseN}$ 的 case 不存在,因为 $\text{BaseN} \le \min(256, N)$)时方形自然退化为跟随 N。

+
$$ +\frac{mCnt^*}{nCnt^*} = \frac{M}{N} \Rightarrow \text{singleCoreM} = \text{singleCoreN} = \sqrt{\frac{MN}{P}} +$$
+

——方形(连续松弛下的理论最优)。整数 + BaseM/N 对齐约束下取离方形最近的可行组合。

+

*数值验证*(M=2048、N=512、C=32):

+ + + + +
BP = ⌈C/B⌉最优 (mCnt, nCnt)sM × sN形状
321(1, 1)2048 × 512跟随 M/N(不切分)
162(2, 1)1024 × 5122:1(整数约束偏离方形)
84(4, 1)512 × 512方形(M/N=4 与 P=4 匹配)
48(4, 2)512 × 2562:1
+

B=32 时不切分 cost = 0.002441 < B=8 时方形 0.003906——切分越少搬入越少,方形只是"被迫切分"时的次优选择。用户反例成立:M=2048、N=512、B≥32 时 SingleCoreM=2048、SingleCoreN=512 优于方形 512×512(每 batch 零重复读)。

+

*此前推导的错误*:把 $mCnt \cdot nCnt = P$ 当作固定等式且未讨论 P=1 的情形——方形结论只适用于 B < C 的强制切分场景,不适用于 B ≥ C 的不切分场景。

*SingleCoreM/N 的具体确定过程*(host 端枚举,与尾轮处理联动):

    -
  1. 从约束 1 得到最小块数:$mnCnt_{min} = \lceil C/B \rceil$
  2. -
  3. 枚举 $(mCnt, nCnt)$ 组合,$mCnt \cdot nCnt \ge mnCnt_{min}$,从大到小遍历 singleCoreM = $\lceil M/mCnt \rceil_{16}$、singleCoreN = $\lceil N/nCnt \rceil_{16}$
  4. -
  5. 对每个组合检查约束 2/3/4(L1 容量、搬移效率、BaseM/N 整数倍)
  6. -
  7. 计算尾波占比:$r = B \cdot mCnt \cdot nCnt \bmod C$,优先选 $r = 0$ 或 $r$ 大的组合(尾波核数多 → 重切后 $s^*$ 小 → 小块 dValue 有保障)
  8. +
  9. 计算最少切分 $P = \lceil C/B \rceil$
  10. +
  11. 若 P = 1:$mCnt = nCnt = 1$,$\text{singleCoreM} = M$、$\text{singleCoreN} = N$;检查约束 2(L1 容量)与约束 3(dValue):满足则确定;不满足则 K 分块($k_{L1} = \lfloor L1/(2(M{+}N) \cdot dtype) \rfloor_{16}$,须 $k_{L1} \cdot dtype \ge 256\text{B}$),仍不满足则进入步骤 3
  12. +
  13. 若 P > 1:枚举 $(mCnt, nCnt)$,$mCnt \cdot nCnt \ge P$,从 $\sqrt{PM/N}$ 附近的整数开始(方形优先),检查约束 2/3/4(L1 容量、搬移效率、BaseM/N 整数倍)
  14. +
  15. 计算尾波占比:$r = B \cdot mCnt \cdot nCnt \bmod C$,优先选 $r = 0$ 或 $r$ 大的组合
  16. 若 $n_{wave} = \lceil B \cdot mCnt \cdot nCnt / C \rceil \le 3$ 且 $r > 0$,计算尾轮重切参数 $s^*$ 并评估重切后收益
  17. 选总时延最短的组合:$T_{total} = (n_{wave} - 1) \cdot T_{block} + T_{tail}$,其中 $T_{tail} = T_{block}/s^*$(重切)或 $T_{block}$(不重切)