v1.4: 修正方形结论适用范围——最少切分原则+B≥C不切分跟随M/N+B<C才方形
This commit is contained in:
@@ -329,40 +329,57 @@ $$
|
|||||||
|
|
||||||
**约束 4——SingleCoreM/N 是 BaseM/N 的整数倍**(工程实现要求,保证 L0 tile 边界对齐)。
|
**约束 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}$——**方形**。
|
$$
|
||||||
|
\frac{mCnt^*}{nCnt^*} = \frac{M}{N} \Rightarrow \text{singleCoreM} = \text{singleCoreN} = \sqrt{\frac{MN}{P}}
|
||||||
|
$$
|
||||||
|
|
||||||
**结论:搬入时延最优 ⟺ mCnt/nCnt ≈ M/N ⟺ SingleCoreM ≈ SingleCoreN(方形 tile)**。之前的"SingleCoreM/N 长宽比跟随 M/N"说法是错的——跟随 M/N 的是**块数比** mCnt/nCnt,其效果恰恰是 singleCoreM/N 方形。
|
——**方形**(连续松弛下的理论最优)。整数 + BaseM/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%**。
|
*数值验证*(M=2048、N=512、C=32):
|
||||||
|
|
||||||
*约束 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。
|
| B | P = ⌈C/B⌉ | 最优 (mCnt, nCnt) | sM × sN | 形状 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 32 | 1 | (1, 1) | 2048 × 512 | 跟随 M/N(不切分) |
|
||||||
|
| 16 | 2 | (2, 1) | 1024 × 512 | 2:1(整数约束偏离方形) |
|
||||||
|
| 8 | 4 | (4, 1) | 512 × 512 | 方形(M/N=4 与 P=4 匹配) |
|
||||||
|
| 4 | 8 | (4, 2) | 512 × 256 | 2: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 端枚举,与尾轮处理联动):
|
*SingleCoreM/N 的具体确定过程*(host 端枚举,与尾轮处理联动):
|
||||||
|
|
||||||
1. 从约束 1 得到最小块数:$mnCnt_{min} = \lceil C/B \rceil$
|
1. 计算最少切分 $P = \lceil C/B \rceil$
|
||||||
2. 枚举 $(mCnt, nCnt)$ 组合,$mCnt \cdot nCnt \ge mnCnt_{min}$,从大到小遍历 singleCoreM = $\lceil M/mCnt \rceil_{16}$、singleCoreN = $\lceil N/nCnt \rceil_{16}$
|
2. **若 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
|
||||||
3. 对每个组合检查约束 2/3/4(L1 容量、搬移效率、BaseM/N 整数倍)
|
3. **若 P > 1**:枚举 $(mCnt, nCnt)$,$mCnt \cdot nCnt \ge P$,从 $\sqrt{PM/N}$ 附近的整数开始(方形优先),检查约束 2/3/4(L1 容量、搬移效率、BaseM/N 整数倍)
|
||||||
4. 计算尾波占比:$r = B \cdot mCnt \cdot nCnt \bmod C$,优先选 $r = 0$ 或 $r$ 大的组合(尾波核数多 → 重切后 $s^*$ 小 → 小块 dValue 有保障)
|
4. 计算尾波占比:$r = B \cdot mCnt \cdot nCnt \bmod C$,优先选 $r = 0$ 或 $r$ 大的组合
|
||||||
5. 若 $n_{wave} = \lceil B \cdot mCnt \cdot nCnt / C \rceil \le 3$ 且 $r > 0$,计算尾轮重切参数 $s^*$ 并评估重切后收益
|
5. 若 $n_{wave} = \lceil B \cdot mCnt \cdot nCnt / C \rceil \le 3$ 且 $r > 0$,计算尾轮重切参数 $s^*$ 并评估重切后收益
|
||||||
6. 选总时延最短的组合:$T_{total} = (n_{wave} - 1) \cdot T_{block} + T_{tail}$,其中 $T_{tail} = T_{block}/s^*$(重切)或 $T_{block}$(不重切)
|
6. 选总时延最短的组合:$T_{total} = (n_{wave} - 1) \cdot T_{block} + T_{tail}$,其中 $T_{tail} = T_{block}/s^*$(重切)或 $T_{block}$(不重切)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user