diff --git a/BMM算子优化分析_Release/BMM算子优化分析_v0.91.html b/BMM算子优化分析_Release/BMM算子优化分析_v0.91.html index b2dd2ba..9abc5a8 100644 --- a/BMM算子优化分析_Release/BMM算子优化分析_v0.91.html +++ b/BMM算子优化分析_Release/BMM算子优化分析_v0.91.html @@ -85,7 +85,7 @@ $$ R_{16} = \frac{\text{Cube 峰值算力}}{\text{GM 带宽} / \text{元素字节数}} = \frac{486\ \text{TFLOPS}}{1.6\ \text{TB/s} \,/\, 2\ \text{B}} \approx 607.5\ \text{FLOP/元素} $$

其中 486 TFLOPS 是乘加各计一次后的标称算力;分母中的 2B 是 16bit 元素字节数,作用是把 GM 带宽折算成元素速率。

-

$AI < R_{16}$ → 访存 Bound(瓶颈在 MTE2);反之计算 Bound(瓶颈在 MMAD)。

+

$AI < R_{16}$ → 访存 Bound(瓶颈在 MTE2);反之计算 Bound(瓶颈在 MMAD)。

3.2 实现本质逻辑

BMM 的实现本质是:把数据分块(tile),由全部 AIC 核并行 + 串行完成这些分块的计算,再组合成最终结果:

