Files
admin ec4fee99b8 Fix #40: 切换 Cube 算力为白皮书 Cube-only 口径 (单核统一 13.5T)
用户裁决: cube_peak_tflops 取白皮书表3-1 "Cube算力" 单行 (不含 Vector)。

- 数值: 950PR 486->432, 950PR_C28 425->378, 950DT 547->486,
  950DT_C32 486->432, 950DT_C28 425->378; 单核全系列精确 13.5T
  (16^3 MAC/拍 x 1.65GHz), 28 核档 0.06% 取整偏差随之消失
- 传导 (无结构改动, 全部经 q16/q_cube/r16 派生):
  MMAD 时延 x486/432 (+12.5%); R16 607.5->540 (MergeBatch 条件5/b0 上限);
  StreamK θ_c 12.24->10.9; ASW 面积/周长分界 93.5->83.1, MMAD/FIX 304->270
- 文档同步: README, docs/00 (R16 公式), 04 (607.5 实例), 05 (硬件事实/复核算例),
  06/07 (翻出阈值 187->166), 05_StreamK (θ_c 及 K 阈值 396->360);
  理论归档 (BMM算子优化分析_Release/) 与历史测评报告不动
- 验证: 单测 88/88; examples 重生成 —— recommend 27/44 行变化
  (计算Bound 行精确 +12.5%; b8_m32768_n2048_k512 瓶颈 MTE2->MMAD 翻转;
  17 行访存主导不变), plans.csv 仅 merge_demo_k_trunc note 的算存比上限
  23.7->21.1 一处文案; 压力回归 10000 例干净, MergeBatch 386->392 /
  IterBatch 2389->2384 (R16 下移致 b0 上限收小, 边界 case 换边, 预期行为)
2026-09-09 11:05:21 +08:00

5.3 KiB
Raw Permalink Blame History

StreamK 分支理论

整理自《BMM算子优化分析 v0.98》§七. 对应软件实现 bmm_theory/branches/stream_k.py.

1. 定位:最后才买的并行维度

决策树的末端分支——当 B/M/N 三维的并行度加起来都填不满核 时,才动用最贵的切 K。回顾切分价格cost(切B)=0 < cost(切M/N) ≪ cost(切K)。切 K 贵的根因K 维有 L0C 累加机制,核内切 K 时多轮 mmad 在 L0C 原地累加、中间结果不出核;一旦切到核间,部分和必须写出 workspace 再归约——切 K 是唯一同时破坏"累加不出核"和"输出独占"的切法

适用 case 画像是"细长"形B 小、M/N 小、K 大(如 B=4, M=N=128, K=10240

2. 进入条件4 条同时满足)

P = B·M·N·4B / L0C——以"L0C 满载的输出基本块"为粒度估计不切 K 的最大并行度。

# 条件 含义
1 P ≤ C/2 并行缺口:不切 K 时至多一半核有事做K 是唯一剩余的并行维度。阈值取 C/2 而非 CStreamK 定义即 grid_K≥2至少 2 路切 Kgrid_K=2 时每块需 2 核,总核数需求 = ⌈P⌉×2 ≤ C
2 K/grid_K ≥ 256B/dtype 单核 K 段下限:每核 K 段内轴连续长度不小于 dValue 推荐值保证段内搬移效率不崩。grid_K = ⌊C/⌈P⌉⌋
3 K > grid_K²/(grid_K-1)·θ_cθ_c≈10.9 归约代价可接受:切 K 后总时延须小于不切 K降核 ASW推导见 §3
4 确定性等级 ≤ 1 且 ND 格式 归约顺序不定引入浮点非确定性,确定性等级 2/3 的业务禁用

3. 归约代价与 θ_c 推导(条件 3 的来源)

收益判据:切 K 后芯片级总时延须小于不切 K。

  • 不切 K降核 ASWP 个 tile 各占一个核,总时延 = 单 tile 流水时延 T_pipe = max(T_MMAD^t, T_MTE2^t)
  • 切 KStreamK:同样 P 个 tile每 tile 由 grid_K 个核共同完成(各算 K/grid_K 段),流水时延缩为 T_pipe/grid_K,但串行追加归约时延 T_Reduce^t
