diff --git a/BMM算子优化分析_Release/BMM算子优化分析_v0.7.html b/BMM算子优化分析_Release/BMM算子优化分析_v0.7.html index e97fc0a..5cb4ad5 100644 --- a/BMM算子优化分析_Release/BMM算子优化分析_v0.7.html +++ b/BMM算子优化分析_Release/BMM算子优化分析_v0.7.html @@ -365,22 +365,26 @@ $$

十、case 遍历:各分支的覆盖区域

-

对 $B \in [1, 2048]$、$M,N,K \in [1, 10240]$ 按对数网格采样 20736 个 case,严格按上述进入条件分类(BF16),结果:

-

分支覆盖统计

+

方法论说明

+

采样方式:B ∈ [1, 2048] 全量遍历(2048 个值),M/N/K ∈ [1, 10240] 对数网格采样 60 点/维(值按指数增长:1, 2, 3, 5, 7, 10, 14, 19, 26, 35, ...)。总 case 数 3.2 亿,耗时约 4 分钟。

+

为什么不做全量遍历:全量 = 2048 × 10240³ ≈ 2.2×10¹⁵ 个 case。Python 分类器约需 1400 万小时,C 实现约需 6 万小时——完全不可行。对数采样在小值区密集、大值区稀疏,恰好覆盖了分支边界集中的区域。

+

分布依赖测度:对数均匀采样和线性均匀采样给出的分支占比不同。对数采样在小值区密集,特殊分支(K=0/1)、降核 ASW(P 小)、StreamK(K 大但 M/N 小)的占比被放大;线性采样被大 shape 主导(M/N/K > 512 占 [1,10240] 的 95%+),ASW_Basic 占比显著升高。本文遍历的目的是验证覆盖性(无空洞),不是统计真实工作负载的分布。

+

分支覆盖统计(对数采样,B 全量 2048,M/N/K 60 点/维,共 3.2 亿 case)

- - - - - - -
分支case 数占比B 范围区域特征
ASW_Basic729035.2%2 ~ 2048通用:B<C 且 P≥C;或 B≥C 但 L1 四形态不满足(M/N 大)
IterBatch454421.9%32 ~ 2048B≥C、负载均衡、L1 四形态之一满足
降核 ASW_Basic328815.9%2 ~ 128P<C 且 K 不满足 StreamK 阈值 → 只用 ⌈P⌉ 核(定义与实现见 §八.6)
特殊分支17288.3%任意K=0 / K=1
MergeBatch16748.1%128 ~ 2048$b_{core}\ge 4$ 且 $MN \le L0C/(2b_0^2\cdot4\text{B})=8192$ 等五条全过
转Matmul15847.6%B=1单边 batch=1
StreamK6283.0%2 ~ 128P<C/2 且 K≥8192
-

IterBatch 四形态命中分布

- - - - -
形态命中数说明
b) 双 batch 乒乓1787最多:B 大且单 batch 较小
d) 两侧切 K1456次之:K 可切段的通用兜底
c) 一侧驻留+对侧切 K773单侧可驻留(含 b_core≥2 的半预算预取档 522 个)
a) 单 batch 全驻留528B=C 附近
+ASW_Basic1.75 亿54.1%2 ~ 2048通用:B<C 且 P≥C;或 B≥C 但 L1 四形态不满足(M/N 大) +MergeBatch6303 万19.5%97 ~ 2048$b_{core}\ge 4$ 且 $MN \le 8192$ 等五条全过 +降核 ASW_Basic4051 万12.6%2 ~ 2048P<C 且 K 不满足 StreamK 阈值 → 只用 ⌈P⌉ 核 +IterBatch3804 万11.8%32 ~ 2048B≥C、负载均衡、L1 四形态之一满足 +特殊分支597 万1.9%任意K=0 / K=1 +StreamK25 万0.08%2 ~ 128P<C/2 且 K≥8192 +转Matmul15 万0.05%B=1单边 batch=1 +

对照:线性等距采样(M/N/K 步长 256,B 全量,共 1.3 亿 case)下 ASW_Basic 占比升至 92.1%,MergeBatch 降至 3.6%——因为线性采样被大 shape 主导。两种测度的结论一致:无空分支、无覆盖空洞,只是占比不同。

+

IterBatch 四形态命中分布(对数采样)

+ + + + +
形态命中数占比说明
b) 双 batch 乒乓2684 万70.5%最多:B 大且单 batch 较小
d) 两侧切 K741 万19.5%次之:K 可切段的通用兜底
c) 一侧驻留+对侧切 K370 万9.7%单侧可驻留(含 b_core≥2 的半预算预取档)
a) 单 batch 全驻留9 万0.2%B=C 附近的窄区

典型边界 case

@@ -396,11 +400,11 @@ $$
BMNK分支说明
1204820482048转Matmul单 batch 纯 Matmul
6464648192IterBatch小 M×N 但 K 大,形态 d

遍历结论

    -
  1. 六个分支全部有真实 case 命中,无空分支;覆盖矩阵无空洞(P<C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);
  2. +
  3. 七个分支全部有真实 case 命中,无空分支;覆盖矩阵无空洞(P<C 且 K 小的残余由降核 ASW_Basic 兜底——此时时延绝对值小,调度开销主导,分支选择不敏感);
  4. **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;
  5. IterBatch 与 ASW_Basic 的分界就是 L1 四形态是否满足:单 batch 输入 $(MK+KN)\cdot\text{dtype}$ 相对 L1 的比例决定归属——这正是"核内零重复读"原则的定量体现;
  6. -
  7. StreamK 的区域为 P<C/2 且 K≥8192:B 小、M/N 小、K 大的"细长" case;C/2 ≤ P < C 且 K 大的 98 个 case 由降核 ASW_Basic 承接(切 2 路 K 会超核数,不切又不满核,不如直接用 ⌈P⌉ 核);
  8. -
  9. 降核 ASW_Basic 是 P<C 且 K 小区域的理性归宿(B∈[2,128],占 15.4%):并行度凑不满、切 K 又不划算时,只用 ⌈P⌉ 个核、每核一个 L0C 满载输出块,比强行碎切(tile 跌破搬移效率下限)更快。
  10. +
  11. StreamK 的区域为 P<C/2 且 K≥8192:B 小、M/N 小、K 大的"细长" case;C/2 ≤ P < C 且 K 大的 case 由降核 ASW_Basic 承接(切 2 路 K 会超核数,不切又不满核,不如直接用 ⌈P⌉ 核);
  12. +
  13. 降核 ASW_Basic 是 P<C 且 K 小区域的理性归宿(占 12.6%):并行度凑不满、切 K 又不划算时,只用 ⌈P⌉ 个核、每核一个 L0C 满载输出块,比强行碎切(tile 跌破搬移效率下限)更快。