diff --git a/BMM算子优化分析_Release/BMM算子优化分析_v0.6.md b/BMM算子优化分析_Release/BMM算子优化分析_v0.6.md index 6ce438e..d9b6d99 100644 --- a/BMM算子优化分析_Release/BMM算子优化分析_v0.6.md +++ b/BMM算子优化分析_Release/BMM算子优化分析_v0.6.md @@ -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 8192,MergeBatch 条件 2 不满足 → 落 IterBatch | | 32 | 4096 | 4096 | 4096 | ASW_Basic | L1 五形态均不满足(M/N 太大),切 M/N | -| 2 | 8192 | 8192 | 1024 | ASW_Basic | B