ASW_Basic v1.5: P>1完整枚举算法——有界枚举空间+评估流水线+T_MTE2目标函数+多解选取+实例
This commit is contained in:
@@ -377,15 +377,60 @@ B=32 时不切分 cost = 0.002441 < B=8 时方形 0.003906——**切分越少
|
||||
*SingleCoreM/N 的具体确定过程*(host 端枚举,与尾轮处理联动):
|
||||
|
||||
1. 计算最少切分 $P = \lceil C/B \rceil$
|
||||
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. **若 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$ 大的组合
|
||||
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}$(不重切)
|
||||
2. **若 P = 1(B ≥ C)**:先试不切分 $mCnt = nCnt = 1$、$\text{singleCoreM} = M$、$\text{singleCoreN} = N$;由约束 2 求 $k_{L1} = \min(K,\; \lfloor L1/(2(M{+}N) \cdot dtype) \rfloor_{16})$,检查约束 3($k_{L1} \cdot dtype \ge 256\text{B}$ 等);满足则确定。不满足(L1 放不下且 $k_{L1}$ 降无可降)则进入步骤 3 强制切分
|
||||
3. **若 P > 1(必须切分)——完整枚举**。枚举不是随意挑几个组合试,而是**遍历整个可行空间、每个候选计算搬入时延、取最优**:
|
||||
|
||||
*与源码的差异*:源码用 cubeBound 模型 + balanceRate ≥ 0.9 剪枝,不解耦 SingleCoreM/N 与 BaseM/N(baseM=256 已是 SingleCore 级参数,L0 tile 由 stepM/stepN 二次切分)。理论的两层分离使约束链更清晰——SingleCoreM/N 由 L1 + 并行度 + 搬移效率决定,BaseM/N 由 L0C 决定,各司其职。
|
||||
**a. 枚举空间(有界)**:由约束 4 给出上界 $mCnt \le \lceil M/\text{BaseM} \rceil$、$nCnt \le \lceil N/\text{BaseN} \rceil$(SingleCore 不能小于 Base),约束 1 给出 $B \cdot mCnt \cdot nCnt \ge C$。候选数最多 $\lceil M/\text{BaseM} \rceil \times \lceil N/\text{BaseN} \rceil$(如 M=N=4096、Base=256 时 256 个),host 端遍历开销可忽略
|
||||
|
||||
*例*(B=8、M=N=2048、K=1024、BF16):$\lceil C/B \rceil = 4$,取 $mCnt = nCnt = 2$ → singleCoreM = singleCoreN = 1024。BaseM = BaseN = $\lfloor\sqrt{32768}\rfloor_{16} = 176$。SingleCoreM/BaseM = 1024/176 ≈ 5.8 → 取 5(整数倍)→ singleCoreM = 880。约束 2:$k_{L1} \le 512\text{KB}/(2 \times 1760 \times 2\text{B}) = 74$ → 取 64(16 对齐)= 128B ✓。
|
||||
**b. 每个候选的评估流水线**($(mCnt, nCnt) \to$ 对齐 $\to$ 约束过滤 $\to$ 目标值):
|
||||
|
||||
$$
|
||||
\text{singleCoreM} = \text{Align}_{16}\Big(\Big\lceil \frac{M}{mCnt} \Big\rceil\Big),\qquad \text{singleCoreN} = \text{Align}_{16}\Big(\Big\lceil \frac{N}{nCnt} \Big\rceil\Big)
|
||||
$$
|
||||
|
||||
*约束 4 过滤*:singleCoreM/singleCoreN 是 BaseM/BaseN 的整数倍;*约束 2 求 $k_{L1}$*:
|
||||
|
||||
$$
|
||||
k_{L1} = \min\Big(K,\; \Big\lfloor \frac{L1}{2 \cdot (\text{singleCoreM} + \text{singleCoreN}) \cdot dtype} \Big\rfloor_{16}\Big)
|
||||
$$
|
||||
|
||||
*约束 3 过滤*:$k_{L1} \cdot dtype \ge 256\text{B}$ 且 $\text{singleCoreM} \cdot k_{L1} \cdot dtype \ge min\_TileSize$ 且 $k_{L1} \cdot \text{singleCoreN} \cdot dtype \ge min\_TileSize$
|
||||
|
||||
*目标值(§3 时延模型的搬移项)*:
|
||||
|
||||
$$
|
||||
T_{MTE2} = \frac{MN}{C/B} \cdot \Big(\frac{1}{\text{singleCoreM}} + \frac{1}{\text{singleCoreN}}\Big) \cdot \frac{k_{L1} \cdot dtype}{BW_{pc}}
|
||||
$$
|
||||
|
||||
**c. 为什么目标函数是 $T_{MTE2}$**:$T_{MMAD} = 2BMNK/(C \cdot Q_{16})$ 与 $T_{FIX} = B \cdot MN \cdot outB/(C \cdot W_{pc})$ 只依赖全量 B/M/N/K,**与切分无关**——候选之间的唯一差异在搬入时延(§3)。约束 2/3/4 只是可行性过滤,**不足以选最优**:多个可行解的 $T_{MTE2}$ 可差 2 倍(§6.3 源码过度切分示例)
|
||||
|
||||
**d. 最优选取**:通过全部约束的候选中取 $T_{MTE2}$ 最小者;并列时取尾轮块数 $r = B \cdot mCnt \cdot nCnt \bmod C$ 最大者(尾轮块越多,§5.3 重切的 $s^*$ 越小、越省)
|
||||
|
||||
4. **尾轮修正**:$n_{wave} = \lceil B \cdot mCnt \cdot nCnt / C \rceil \le 3$ 且 $r > 0$ 时,按 §5.3 计算重切因子 $s^*$,尾轮时延 $T_{tail} = T_{block}/s^*$;否则 $T_{tail} = T_{block}$(r=0 时为 0)
|
||||
|
||||
5. **端到端校验**:$T = \max(T_{MTE2},\; T_{MMAD},\; T_{FIX}) + T_{tail}$。若选出的候选 $T_{MTE2} < T_{MMAD}$(搬移被计算掩盖),候选间差异失效,此时以尾轮最优者为准
|
||||
|
||||
*完整实例*(B=8、M=N=2048、K=1024、BF16,BaseM=BaseN=256、$min\_TileSize$=16KB):
|
||||
|
||||
- $P = \lceil 32/8 \rceil = 4$,进入步骤 3。枚举空间 $mCnt, nCnt \le \lceil 2048/256 \rceil = 8$,$8 \cdot mCnt \cdot nCnt \ge 32$
|
||||
- 枚举与评估:
|
||||
|
||||
| (mCnt, nCnt) | sM × sN | $k_{L1}$(约束 2 上限,16 对齐) | 约束 3 过滤 | $T_{MTE2} \propto (1/sM + 1/sN) \cdot k_{L1}$ |
|
||||
|---|---|---|---|---|
|
||||
| (2, 2) | 1024 × 1024 | 64(128B) | ✗ dValue < 256B | — |
|
||||
| (4, 2) | 512 × 1024 | 80(160B) | ✗ | — |
|
||||
| (4, 4) | 512 × 512 | 128(256B) | ✓(512×128×2 = 128KB ≥ 16KB) | 0.500 |
|
||||
| (8, 4) | 256 × 512 | 160(320B) | ✓ | 0.938 |
|
||||
| (4, 8) | 512 × 256 | 160 | ✓ | 0.938 |
|
||||
| (8, 8) | 256 × 256 | 256(512B) | ✓ | 2.000 |
|
||||
|
||||
$k_{L1}$ 上限公式:$\lfloor 131072/(sM{+}sN) \rfloor$(131072 = L1/(2·dtype) = 512KB/4B)。评估过程展示三个要点:
|
||||
|
||||
1. **最少切分 (2,2) 不可行**:$k_{L1} \le 64$ 元素 = 128B,违反 dValue ≥ 256B——若只做约束 1(并行度)检查会在 (2,2) 上误判达标,必须连同约束 2/3 一起过滤;
|
||||
2. **多个候选通过约束**:(4,4)、(8,4)、(4,8)、(8,8) 都满足约束 2/3/4——**约束检查不足以选最优**,必须计算目标函数;
|
||||
3. **目标函数 $T_{MTE2}$ 定最优**:拉格朗日方形点 (4,4) 的搬入时延 0.500 最小(比 (8,4) 省 47%、比 (8,8) 省 75%)。注意此处 $k_{L1}$ 是变量(K=1024 未截断、由 L1 容量决定),故 $T_{MTE2} \propto (1/sM + 1/sN) \cdot k_{L1}$ 而非 §5.2 的简化式 $(1/sM + 1/sN)$。最终 (4,4):总块数 $8 \times 16 = 128$,$r = 128 \bmod 32 = 0$ 完美整除、无尾轮
|
||||
|
||||
*与源码的差异*:源码用 cubeBound 模型 + balanceRate ≥ 0.9 剪枝,不解耦 SingleCoreM/N 与 BaseM/N(baseM=256 已是 SingleCore 级参数,L0 tile 由 stepM/stepN 二次切分),且枚举目标为"算存比/负载均衡帕累托"而非"搬入时延最小"。理论的两层分离使约束链更清晰、目标函数($T_{MTE2}$)有闭式表达——SingleCoreM/N 由 L1 + 并行度 + 搬移效率决定,BaseM/N 由 L0C 决定,各司其职。
|
||||
|
||||
### 5.3 mCnt / nCnt 与核间分配(含尾轮处理)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user