深入解析华为 CANN Matmul 高阶算子:数据流、NZ 格式与完整 Tiling 策略全解
在昇腾 AI 处理器生态中,矩阵乘法(Matmul)是最关键、最基础的核心算子之一。无论是 Transformer、CNN 还是复杂的科学计算模型,最终都可以分解为一系列 Matmul 操作。因此,一个高性能 Matmul 的实现,往往决定了整个模型推理与训练性能的上限。
本文基于 CANN 高阶 API 的实现思路,从架构数据流、ND/NZ 数据布局,到多核与核内 Tiling 策略,全面解析 Matmul 在昇腾 AI Core 上是如何高效落地的。阅读后你将能够理解:
- Matmul 在 AI Core 内部的真实执行路径
- ND 与 NZ 之间为何有巨大性能差异
- 一次完整的矩阵计算是如何被切分、搬运、缓存、调度的
- 关键 Tiling 参数的实际作用与设计逻辑
本文不会复制官方文档,而是站在"开发者实现"视角重新组织内容,希望帮助你真正理解算子背后的机制。

1. Matmul 的本质与高阶 API 的角色
在数学上,矩阵乘法的表达很简单:
C = A \\times B + bias
其中:
- A 形状为 [M, K]
- B 形状为 [K, N]
- C 的结果形状为 [M, N]
- bias 形状为 [1, N],按行广播
然而,在硬件加速器中,简单的数学公式需要转化为:
- 可并行的计算任务
- 有组织的数据搬运流程
- 和缓存层次结构有效配合的数据格式
高阶 API 的职责就是封装这些底层细节,开发者可以通过统一接口调用 Matmul,而无需自己决定数据如何分块、如何搬运、如何安排 cube 单元执行。
但为了写出高性能的自定义算子或理解性能瓶颈,我们必须深入理解这些底层机制。
2. AI Core 中的三层数据缓存与矩阵乘法的数据流
在昇腾 AI Core 内部,数据并非直接从外部存储(GM)流入计算单元,而是需要经过多级缓存。其结构与 CPU 类似,但针对矩阵计算做了专门设计。
2.1 数据的逻辑存储层次
在 Matmul 中,会频繁使用以下几种存储位置:
| 位置 | 作用 | 类比 CPU |
|---|---|---|
| A1 / B1 / C1 | 大块矩阵片段缓存 | L2 Cache |
| A2 / B2 / C2 | 小块矩阵片段缓存 | L1 Cache |
| CO1 | 中间 Cube 计算结果 | 寄存器级 tile |
| CO2 | 汇聚后的整块输出 | L2 输出缓存 |
| VECCALC | 临时计算区 | 运算 scratch buffer |
理解这些位置的意义后,数据流就非常清晰了。
2.2 A 矩阵的数据流
A 存储路径通常为:
GM → A1 → A2
也有小规模计算可能走:
GM → A2
为什么要经过 A1?
因为 A1 更大,可以提前缓存未来计算要使用的数据 。
在大规模 Matmul 中,若每次 cube 执行前都要从 GM 直接拉取 A2 级块,计算会被数据搬运严重拖慢。
2.3 B 矩阵的数据流
B 的路径与 A 完全类似:
GM → B1 → B2
或小规模情况:
GM → B2
由于 B 的访问模式更偏向 N 方向的切片,合适的 B1 缓存对于减少等待更加重要。
2.4 计算与输出数据流
矩阵计算实际发生在 A2 × B2:
A2 * B2 = CO1(cube 结果片)
随后:
CO1 → CO2(累加与整块汇聚)
CO2 → GM 或 CO2 → VECIN(作为后续算子输入)
整个流程像一条高速管线:
GM → L2(A1/B1)→ L1(A2/B2)→ 计算 → 回流到 CO2 → GM
这也是昇腾的高性能来源之一:
大量的精心调度的数据预取与双缓冲机制隐藏了数据延迟。
3. ND 与 NZ 数据格式:为什么必须使用 NZ?
Matmul 的核心计算单元是 Cube,其内部采用固定形状 tile(类似 16×16 或 32×32)的矩阵块进行高吞吐计算。
为了让数据完美适配 Cube 的访存模式,昇腾引入了第二种数据格式 NZ 格式。
3.1 ND 格式:传统按行或按列排布
例如一个 4×4 ND:
0, 1, 2, 3,
4, 5, 6, 7,
8, 9,10,11,
12,13,14,15
连续存储、线性排布,没有针对并行矩阵单元做优化。
3.2 NZ 格式:分形(Fractal)存储
NZ 的核心思想:把大矩阵按固定 tile(如 2×2)的方式切成多个小块,再按 Cube 单元最优顺序重新排列。
示例(4×4 → tile 2×2):
NZ: 0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15
表现:
- 外层分形沿列方向排布(大 N)
- 内层 tile 元素按行排布(小 z)
因此称为 NZ(大 N,小 z)格式。
3.3 为什么 Matmul 要用 NZ?
因为:
- Cube 计算单元的访存是 tile 级别的,而 NZ 正好对应 Cube 的 tile 形状
- ND 转 NZ 可以批量合并访存,提高带宽利用率
- NZ 保证矩阵操作时每个 tile 都连续存储,减少随机访问
实际性能收益往往可以提升 数倍。
4. 多核 Tiling:最大化利用所有 AI Core
昇腾处理器往往有多个 AI Core。要想把整块 Matmul 分发给多个核并行,需要对 A/B/C 进行分块。
4.1 多核维度切分策略
A:沿 M 轴切分 → 每核获得 SingleCoreM × K
B:沿 N 轴切分 → 每核获得 K × SingleCoreN
C:输出为 SingleCoreM × SingleCoreN
示意:
如果有 8 个核:
- M 被切成 4 份
- N 被切成 2 份
- 每个核负责其中一个 M×N 子区域
例如核 3 负责绿色方块:
A分块: SingleCoreM × K
B分块: K × SingleCoreN
C分块: SingleCoreM × SingleCoreN
如此即可实现真正的并行。
5. 核内 Tiling:Local Memory 中的精细化调度
即使一个核分到的 A、B、C 分块已缩小,依然无法一次性装进 Local Memory(L1/L2)。
因此需要对单核数据进一步切分,这叫 核内 Tiling。
5.1 A/B/C 在核内的切分
核内主要切分三个方向:
A:沿 M、K 切分 → baseM × baseK
B:沿 N、K 切分 → baseN × baseK
C:baseM × baseN,每次一个小 tile
计算方式类似:
C += A(m, k) × B(k, n)
其中每次迭代累加 baseK 方向的中间结果。
5.2 iterateOrder --- C tile 输出顺序
Matmul 在核内会按 "遍历顺序" 输出 C 分片,有两种策略:
| value | 说明 |
|---|---|
| 0 | 先沿 M,再沿 N |
| 1 | 先沿 N,再沿 M |
不同模型中,这会影响 预取效率、局部性,从而影响性能。
5.3 深度参数:depthA1、depthB1
这些参数决定:
- A1 中存了多少个 baseM × baseK tile
- B1 中存了多少个 baseN × baseK tile
作用类似"二级缓冲区容量",决定可连续执行多少个 iter 而不重新搬运。
5.4 stepM/stepN、stepKa/stepKb:缓存偏移控制
这些参数说明:
- 缓冲中数据如何按 M/N/K 方向排列
- 如何快速移动到下一 tile 的起点
- 保证预取逻辑可以自动计算下一块的位置
这是高阶 API 自动生成的关键逻辑,开发者通常无需手写,但理解它们有助于分析性能。
6. 从整体视角看一次 Matmul 的执行流程
综合前面所有内容,矩阵乘法的一次完整执行过程可以理解为:
-
多核切分
- M/N 方向划分多个子矩阵
- 每核处理一个子 C 分块
-
核内切分
- A/B/C 进一步切成 baseM/baseN/baseK 子块
-
数据搬入(GM → A1/B1 → A2/B2)
- 大块提前缓存到 A1/B1
- 计算前搬到 A2/B2
-
cube 计算
- A2 × B2 → CO1
-
结果累加与输出
- CO1 → CO2
- CO2 → GM
所有动作都经过高阶 API 自动调度,包括:
- 缓存分配
- 多核映射
- NZ 格式转换
- 双缓冲预取
- 内核循环展开
开发者只需关心输入输出,而 CANN 自动满足高性能要求。
7. 总结:Matmul 看似简单,实现却是系统工程
通过以上内容我们可以看到:
- Matmul 并非简单的 A×B,而是一个复杂的数据调度与硬件协同过程
- ND/NZ 的选择决定了 Cube 是否能高效工作
- 多核与核内 Tiling 是性能的核心
- 缓存层级设计(A1/A2/B1/B2)是隐藏内存延迟的关键
对算子开发者而言,理解这些机制可以帮助你:
- 写出更优的自定义算子
- 分析 Matmul 性能瓶颈
- 在大规模模型中调优核心算子
- 更好地使用高阶 API,避免低效调用方式
昇腾 CANN 的 Matmul 并不是黑盒,而是一套精细设计的矩阵计算体系。
理解它,就是掌握深度学习算子性能优化的基础。
训练营简介
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。
报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro
