162 lines
9.8 KiB
Markdown
162 lines
9.8 KiB
Markdown
# Matmul 算子分析 —— 项目规划(小步快跑式)
|
||
|
||
> 目标芯片:昇腾 950PR(32 AIC / 64 AIV,1.65GHz,GM 128GB/1.6TB/s,L2 128MB/5.2TB/s,架构版本 351x / DAV_3510)
|
||
> 项目性质:中长期,多轮迭代、严谨逻辑推导、理论建模与验证
|
||
> 关联工程:BMM 分析(同仓 `BMM/`,已迭代多轮)——本项目的 tiling/swizzle 方法论大量复用并深化 BMM 的 `ASW_Basic`(标准 Matmul tiling)分支
|
||
> 本地工作目录:`/storage/Users/currentUser/WorkBuddy/昇腾NPU/Matmul算子分析/`
|
||
> 同步仓库:gitea `admin/matmul-analysis` → 根目录新建 `Matmul/`
|
||
|
||
---
|
||
|
||
## 0. 三大任务(来自需求)
|
||
|
||
1. **性能理论建模**:对 Matmul 在 NPU 上的执行做理论建模,真实反映硬件执行情况、力求准确评估算子性能。给定具体 case 与算子实现所需的 tiling & swizzle 方案和参数后,能给出该芯片硬件的 profile 性能分析评估。
|
||
2. **最优软件实现方案**:结合 NPU 架构规格与算子数据流,通过有条理的分析和公式推导,给出任意 case 的 matmul 输入后的最优实现方案(核心是 tiling & swizzle 方案)。
|
||
3. **源码对比与改进建议**:对比 Matmul 算子当前源码实现,给出软件改进点;结合 top case,针对 NPU 架构给出下一代硬件的具体改进建议。
|
||
|
||
三任务之间的依赖关系:
|
||
|
||
```
|
||
任务1(性能模型)
|
||
│ 提供"评判标准":任何 tiling/swizzle 方案都能被评估
|
||
▼
|
||
任务2(最优方案)
|
||
│ 用任务1的模型反向推导最优参数
|
||
▼
|
||
任务3(源码对比/硬件建议)
|
||
以任务1的模型 + 任务2的最优解为标尺,衡量源码差距 → 软件改进点 → 硬件改进点
|
||
```
|
||
|
||
---
|
||
|
||
## 1. 情报信息清单
|
||
|
||
> 详细到文件级的情报清单见 `01_情报清单.md`。这里只做概览。
|
||
|
||
### 1.1 已就绪(本地知识库,可直接用于分析)
|
||
|
||
| 类别 | 位置 | 状态 |
|
||
|---|---|---|
|
||
| 硬件架构白皮书全文 | `昇腾NPU知识库/00_硬件/昇腾950_NPU架构白皮书.pdf` + **新提取 `...白皮书.txt`(40 页全文,可 grep)** | ✅ 本轮完成提取 |
|
||
| 950PR/950DT 产品页与产品形态 | `昇腾NPU知识库/00_硬件/*.txt` `.md` | ✅ |
|
||
| 950PR 微架构解读(含数据通路 SVG) | gitea `昇腾950PR/昇腾950PR架构解读.md` | ✅ |
|
||
| CANN 官方文档全套 | `昇腾NPU知识库/CANN社区版9.2.0-beta.1`(5512 页)、`商用版9.0.0`(4483 页)、`8.5.0`(3100 页) | ✅ |
|
||
| **官方性能建模公式文档** | `昇腾NPU知识库/代码仓/cann-samples/Samples/2_Performance/matmul_story/docs/matmul_performance.md`(T_cube/T_mte2/T_mte1/T_fixp 完整公式)+ `quant_matmul_mx_performance.md`、`weight_quant_matmul_mxfp8fp4_performance.md` | ✅ |
|
||
| **Matmul v3 完整源码** | `昇腾NPU知识库/代码仓/ops-nn/matmul/mat_mul_v3/`(182 文件:op_host tiling + op_kernel/arch35 60 文件) | ✅ |
|
||
| **blasLt matmul 完整 kernel** | `昇腾NPU知识库/代码仓/ops-blas/blasLt/matmul/`(engine/epilogue/fp32/mxfp4/mxfp8 共 25 文件) | ✅ |
|
||
| 矩阵乘模板库 catlass | `昇腾NPU知识库/代码仓/catlass/`(含 43_ascend950_basic_matmul 示例) | ✅ |
|
||
| 官方调优样例(.asc kernel) | `昇腾NPU知识库/代码仓/cann-samples/.../matmul_story/matmul_recipes/`(a16w16/a32w32/quant 各模板) | ✅ |
|
||
| 算子→代码映射索引 | `昇腾NPU知识库/CODE_INDEX.md`(matmul 32 个变体) | ✅ |
|
||
|
||
### 1.2 待补充(列为后续小步,见 3.)
|
||
|
||
1. **msProf 实测数据**:950PR 真机(Atlas 350 加速卡)或仿真环境的 profile 数据,用于校准/验证理论模型精度。当前环境无 NPU,需明确获取途径(真机、CANN 仿真、或官方公开性能数据)。
|
||
2. **读写带宽单向值**:官方只公开 GM 总带宽 1.6TB/s,读写单向带宽需实测或依据 msProf 反推。
|
||
3. **源码中部分分支的完整实现**:本地锚点基本齐全,但若分析发现个别文件缺失,用 `.tmp/gitcode_fetch.py` 从 gitcode 补拉。
|
||
4. **竞品参照(可选)**:NVIDIA CUTLASS/TRT-LLM 的 GEMM 建模思路,用于方法论交叉验证(仅作对照,不对外引用内部资料)。
|
||
|
||
---
|
||
|
||
## 2. 与 BMM 分析的关系(复用与边界)
|
||
|
||
BMM 分析已产出的可复用资产:
|
||
- `T_total = max(T_MMAD, T_MTE2, T_MTE1, T_FIXPIPE [, T_REDUCE])` 的建模骨架与公式
|
||
- 硬件参数表(L0A/L0B/L0C/L1/UB/MTE 带宽/L2 替换机制)
|
||
- 分支体系(FoldBatchToMatMul / MergeBatch / IterBatch / StreamK / ASW_Basic)
|
||
- 长宽比、baseM/baseN、SingleCoreM/N、尾轮重切、UnitFlag 等关键结论
|
||
|
||
**边界**:
|
||
- BMM 的差异化难点在 **batch 维切分与分支决策**;Matmul 的差异化难点在 **单矩阵乘的 tiling 深度优化 + swizzle(SWAT/StreamK/SplitK)编排 + L2 复用 + 量化(MXFP4/MXFP8/HiF8)**。
|
||
- 本项目聚焦 `[M,K]×[K,N]→[M,N]` 单矩阵乘,把 BMM 里 `ASW_Basic` 的"标准 Matmul tiling"作为起点向下钻,而不是重复 BMM 的分支决策。
|
||
|
||
---
|
||
|
||
## 3. 小步快跑规划(每步可交付、可验证)
|
||
|
||
> 原则:每一步产出**独立可评审的文档/工具/结论**,先跑通主干再迭代细化;模型必须能被验证(有对标 case 或公式自洽性检验)。
|
||
|
||
### Phase 0 —— 情报准备与规划(本轮)✅
|
||
- [x] 梳理情报清单、确认本地源码/文档完整性
|
||
- [x] 提取 950 白皮书全文(可 grep)
|
||
- [x] 产出本规划文档 + 情报清单,同步 gitea `Matmul/`
|
||
|
||
### Phase 1 —— 性能理论建模(任务 1)
|
||
|
||
| 步 | 交付物 | 验证方式 |
|
||
|---|---|---|
|
||
| 1.1 硬件参数与数据通路模型 | `Matmul/1_性能模型/1.1_硬件参数与Roofline模型.md`:峰值算力、各级带宽、算术强度、Roofline | 与白皮书/官方公式数值自洽 |
|
||
| 1.2 单核流水线建模 | `1.2_单核流水线建模.md`:T_cube/T_mte2/T_mte1/T_fixp 完整推导 + baseM/baseN/baseK 影响分析 | 与官方 `matmul_performance.md` 公式对齐 |
|
||
| 1.3 多核并行 + swizzle 建模 | `1.3_多核并行与Swizzle建模.md`:核间切分、L2 命中率、SWAT 窗口、重复搬运量 | 公式闭合(重复搬运量与 SWAT 窗口关系) |
|
||
| 1.4 profile 评估器(工具) | `1.4/profile_model.py`(或 .mjs):输入 case + tiling&swizzle 参数 → 输出各流水耗时与瓶颈判定 | 单测:已知 case 手算对照 |
|
||
| 1.5 模型校准与验证 | `1.5_模型验证报告.md`:用官方样例/已知数据校准,量化误差 | 误差 < 15%~20% 量级 |
|
||
|
||
### Phase 2 —— 最优软件实现方案(任务 2)
|
||
|
||
| 步 | 交付物 | 验证方式 |
|
||
|---|---|---|
|
||
| 2.1 分支与模板体系 | `2_最优方案/2.1_模板体系.md`:SWAT/StreamK/SplitK/DPSK 等模板的数据流与适用域 | 与源码策略优先级对照 |
|
||
| 2.2 baseM/baseN/baseK 最优推导 | `2.2_Tiling参数最优推导.md`:由瓶颈方程反解最优分块 | 用 1.4 评估器验证推导结论 |
|
||
| 2.3 swizzle 编排最优推导 | `2.3_Swizzle编排最优推导.md`:核分配顺序、L2 切分、尾轮重切 | 同上 |
|
||
| 2.4 任意 case 决策算法 | `2.4_最优方案决策.md`:case 输入 → 最优 tiling&swizzle 的完整决策流程 | 覆盖典型 case 集(方阵/瘦长/大K/量化) |
|
||
|
||
### Phase 3 —— 源码对比与改进建议(任务 3)
|
||
|
||
| 步 | 交付物 | 验证方式 |
|
||
|---|---|---|
|
||
| 3.1 源码 tiling/swizzle 逆向 | `3_源码对比/3.1_mat_mul_v3源码解析.md`(matmul_v3_*_tiling.cpp / block_scheduler_*.h) | 与源码逐行对照 |
|
||
| 3.2 理论与源码差异 → 软件改进点 | `3.2_软件改进点.md` | 每条改进点给理论依据 |
|
||
| 3.3 top case 与硬件改进建议 | `3.3_下一代硬件改进建议.md`(结合 top case) | 每条建议映射到架构瓶颈 |
|
||
|
||
---
|
||
|
||
## 4. 目录结构约定
|
||
|
||
### 4.1 本地(`Matmul算子分析/`)
|
||
|
||
```
|
||
Matmul算子分析/
|
||
├── req.txt # 需求原文
|
||
├── 00_项目规划_小步快跑.md # 本规划
|
||
├── 01_情报清单.md # 情报清单(文件级)
|
||
├── 1_性能模型/ # 任务1
|
||
├── 2_最优方案/ # 任务2
|
||
├── 3_源码对比/ # 任务3
|
||
└── case库/ # 典型 case(shape/dtype 集合)
|
||
```
|
||
|
||
### 4.2 gitea(`Matmul/`)
|
||
|
||
```
|
||
Matmul/
|
||
├── README.md # 项目总览 + 三大任务 + 目录索引
|
||
├── 00_项目规划_小步快跑.md
|
||
├── 01_情报清单.md
|
||
├── 1_性能模型/
|
||
├── 2_最优方案/
|
||
└── 3_源码对比/
|
||
```
|
||
|
||
### 4.3 文档规范
|
||
|
||
- 每篇分析文档 **markdown + html 双格式**交付(与 BMM 一致),html 用于易读性发布。
|
||
- 文中引用外部资料只引用**有在线链接的公开内容**(昇腾官网 / gitcode / gitea 仓库内文件),不引用本地绝对路径。
|
||
- 推导必须**逻辑连贯、公式完整、结论可被质疑**;每个"结论"都要写清假设与适用边界。
|
||
|
||
---
|
||
|
||
## 5. 关键风险与依赖
|
||
|
||
| 风险 | 影响 | 缓解 |
|
||
|---|---|---|
|
||
| 无真机/仿真,缺 msProf 实测 | 模型精度难以实证 | 先用官方公开样例数据校准;争取 Atlas 350 真机或 CANN 仿真环境 |
|
||
| GM 读写单向带宽无公开值 | 模型参数不确定 | 以总带宽 + 读写比例假设建参,标注可替换点,实测后回填 |
|
||
| 源码个别文件本地缺失 | 分析中断 | `.tmp/gitcode_fetch.py` 补拉,或 gitea 内同步源码锚点 |
|
||
| 硬件细节(L2 替换/MTE 微架构)文档不细 | 建模偏差 | 用 msProf 反推 + 白皮书交叉印证 |
|
||
|
||
---
|
||
|
||
## 6. 下一步(下一轮迭代入口)
|
||
|
||
1. 从 **Phase 1.1** 开始:输出硬件参数与 Roofline 模型(把 950PR 架构解读里的数值表 + 白皮书全文规格,整理成可复用的"硬件参数表")。
|
||
2. 同步产出 `case库/`:定义第一批典型 case(覆盖方阵/瘦长/大K/低精度),作为 1.4 评估器与 Phase 2 的公共输入。
|