T_{SK} = \frac{T_{pipe}}{grid_K} + T_{Reduce}^t < T_{pipe} \iff T_{Reduce}^t < T_{pipe}\Big(1-\frac{1}{grid_K}\Big)

归约时延构成(每 tile部分和驻留 L2、AIV 归约M^t·N^t = L0C/4B

T_{Reduce}^t = \underbrace{\frac{grid_K\cdot M^t N^t\cdot 4B}{W_{L2}}}_{\text{AIC 写部分和}} + \underbrace{\frac{grid_K\cdot M^t N^t\cdot 4B}{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{写回}}

计算 Bound 情形T_pipe = T_MMAD^t代入判据两边除以 L0C/4B 后 tile 尺寸消去——K 阈值不依赖 M/N 具体值:

K > \frac{grid_K^2}{grid_K-1}\cdot\theta_c,\qquad \theta_c = \frac{Q_{16}}{2}\Big(\frac{8B}{W_{L2}}+\frac{1}{Q_{AIV}}\Big) \approx 10.9

Q16 为 Cube-only 口径 13.5Tissue#40旧总算力口径 15.1875T 时 θ_c≈12。代入数值grid_K=2 → K>44grid_K=4 → K>58grid_K=8 → K>100。L2 读写1.54 ps/元素是主导项AIV 求和仅占 5%。

访存 Bound 情形阈值恒低于计算 Boundθ_m·[M^tN^t/(M^t+N^t)]/θ_c ≤ 128/270 ≈ 0.47 < 1汇总条件取计算 Bound 阈值(保守,覆盖两种情形)。

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

4. 实现方案

核间组织:先按 B/M/N 切出输出块,剩余核预算折成 K 向份数:

blocksPerBatch = \Big\lfloor\frac{C}{B}\Big\rfloor,\qquad grid_K = \frac{blocksPerBatch}{mCnt\cdot nCnt}

mCnt、nCnt 收拢为 blocksPerBatch 的因子(避免碎核尾块)。归约组内核 c 负责 K 段 [cK/grid_K, (c+1)K/grid_K)

核内流水:对自己的 K 段做标准分块流水MTE2→L1→L0→mmad段内多轮在 L0C 原地累加;段完部分和经 Fixpipe 写出。

写出 dtype 关键点用户特别强调StreamK 的中间部分和为防精度丢失,写出 dtype = L0C dtype4B不随 C 矩阵的 fp16/fp8 转换——因为部分和还要再次读入 AIV 完成 K 维度累加,中途转 fp16 会丢精度。只有最终归约结果才按 C dtype 写出。

归约grid_K 个核的部分和经归约Fixpipe 模式或 AIV求和为最终结果workspace 驻留 L2。

5. 时延模型

T_{SK} = \max\Big(\frac{T_{MMAD}}{grid_K},\; \frac{T_{MTE2}}{grid_K}\Big) + T_{Reduce} + T_{drain}

其中 T_MMAD、T_MTE2 为不切 K 的单 tile 流水时延,切 K 后并行缩 grid_K 倍T_Reduce 为串行追加的归约尾。

6. 与源码的差异

源码 batch_matmul_v3_basic_streamk_tiling.cpp 的 K 固定门槛为 CeilAlign(K,256) ≥ max(8192, aicNum×256B/dtype)

  • aicNum×256B/dtype = 4096BF16= dValue 下限在最大 grid_K=C 下的保障(对应条件 2
  • 8192 = C×512B = dValue 推荐值在最大 grid_K=C 下的保障(同为条件 2取推荐值
  • max 取更严的 8192。

修正后的归约阈值θ_c≈10.9grid_K=32 时 K>360远低于 8192说明 8192 的绑定约束是 dValue条件 2不是归约代价条件 3。源码不动态算 grid_K用固定阈值保守合并两条条件。本软件按理论动态计算 grid_K 与 θ_c进入条件更精细。