Add BMM_Theory: docs/02_分支理论/00_总纲_分支决策树.md

This commit is contained in:
2026-09-03 08:10:30 +00:00
parent a7b76289e1
commit 13c08a52ba

View File

@@ -0,0 +1,90 @@
# BMM 分支决策树总纲
> 整理自《BMM算子优化分析 v0.98》§三,作为软件 `router.py` 的理论依据.
> 目标芯片: Ascend950PR, 所有分支进入条件只含 case 形状参数 (B/M/N/K/dtype) 与芯片规格参数.
## 1. 性能模型:总时延 = 最慢一级流水
BMM 的执行是核内多级硬件流水的并行:
```
GM ──MTE2──> L1 ──MTE1──> L0A/L0B ──MMAD(Cube)──> L0C ──Fixpipe──> GM/L2
↑________________ L2 Cache (读 5.2TB/s) ________________↑
```
$$T_{total} = \max\big(T_{MMAD},\; T_{MTE2},\; T_{MTE1},\; T_{Fixpipe}\;[,\;T_{Reduce}]\big) + T_{drain}$$
各流水级时延可被双缓冲相互掩盖,**优化的关键是对瓶颈级的优化**。由此得到设计自由度——**瓶颈交换**搬移是瓶颈时可牺牲算力冗余计算换搬移效率MergeBatch 典型计算是瓶颈时可牺牲搬移重复读取换计算效率ASW_Basic 切 M/N 典型)。
case 固有算存比与 16bit 位宽平衡点:
$$AI = \frac{2MN}{M+N},\qquad R_{16} = \frac{486\ \text{TFLOPS}}{1.6\ \text{TB/s}\,/\,2\ \text{B}} \approx 607.5$$
AI < R₁₆ 访存 Bound反之计算 Bound
## 2. 实现本质4 个维度的核间切分
$$C[B,M,N] = \Big\{\,C[B_u, M_i, N_j] = \sum_k A[B_u, M_i, K_k] \cdot B[B_u, K_k, N_j]\,\Big\}$$
分块有 4 个维度BMNK。**核间怎么分这 4 个维度就是分支划分的第一性问题**。
| 切分维度 | 读入 | 计算 | 写出 | 代价 |
|---|---|---|---|---|
| B | 核间零重复读 | 无核间依赖 | 无中间结果 | **0** |
| M/N | 共享矩阵被重复读 (L2+swizzle 吸收) | 无核间依赖 | 无中间结果 | |
| K | 零重复读 | **多核共同完成,有依赖** | **中间结果写出 + 归约** | |
价格严格排序cost(切B) = 0 < cost(切M/N) cost(切K)。**整条决策树就是按价格从低到高购买并行度买不够才加价。**
## 3. 分支推导(决策树)
```
case (B, M, N, K, dtype)
├─ BatchA=1 或 BatchB=1 ──────▶ 转Matmul (与 Matmul 只差一个维度标签)
├─ K=0 / K=1 ─────────────────▶ 特殊分支 (Cube 无用, 走 AIV 向量通路)
▼ B ≥ C ?
是 ─┐ 切 B 免费 (每核 b_core=B/C 个 batch)
├─ 单 batch M×N 太小, 合并搬移 ──▶ MergeBatch (冗余算力换搬移效率)
│ 进入: 5 条件 (L0C/搬移量/tile/算存比/b_core≥2b0)
│ 胜出: K 截断 (k_L1=K) 且 b_core > b0(T_comp+T_write)/T_cmd
└─ 逐 batch 计算 ──────────────▶ IterBatch (无浪费, 最朴素)
进入: b_core≥1 + 负载均衡 + L1 四形态之一 + 搬移效率
形态: a)单batch全驻留 b)双batch乒乓 c)一侧驻留+对侧切K d)两侧切K
▼ B < C 或切B分支条件不满足
ASW_Basic (兜底): 核间切 M/N, 重复读交给 L2 + swizzle
进入: P = B·MN·4B/L0C ≥ C
策略: B→M→N 线性映射 + ASW 滑窗蛇形 + L2 分组 + 尾轮 A0/A1a/A1b/方案B
降核: P < C 且不满足 StreamK -> 只用 ⌈P⌉ 核
▼ P ≤ C/2 (B/M/N 都买不满)
StreamK: 核间切 K + 归约
进入: P ≤ C/2, K/grid_K ≥ 256B/dtype, K > grid_K²/(grid_K-1)·θ_c (θ_c≈12)
```
## 4. 重叠区仲裁
MergeBatch IterBatch BC M×N 中等时都合法仲裁依据v1.1 §4.5 统一分界条件
$$\text{MergeBatch 最优} \iff \underbrace{k_{L1} = K}_{\text{K 截断}} \;\land\; \underbrace{b_{core} > \frac{b_0 \cdot (T_{comp} + T_{write})}{T_{cmd}}}_{\text{搬移节省 > drain 惩罚}}$$
**L1 绑定情形k_L1 < KMergeBatch 恒劣于 IterBatch**——合并只放大 drain 暴露,没有换来搬移命令节省。软件中由分界条件预判 + 端到端时延模型双保险裁决(`router.py::_route_split_b`)。
## 5. 分支覆盖统计v0.98 §十,对数采样 3.2 亿 case
| 分支 | 占比 | 区域特征 |
|---|---|---|
| ASW_Basic | 54.1% | 通用兜底 |
| MergeBatch | 19.5% | 小 M×N 且单核搬移量足够的大 batch |
| 降核 ASW | 12.6% | P<C K 不满足 StreamK |
| IterBatch | 11.8% | BC负载均衡L1 四形态之一 |
| 特殊分支 | 1.9% | K=0/1 |
| StreamK | 0.08% | P<C/2 K 细长 case |
| 转Matmul | 0.05% | 单边 batch=1 |
七个分支全部有真实 case 命中无空分支无覆盖空洞