diff --git a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.3.html b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.3.html index c033ddc..c0aee36 100644 --- a/BMM算子优化分析_Release/ASW_Basic分支分析_v1.3.html +++ b/BMM算子优化分析_Release/ASW_Basic分支分析_v1.3.html @@ -190,23 +190,36 @@ $$
两种方案的稳态时延相同(都是 max($T_{comp}$, $T_{write}$)),但 UnitFlag 单缓冲的 tile 更大 → 总 tile 数更少 → 循环开销更小。但当前 BMM ASW kernel 未启用 UnitFlag(unitFlag = 0,注释 "each l0 only process one block, disable unit flag"),且源码在 baseM=baseN=256 时已自动选 dbL0C=1(256×256×4B×2 > L0C)——即源码已经是单缓冲 + 无 UnitFlag,tile 到顶但无流水交叠。
*建议*:对计算 Bound 的 case 启用 UnitFlag(MMAD 与 Fixpipe 流水并行),可将单 tile 时延从 $T_{comp} + T_{write}$ 降至 $\max(T_{comp}, T_{write})$。对访存 Bound 的 case(MTE2 Bound),UnitFlag 收益小([CANN 文档](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/920beta1/API/ascendcopapi/atlasascendc_api_07_0003.html):MTE2 Bound 时 MMAD/FIX 流水可被搬移掩盖)。
-BaseM/BaseN 的长宽比跟随 SingleCoreM/SingleCoreN(进而跟随 M/N),对齐 16 的倍数。长宽比跟随的原因:
-若长宽比严重不匹配(如 M ≫ N 但 BaseM = BaseN),则 M 向切分次数远多于 N 向,L0A 搬移频繁而 L0B 闲置——Cube 等待 L0A 数据,流水线利用率下降。baseK 由 L0A/L0B 容量决定(L1→L0 搬移无 dValue 要求,dValue 约束的是 GM→L1 的 $k_{L1}$):
+BaseM/BaseN 的长宽比应尽量方形(而非跟随 M/N),对齐 16 的倍数。推导:
+1. GM→L1 搬移与 BaseM/N 无关:GM→L1 搬移的是 $[\text{singleCoreM}, k_{L1}]$(A)和 $[k_{L1}, \text{singleCoreN}]$(B),其 dValue 由 $k_{L1}$(A)和 $\text{singleCoreN}$(B)决定——BaseM/N 的长宽比不参与 GM→L1 搬移参数。长宽比跟随 M/N 不会改善 GM→L1 效率。
+2. L0A = L0B = 64KB 等容量 → 方形 tile 用满两侧:L0A 装 $\text{BaseM} \times baseK$,L0B 装 $baseK \times \text{BaseN}$。若长宽比跟随 M/N(如 M/N = 4:BaseM=512、BaseN=128),则:
+L0A 装满(512×32×2×2 = 64KB)而 L0B 只用了 25%(32×128×2×2 = 16KB)——一半 L0 容量闲置。
+方形 tile(BaseM=BaseN=256):
+L0A 和 L0B 同时装满,且 baseK = 64 是长宽比跟随方案(baseK=32)的 2 倍——K 维迭代次数减半,L1→L0 搬移(MTE1)单次搬移量翻倍,Cube 流水线切换开销减半。
+3. 方形 tile 是 L0C 面积约束下的最优:L0C 约束 $\text{BaseM} \times \text{BaseN} \le 65536$ 只限制面积。在面积固定下,方形使 $\min(\text{BaseM}, \text{BaseN})$ 最大——baseK 的上限由 $\min(\text{BaseM}, \text{BaseN})$ 决定(公式见上),所以方形最大化 baseK。
+4. 例外:当 M 或 N 小于方形边长时,tile 被迫非方形:
+例:M=128、N=4096 → BaseM=128(M 限制)、BaseN=512(L0C 面积限制)——此时长宽比跟随 M/N 是被迫的(M 太小),而非主动选择。
+结论:BaseM/N 长宽比跟随 M/N 的切分方法站不住脚——它使 L0A/L0B 容量利用率失衡(一侧闲置)、baseK 减半(K 迭代翻倍)、且对 GM→L1 搬移无任何收益。正确做法是方形 tile 优先,仅当 M 或 N 小于方形边长时被迫跟随。
+baseK 由 L0A/L0B 容量决定(L1→L0 搬移无 dValue 要求,dValue 约束的是 GM→L1 的 $k_{L1}$):
核间不切 K 时 K 维度层次关系:$K = \text{singleCoreK} \ge k_{L1} \ge baseK$——$k_{L1}$ 是 GM→L1 的 K 向粒度(须 $k_{L1} \cdot \text{dtype} \ge 256\text{B}$),baseK 是 L1→L0 的 K 向粒度(仅受 L0A/L0B 容量约束)。
*BaseM/N 的具体确定过程*(host 端枚举,16 对齐遍历):
*与源码的差异*:源码默认 baseM=baseN=256(硬编码 "256 is better base"),再由 cubeBound 模型(L2 供数能力 + 溢出惩罚 + K 向复用)枚举收缩。理论直接从 L0C 容量出发,cubeBound 的三项修正可从第一性原理推导:①L2 供数速率 vs Cube 耗数速率 → 访存 Bound 时应缩 tile;②工作集超 L2 → 增大 tile 减少重复读;③K 越大越偏 compute bound → 可放大 tile。两者方向一致,源码多了实测调优的余量(CUBE_BOUND_RATIO=0.85)。
约束 4——SingleCoreM/N 是 BaseM/N 的整数倍(工程实现要求,保证 L0 tile 边界对齐)。
-*选取策略*:在满足约束 1 的前提下,SingleCoreM/N 尽量大(搬移效率和 L2 复用最大化)。长宽比跟随 M/N($\text{singleCoreM}/\text{singleCoreN} \approx M/N$),对齐到 BaseM/BaseN 的整数倍。
+*选取策略*:在满足约束 1 的前提下,SingleCoreM/N 尽量大(搬移效率和 L2 复用最大化)。SingleCoreM/N 的长宽比跟随 M/N($\text{singleCoreM}/\text{singleCoreN} \approx M/N$)——这与 BaseM/N 的方形策略不同:SingleCoreM/N 决定 GM→L1 搬移的 nValue/dValue 参数(A 的 nValue=singleCoreM,B 的 dValue=singleCoreN),跟随 M/N 使两侧搬移量均衡、避免一侧搬移过大成为 GM 带宽瓶颈。对齐到 BaseM/BaseN 的整数倍。
*SingleCoreM/N 的具体确定过程*(host 端枚举,与尾轮处理联动):