diff --git a/BMM算子优化分析_Release/BMM算子优化分析_v0.6.html b/BMM算子优化分析_Release/BMM算子优化分析_v0.6.html index d2d3051..cd6ca19 100644 --- a/BMM算子优化分析_Release/BMM算子优化分析_v0.6.html +++ b/BMM算子优化分析_Release/BMM算子优化分析_v0.6.html @@ -267,14 +267,16 @@ $$
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 向蛇形遍历:
3、L2 切分:工作集超 128MB 时按 mL2TileNum×nL2TileNum 切块,块内错位分核(对角线分配),避免多核同时抢同一地址的读读冲突,优先选拖尾小的方案。
4、核内 tiling:$M^t N^t \cdot 4\text{B} \cdot DB \le L0C$;$M^t K^t \cdot \text{dtype} \cdot 2 \le L0A$、$K^t N^t \cdot \text{dtype} \cdot 2 \le L0B$;内轴按 dValue 256B/512B 对齐;L1 按容量开双缓冲,余量充足开 4 buffer。
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 时延的瓶颈所在,也是"时延绝对值小、不再继续优化"的定量注脚。
| 分支 | case 数 | 占比 | B 范围 | 区域特征 | |
|---|---|---|---|---|---|
| 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 |
| 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 |