$$ @@ -134,7 +134,7 @@ $$
  • $2 \cdot (b_0 M)(b_0 N) \cdot 4\text{B} \le L0C$
  • $b_{core} \cdot (MK + KN) \cdot \text{dtype} \ge min\_DatamountPerCore$
  • $\max(MK,\; KN) \cdot \text{dtype} \ge min\_TileSize$
  • -
  • $\dfrac{2MN}{M+N} < \dfrac{R_{16}}{b_0}$
  • +
  • $\dfrac{2MN}{M+N} < \dfrac{R_{16}}{b_0}$
  • 逐条解释

      @@ -157,14 +157,14 @@ $$ $BW_{pc}$单核 GM 带宽份额$W_{GM}/C$

      *一阶流水模型*(unitflag 交叠 batch 间 drain/startup):

      $$T_{iter} = b_{core} \cdot n_K \cdot \max(T_{load},\, T_{comp}) + T_{comp} + T_{write}$$
      -

      MergeBatch 合并后 $k_{L1}^m = \min(K,\; k_{L1}/b_0)$——L1 绑定($k_{L1} +

      MergeBatch 合并后 $k_{L1}^m = \min(K,\; k_{L1}/b_0)$——L1 绑定($k_{L1}<K$)时 $k_{L1}^m = k_{L1}/b_0$;K 截断($k_{L1}=K$)时 $k_{L1}^m = K$ 不减半。以 L1 绑定为例:

      $$T_{mb} = b_{core} \cdot n_K \cdot \max(T_{load},\; b_0 T_{comp}) + b_0(T_{comp} + T_{write})$$
      -

      条件 5 保证合并后仍访存 Bound($T_{load} > b_0 T_{comp}$),此时:

      +

      条件 5 保证合并后仍访存 Bound($T_{load} > b_0 T_{comp}$),此时:

      $$T_{mb} - T_{iter} = (b_0-1)(T_{comp} + T_{write}) > 0$$

      一阶模型下 MergeBatch 始终不优于 IterBatch——稳态吞吐相同(总搬移量、每块大小、总块数都相同),MergeBatch 的 drain 暴露是 IterBatch 的 $b_0$ 倍。

      *二阶修正——batch 边界固定开销*:每 batch 边界有固定开销 $T_{bd}$,MergeBatch 边界数少 $b_0$ 倍:

      $$T_{iter} = \text{一阶} + b_{core} \cdot T_{bd},\qquad T_{mb} = \text{一阶} + \frac{b_{core}}{b_0} \cdot T_{bd}$$
      -

      分界条件(MergeBatch 优于 IterBatch 当且仅当 $\Delta = T_{mb} - T_{iter} < 0$):

      +

      分界条件(MergeBatch 优于 IterBatch 当且仅当 $\Delta = T_{mb} - T_{iter} < 0$):

      $$b_{core} > \frac{b_0 \cdot \text{penalty}}{T_{bd}},\qquad \text{penalty} = \begin{cases} (b_0-1)(T_{comp} + T_{write}) & \text{L1 绑定(}k_{L1} \lt K\text{)} \\ (b_0^2-1)T_{comp} + (b_0-1)T_{write} & \text{K 截断(}k_{L1} = K\text{)} \end{cases}$$

      K 截断时 MergeBatch 的 $k_{L1}$ 不减半 → 每分块计算量 $b_0^2$ 倍(而非 $b_0$ 倍)→ drain 惩罚更大。小 MN 时 $T_{comp}$ 小 → penalty 小 → MergeBatch 更容易赢;大 B 时 $b_{core}$ 大 → 边界节省多 → MergeBatch 更容易赢。

      @@ -208,7 +208,7 @@ $$
    1. L1 容量约束,四选一(Step 为 >1 的整数):
    2. @@ -258,9 +258,9 @@ $$

      七、StreamK 分支

      进入分支条件(汇总)

        -
      1. $P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} < \dfrac{C}{2}$
      2. +
      3. $P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} < \dfrac{C}{2}$
      4. $\dfrac{K}{grid_K} \ge \dfrac{256\text{B}}{\text{dtype}}$
      5. -
      6. $K > \dfrac{grid_K^{\,2}}{grid_K-1}\cdot\theta_c$,$\theta_c = \dfrac{Q_{16}}{2}\Big(\dfrac{8\text{B}}{W_{L2}}+\dfrac{1}{Q_{AIV}}\Big) \approx 12$(grid_K 由实现方案确定)
      7. +
      8. $K > \dfrac{grid_K^{\,2}}{grid_K-1}\cdot\theta_c$,$\theta_c = \dfrac{Q_{16}}{2}\Big(\dfrac{8\text{B}}{W_{L2}}+\dfrac{1}{Q_{AIV}}\Big) \approx 12$(grid_K 由实现方案确定)
      9. 工程约束:确定性等级 ≤ 1(核间归约顺序不定);ND 格式

      逐条解释

      @@ -278,7 +278,7 @@ $$
      $$ T_{SK} = \frac{T_{pipe}}{grid_K} + T_{Reduce}^t $$
      -

      收益判据 $T_{SK} < T_{alt}$ ⟺ $T_{Reduce}^t < T_{pipe}\left(1-\dfrac{1}{grid_K}\right)$。等价于 $T_{pipe} > \dfrac{grid_K}{grid_K-1}\cdot T_{Reduce}^t$——α = grid_K/(grid_K-1) 由流水分析导出(grid_K=2 时 α=2),非经验值。

      +

      收益判据 $T_{SK} < T_{alt}$ ⟺ $T_{Reduce}^t < T_{pipe}\left(1-\dfrac{1}{grid_K}\right)$。等价于 $T_{pipe} > \dfrac{grid_K}{grid_K-1}\cdot T_{Reduce}^t$——α = grid_K/(grid_K-1) 由流水分析导出(grid_K=2 时 α=2),非经验值。

      **$T_{Reduce}^t$ 构成**(每 tile,部分和驻留 L2、AIV 归约;$M^t N^t = L0C/4\text{B}$,符号定义见 §二):

      $$ T_{Reduce}^t = \underbrace{\frac{grid_K \cdot M^t N^t \cdot 4\text{B}}{W_{L2}}}_{\text{AIC 写部分和}} + \underbrace{\frac{grid_K \cdot M^t N^t \cdot 4\text{B}}{W_{L2}}}_{\text{AIV 读回}} + \underbrace{\frac{grid_K \cdot M^t N^t}{Q_{AIV}}}_{\text{AIV 求和}} + \underbrace{\frac{M^t N^t \cdot outB}{W_{L2}}}_{\text{写回}} @@ -307,7 +307,7 @@ $$
      $$ \frac{\theta_m \cdot M^t N^t/(M^t+N^t)}{\theta_c} = \frac{2\cdot BW_{pc}}{Q_{16}\cdot\text{dtype}}\cdot\frac{M^t N^t}{M^t+N^t} = \frac{M^t N^t/(M^t+N^t)}{152} $$
      -

      StreamK case 的 tile 尺寸 $M^t N^t/(M^t+N^t)$ ~ O(100) → 比值 ≪ 1。直觉:访存 Bound 时 $T_{pipe} = T_{MTE2}^t > T_{MMAD}^t$,瓶颈时延更大,归约预算更充裕。汇总条件取计算 Bound 阈值(保守,同时覆盖两种情形)。

      +

      StreamK case 的 tile 尺寸 $M^t N^t/(M^t+N^t)$ ~ O(100) → 比值 ≪ 1。直觉:访存 Bound 时 $T_{pipe} = T_{MTE2}^t > T_{MMAD}^t$,瓶颈时延更大,归约预算更充裕。汇总条件取计算 Bound 阈值(保守,同时覆盖两种情形)。

      注意 θ_c 对 workspace 落点敏感:部分和落 GM 时读写带宽从 5.2TB/s 降到 ~0.64TB/s,θ_c 升至约 97。设计时应优先保证 workspace 驻留 L2。

      1. 工程约束:归约顺序不定引入浮点非确定性,确定性等级 2/3 的业务禁用。
      2. @@ -337,8 +337,8 @@ $$

        进入分支条件(汇总)

        1. $P = \dfrac{B \cdot MN \cdot 4\text{B}}{L0C} \ge C$
        2. -
        3. 无 batch 结构限制(BatchA=BatchB、交叉广播均可);典型进入路径:$B < C$(切 B 买不满核),或 $B \ge C$ 但 IterBatch/MergeBatch 条件不满足时的兜底
        4. -
        5. 降核模式:$P < C$ 且不满足 StreamK 进入条件 → 只用 $\lceil P \rceil$ 个核,其余核闲置
        6. +
        7. 无 batch 结构限制(BatchA=BatchB、交叉广播均可);典型进入路径:$B < C$(切 B 买不满核),或 $B \ge C$ 但 IterBatch/MergeBatch 条件不满足时的兜底
        8. +
        9. 降核模式:$P < C$ 且不满足 StreamK 进入条件 → 只用 $\lceil P \rceil$ 个核,其余核闲置

        逐条解释

          @@ -393,15 +393,15 @@ $$

          只与 K、outB 有关(K 越小,单位时间输出越密)。例(BF16 输出,C·Q₁₆=432 TFLOPS):K=512 → 844 GB/s;K=256 → 1.69 TB/s,已超 GM 总线——此时任何策略都写出 Bound,L2 缓冲只能削峰(fixpipe 以 5.2TB/s 写 L2 吸收突发),平均速率仍受总线限制,应预期 Fixpipe 成为 $T_{total}$ 的 max 项。

          分场景决策

          **场景 A:$S_{in} + S_{out} \le L2$(全驻留)**。输入读一遍($r_{in}=1$),输出驻留 L2(dirty)异步回写 GM——写出走 5.2TB/s L2 写口,不与读争,也削平了 GM 写突发。无需切分。

          -

          **场景 B:$S_{in} \le L2$ 但 $S_{in} + S_{out} > L2$(输入能驻留,加上输出超了)。策略:输入驻留、输出直写 GM**。理由链:

          +

          **场景 B:$S_{in} \le L2$ 但 $S_{in} + S_{out} > L2$(输入能驻留,加上输出超了)。策略:输入驻留、输出直写 GM**。理由链:

          1. $S_{in} \le L2$ ⇒ 全部输入可驻留 L2,跨波次复用全部命中 ⇒ $r_{in} = 1$(GM 输入流量达到下界 $S_{in}$);
          2. -
          3. 输出在本算子内只写不读、零复用收益;若输出也驻留 L2(dirty),超出 L2 的部分会把输入挤出——被挤出的输入后续得回 GM 重读 ⇒ $r_{in} > 1$,GM 流量超出下界;
          4. +
          5. 输出在本算子内只写不读、零复用收益;若输出也驻留 L2(dirty),超出 L2 的部分会把输入挤出——被挤出的输入后续得回 GM 重读 ⇒ $r_{in} > 1$,GM 流量超出下界;
          6. 故让输出直写 GM(fixpipe L0C→GM,不占 L2),把 128MB 全部留给输入,保住 $r_{in} = 1$——GM 总流量保持下界 $S_{in} + S_{out}$;
          7. 代价是输出即刻占用 GM 写带宽(与读共享总线),须校验总线不爆:$(S_{in} + S_{out})/T_{MMAD} \le W_{GM}$。

          例:B=8、M=N=4096、K=512、BF16——$S_{in}$≈67MB ≤ L2,$S_{out}$≈268MB 直写 GM;T_MMAD≈318µs,总流量速率 (67+268)MB/318µs ≈ 1.05TB/s < 1.6TB/s ✓。

          -

          **场景 C:$S_{in} > L2$(输入本身超)**。必须 L2 切分。输出直写 GM 以最大化 $L2_{read}$,切分数满足

          +

          **场景 C:$S_{in} > L2$(输入本身超)**。必须 L2 切分。输出直写 GM 以最大化 $L2_{read}$,切分数满足

          $$ mL2TileNum \times nL2TileNum \;\ge\; \frac{S_{in}}{L2_{read}} $$