From 13c08a52baf3952fd44c2ba542c7d00476c5d6dc Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 3 Sep 2026 08:10:30 +0000 Subject: [PATCH] =?UTF-8?q?Add=20BMM=5FTheory:=20docs/02=5F=E5=88=86?= =?UTF-8?q?=E6=94=AF=E7=90=86=E8=AE=BA/00=5F=E6=80=BB=E7=BA=B2=5F=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=86=B3=E7=AD=96=E6=A0=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/02_分支理论/00_总纲_分支决策树.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 BMM/BMM_Theory/docs/02_分支理论/00_总纲_分支决策树.md diff --git a/BMM/BMM_Theory/docs/02_分支理论/00_总纲_分支决策树.md b/BMM/BMM_Theory/docs/02_分支理论/00_总纲_分支决策树.md new file mode 100644 index 0000000..2e735b1 --- /dev/null +++ b/BMM/BMM_Theory/docs/02_分支理论/00_总纲_分支决策树.md @@ -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