9.8 KiB
9.8 KiB
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算子分析/同步仓库:giteaadmin/matmul-analysis→ 根目录新建Matmul/
0. 三大任务(来自需求)
- 性能理论建模:对 Matmul 在 NPU 上的执行做理论建模,真实反映硬件执行情况、力求准确评估算子性能。给定具体 case 与算子实现所需的 tiling & swizzle 方案和参数后,能给出该芯片硬件的 profile 性能分析评估。
- 最优软件实现方案:结合 NPU 架构规格与算子数据流,通过有条理的分析和公式推导,给出任意 case 的 matmul 输入后的最优实现方案(核心是 tiling & swizzle 方案)。
- 源码对比与改进建议:对比 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.)
- msProf 实测数据:950PR 真机(Atlas 350 加速卡)或仿真环境的 profile 数据,用于校准/验证理论模型精度。当前环境无 NPU,需明确获取途径(真机、CANN 仿真、或官方公开性能数据)。
- 读写带宽单向值:官方只公开 GM 总带宽 1.6TB/s,读写单向带宽需实测或依据 msProf 反推。
- 源码中部分分支的完整实现:本地锚点基本齐全,但若分析发现个别文件缺失,用
.tmp/gitcode_fetch.py从 gitcode 补拉。 - 竞品参照(可选):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 —— 情报准备与规划(本轮)✅
- 梳理情报清单、确认本地源码/文档完整性
- 提取 950 白皮书全文(可 grep)
- 产出本规划文档 + 情报清单,同步 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. 下一步(下一轮迭代入口)
- 从 Phase 1.1 开始:输出硬件参数与 Roofline 模型(把 950PR 架构解读里的数值表 + 白皮书全文规格,整理成可复用的"硬件参数表")。
- 同步产出
case库/:定义第一批典型 case(覆盖方阵/瘦长/大K/低精度),作为 1.4 评估器与 Phase 2 的公共输入。