v0.6 修订:补 MergeBatch 边界 case、降核模式定义与实现
This commit is contained in:
@@ -300,15 +300,17 @@ mCnt、nCnt 收拢为 blocksPerBatch 的因子(避免碎核尾块);由条
|
||||
|
||||
1. $P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} \ge C$
|
||||
2. 无 batch 结构限制(BatchA=BatchB、交叉广播均可);典型进入路径:$B < C$(切 B 买不满核),或 $B \ge C$ 但 IterBatch/MergeBatch 条件不满足时的兜底
|
||||
3. **降核模式**:$P < C$ 且不满足 StreamK 进入条件 → 只用 $\lceil P \rceil$ 个核,其余核闲置
|
||||
|
||||
### 逐条解释
|
||||
|
||||
1. **并行度补齐**:以 L0C 满载为基本块粒度,B×M×N 能切出至少 C 个独立输出块,则切 M/N(或混合切)并行度够用。切 M/N 的固有代价是共享矩阵被多核重复读,但共享部分驻留 128MB L2 时重复读以 5.2TB/s 命中 L2 而非 1.6TB/s 的 GM,代价大部分被吸收。
|
||||
2. **兜底性质**:ASW_Basic 是实践中最常命中的分支——B 可大可小可等 1,交叉广播也由此承接(对广播侧做 L1/L2 驻留,共享关系与切 M/N 同构)。
|
||||
3. **降核模式**:P < C 且 K 也不够格走 StreamK 时,并行度凑不满核。此时与其强行把 M/N 切得更碎(tile 跌破 min_TileSize、dValue 跌破 128B,搬移效率崩塌,反而更慢),不如**只用 ⌈P⌉ 个核**、每核承担一个完整输出块(L0C 满载粒度),其余核闲置。这类 case 的时延绝对值小,继续切分引入的调度与搬移效率损失大于并行收益——降核是理性选择而非偷懒。
|
||||
|
||||
### 实现方案
|
||||
|
||||
**1、核间切分维度选择(按共享代价从低到高)**:切 B(零共享,先试)→ 切 M(右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2)→ 切 N(对称)→ 混合切(靠 swizzle + L2 切分管理)→ 降核(P 远小于 C 且 StreamK 也不满足时,宁可部分核闲置)。
|
||||
**1、核间切分维度选择(按共享代价从低到高)**:切 B(零共享,先试)→ 切 M(右矩阵 $KN\cdot\text{dtype} \le L2$ 则驻留 L2)→ 切 N(对称)→ 混合切(靠 swizzle + L2 切分管理)→ 降核(见第 6 条)。
|
||||
|
||||
**2、swizzle:ASW 滑窗蛇形**。M 向按窗口 W 分组,窗内 N 向蛇形遍历:
|
||||
|
||||
@@ -324,6 +326,8 @@ $$
|
||||
|
||||
**5、内部特化(参数极限,不是独立分支)**:单边无 batch 且该侧矩阵小($M \le 256$、$MK\cdot\text{dtype}\cdot 2 \le L1$、对侧每核循环 ≥4 轮)时小侧整个常驻 L1、只搬一次(L1 全载)。
|
||||
|
||||
**6、降核模式实现**:tiling 时 `usedCoreNum = ⌈P⌉`(不强制 C),基本块在 L0C 容量内取最大($M^t N^t \cdot 4\text{B} \le L0C$),每核按标准核内流水(L1→L0→Cube→L0C→Fixpipe)处理自己的输出块;核间无共享无依赖,无需 swizzle 与 L2 切分。降核后 GM 并发搬移核数若 < minCoreNum,带宽利用率上限被压低——这正是降核区 case 时延的瓶颈所在,也是"时延绝对值小、不再继续优化"的定量注脚。
|
||||
|
||||
---
|
||||
|
||||
## 九、特殊分支
|
||||
@@ -343,7 +347,7 @@ $$
|
||||
|---|---|---|---|---|
|
||||
| ASW_Basic | 7290 | 35.2% | 2 ~ 2048 | 通用:B<C 且 P≥C;或 B≥C 但 L1 五形态不满足(M/N 大) |
|
||||
| IterBatch | 4544 | 21.9% | 32 ~ 2048 | B≥C、负载均衡、L1 五形态之一满足 |
|
||||
| 降核 ASW_Basic | 3190 | 15.4% | 2 ~ 128 | P<C 且 K 不满足 StreamK 阈值(小 case,时延绝对值小) |
|
||||
| 降核 ASW_Basic | 3190 | 15.4% | 2 ~ 128 | P<C 且 K 不满足 StreamK 阈值 → 只用 ⌈P⌉ 核(定义与实现见 §八.6) |
|
||||
| 特殊分支 | 1728 | 8.3% | 任意 | K=0 / K=1 |
|
||||
| MergeBatch | 1674 | 8.1% | 128 ~ 2048 | $b_{core}\ge 4$ 且 $MN \le L0C/(2b_0^2\cdot4\text{B})=8192$ 等五条全过 |
|
||||
| 转Matmul | 1584 | 7.6% | B=1 | 单边 batch=1 |
|
||||
@@ -364,11 +368,13 @@ $$
|
||||
| B | M | N | K | 分支 | 说明 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | 2048 | 2048 | 2048 | 转Matmul | 单 batch 纯 Matmul |
|
||||
| 128 | 32 | 128 | 64 | IterBatch | MergeBatch 条件 3 不满足(单核搬移仅 80KB < 480KB) |
|
||||
| 128 | 64 | 64 | 512 | **MergeBatch** | 五条全过:$b_{core}$=4,MN=4096≤8192,单核搬移 512KB≥480KB,AI=64<304 |
|
||||
| 128 | 64 | 64 | 256 | IterBatch | 与上行仅 K 不同:单核搬移 256KB < 480KB,条件 3 不满足 → 落 IterBatch(形态 b) |
|
||||
| 512 | 128 | 128 | 128 | IterBatch | MN=16384 > 8192,MergeBatch 条件 2 不满足 → 落 IterBatch |
|
||||
| 32 | 4096 | 4096 | 4096 | ASW_Basic | L1 五形态均不满足(M/N 太大),切 M/N |
|
||||
| 2 | 8192 | 8192 | 1024 | ASW_Basic | B<C,P=2048≥32 |
|
||||
| 16 | 256 | 256 | 128 | 降核 ASW | P=4<32,K=128 不满足 StreamK |
|
||||
| 4 | 128 | 128 | 10240 | StreamK | P=0.25<32,K≥8192 |
|
||||
| 2 | 8192 | 8192 | 1024 | ASW_Basic | B<C,P=2048 ≥ 32 |
|
||||
| 16 | 256 | 256 | 128 | 降核 ASW | P=4 < 32 且 K=128 不满足 StreamK → 用 4 核,其余闲置 |
|
||||
| 4 | 128 | 128 | 10240 | StreamK | P=0.25 < 32,K≥8192 |
|
||||
| 2048 | 1024 | 1024 | 512 | IterBatch | 大 batch,形态 b |
|
||||
| 8 | 512 | 512 | 512 | ASW_Basic | B<C,P=32 恰好满核 |
|
||||
| 64 | 64 | 64 | 8192 | IterBatch | 小 M×N 但 K 大,形态 e |
|
||||
@@ -376,6 +382,7 @@ $$
|
||||
### 遍历结论
|
||||
|
||||
1. **六个分支全部有真实 case 命中**,无空分支;覆盖矩阵无空洞(P<C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);
|
||||
2. **MergeBatch 的区域由条件 2($MN \le 8192$)与条件 3(480KB)夹出**:小 M×N 且单核搬移量足够的大 batch case,两个条件缺一不可(如 B=128/M=32/N=128/K=64 恰因条件 3 落入 IterBatch);
|
||||
2. **MergeBatch 的区域由条件 2($MN \le 8192$)与条件 3(min_DatamountPerCore)夹出**:小 M×N 且单核搬移量足够的大 batch case,两个条件缺一不可。典型分界对照:B=128/M=N=64 时 K=256 → 单核搬移 256KB 不达标落 IterBatch,K=512 → 512KB 达标进 MergeBatch;
|
||||
3. **IterBatch 与 ASW_Basic 的分界就是 L1 五形态是否满足**:单 batch 输入 $(MK+KN)\cdot\text{dtype}$ 相对 L1 的比例决定归属——这正是"核内零重复读"原则的定量体现;
|
||||
4. **StreamK 的区域为 P<C 且 K≥8192**:B 小、M/N 小、K 大的"细长" case,与理论预期一致。
|
||||
4. **StreamK 的区域为 P<C 且 K≥8192**:B 小、M/N 小、K 大的"细长" case,与理论预期一致;
|
||||
5. **降核 ASW_Basic 是 P<C 且 K 小区域的理性归宿**(B∈[2,128],占 15.4%):并行度凑不满、切 K 又不划算时,只用 ⌈P⌉ 个核、每核一个 L0C 满载输出块,比强行碎切(tile 跌破搬移效率下限)更快。
|
||||
|
||||
Reference in New Issue
Block a user