ASW_Basic v1.5: P>1完整枚举算法——有界枚举空间+评估流水线+T_MTE2目标函数+多解选取+实例

This commit is contained in:
2026-08-28 03:07:33 +00:00
parent 23471f8ea6
commit 0337ada40c

View File

@@ -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$检查约束 2L1 容量与约束 3dValue满足则确定不满足则 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/4L1 容量搬移效率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 = 1B ≥ 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/NbaseM=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$ → 取 6416 对齐)= 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、BF16BaseM=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 | 64128B | dValue < 256B | |
| (4, 2) | 512 × 1024 | 80160B | | |
| (4, 4) | 512 × 512 | 128256B | ✓(512×128×2 = 128KB 16KB | 0.500 |
| (8, 4) | 256 × 512 | 160320B | | 0.938 |
| (4, 8) | 512 × 256 | 160 | | 0.938 |
| (8, 8) | 256 × 256 | 256512B | | 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/NbaseM=256 已是 SingleCore 级参数L0 tile stepM/stepN 二次切分且枚举目标为"算存比/负载均衡帕累托"而非"搬入时延最小"。理论的两层分离使约束链更清晰目标函数$T_{MTE2}$有闭式表达——SingleCoreM/N L1 + 并行度 + 搬移效率决定BaseM/N L0C 决定各司其职
### 5.3 mCnt / nCnt 与核间分配(含尾轮处理)