Add BMM_Theory: docs/02_分支理论/00_总纲_分支决策树.md
This commit is contained in:
90
BMM/BMM_Theory/docs/02_分支理论/00_总纲_分支决策树.md
Normal file
90
BMM/BMM_Theory/docs/02_分支理论/00_总纲_分支决策树.md
Normal 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 个维度:B、M、N、K。**核间怎么分这 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 在 B≥C 且 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 < K)MergeBatch 恒劣于 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% | B≥C、负载均衡、L1 四形态之一 |
|
||||
| 特殊分支 | 1.9% | K=0/1 |
|
||||
| StreamK | 0.08% | P<C/2 且 K 大(细长 case) |
|
||||
| 转Matmul | 0.05% | 单边 batch=1 |
|
||||
|
||||
七个分支全部有真实 case 命中,无空分支、无覆盖空洞。
|
||||
Reference in New Issue
Block a user