# MmadMx
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
产品支持情况
不传入bias的原型
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
- Atlas 200I/500 A2 推理产品:不支持
- Atlas 推理系列产品AI Core:不支持
- Atlas 推理系列产品Vector Core:不支持
- Atlas 训练系列产品:不支持
- Kirin X90:不支持
- Kirin 9030:不支持
传入bias的原型
- Ascend 950PR/Ascend 950DT:支持
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:不支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持
- Atlas 200I/500 A2 推理产品:不支持
- Atlas 推理系列产品AI Core:不支持
- Atlas 推理系列产品Vector Core:不支持
- Atlas 训练系列产品:不支持
- Kirin X90:不支持
- Kirin 9030:不支持
功能说明
头文件路径为:basic_api/kernel_operator_mm_intf.h。
MmadMx(全称Microscaling Mmad)为带有量化系数的矩阵乘法,即左矩阵和右矩阵均有对应的量化系数矩阵,左量化系数矩阵scaleA和右量化系数矩阵scaleB。MmadMx场景中,左量化系数矩阵与左矩阵乘积,右量化系数矩阵与右矩阵乘积,对两个乘积的结果做矩阵乘法。
MmadMx的计算公式为:C=(scaleA⊗A)*(scaleB⊗B)+Bias,“⊗”表示广播乘法,左/右矩阵与左/右量化系数矩阵做乘积时,K方向上每32个元素共享一个量化因子,如图1所示(其中以AB矩阵均为fp4x2_e2m1_t数据类型为例)。
- A、scaleA、B、scaleB为源操作数。A为左矩阵,形状为[M,K];scaleA为左量化系数矩阵,形状为[M,K/32];B为右矩阵,形状为[K,N];scaleB为右量化系数矩阵,形状为[K/32,N]。
- C为目的操作数,存放矩阵乘结果的矩阵,形状为[M,N]。
- Bias为矩阵乘偏置,形状为[1,N]。对(scaleA⊗A)*(scaleB⊗B)结果矩阵的每一行都采用该Bias进行偏置。
图1MmadMx接口矩阵乘分形示意图 
表1矩阵计算矩阵A、B、C解释说明
| 矩阵计算逻辑 | 矩阵计算物理位置 | 维度 | 输入/输出数据格式 | 数据类型 |
|---|---|---|---|---|
| A | L0A Buffer | M x K | [Nz] | 数据类型 |
| scaleA | L0A_MX Buffer | M x K/32 | [大Z小z]小z shape为(2,16) | |
| B | L0B Buffer | K x N | [Zn] | |
| scaleB | L0B_MX Buffer | K/32 x N | [大N小n]小n shape为(2,16) | |
| C | L0C Buffer | M x N,可支持使用偏置矩阵Bias进行初始化,维度为1 x N | [Nz] |
函数原型
不传入bias
template <typename T, typename U, typename S> __aicore__ inline void MmadMx(const LocalTensor<T>& dst, const LocalTensor<U>& fm, const LocalTensor<S>& filter, const MmadParams& mmadParams)传入bias
template <typename T, typename U, typename S, typename V> __aicore__ inline void MmadMx(const LocalTensor<T>& dst, const LocalTensor<U>& fm, const LocalTensor<S>& filter, const LocalTensor<V>& bias, const MmadParams& mmadParams)
参数说明
表2参数说明
| 参数名称 | 输入/输出 | 含义 |
|---|---|---|
| dst | 输出 | 目的操作数,结果矩阵C,类型为LocalTensor,支持的物理存储位置为L0C Buffer(TPosition:CO1)。 LocalTensor的起始地址需要按照1024字节对齐。 |
| fm | 输入 | 源操作数,左矩阵A,类型为LocalTensor,支持的物理存储位置为L0A Buffer(TPosition:A2)。 左矩阵A对应的scale矩阵起始地址为:A矩阵起始对应地址/16。 对于fp4场景LocalTensor的起始地址需要按照512字节对齐。对于fp8场景LocalTensor的起始地址需要按照1024字节对齐。 |
| filter | 输入 | 源操作数,右矩阵B,类型为LocalTensor,支持的物理存储位置为L0B Buffer(TPosition:B2)。 右矩阵B对应的scale矩阵起始地址为:B矩阵起始对应地址/16。 对于fp4场景LocalTensor的起始地址需要按照512字节对齐。对于fp8场景LocalTensor的起始地址需要按照1024字节对齐。 |
| bias | 输入 | 源操作数,Bias矩阵,类型为LocalTensor,支持的物理存储位置为BT Buffer(TPosition:C2)。 LocalTensor的起始地址需要按照64字节对齐。 |
| mmadParams | 输入 | 矩阵乘相关参数。 该参数类型的具体定义请参考 ${INSTALL_DIR}/asc/include/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。MmadParams参数说明请参考MmadParams结构体内参数说明。 |
数据类型
表3MmadMx接口左矩阵、右矩阵、Scale矩阵、Bias矩阵、结果矩阵支持的精度类型组合(Ascend 950PR/Ascend 950DT)
| 左矩阵fm | 右矩阵filter | Scale矩阵 | 偏置Bias | 结果矩阵dst |
|---|---|---|---|---|
| fp4x2_e1m2_t | fp4x2_e1m2_t | fp8_e8m0_t | float | float |
| fp4x2_e2m1_t | fp4x2_e1m2_t | fp8_e8m0_t | float | float |
| fp4x2_e1m2_t | fp4x2_e2m1_t | fp8_e8m0_t | float | float |
| fp4x2_e2m1_t | fp4x2_e2m1_t | fp8_e8m0_t | float | float |
| fp8_e4m3fn_t | fp8_e4m3fn_t | fp8_e8m0_t | float | float |
| fp8_e4m3fn_t | fp8_e5m2_t | fp8_e8m0_t | float | float |
| fp8_e5m2_t | fp8_e4m3fn_t | fp8_e8m0_t | float | float |
| fp8_e5m2_t | fp8_e5m2_t | fp8_e8m0_t | float | float |
返回值说明
无
约束说明
- 不同矩阵对于存储位置的约束:
- 结果矩阵C只支持位于物理存储位置为L0C Buffer(TPosition:CO1),大小256KB。
- 左矩阵A只支持位于物理存储位置为L0A Buffer(TPosition:A2),大小64KB。
- 右矩阵B只支持位于物理存储位置为L0B Buffer(TPosition:B2),大小64KB。
- Bias矩阵只支持位于物理存储位置为BT Buffer(TPosition:C2),大小4KB。
- 地址约束说明请参考表2。
- 当M、K、N中的任意一个值为0时,表示指令不会执行,该接口将被视为NOP(空操作)。
- K需要是64的倍数。
- 对于fp4场景A/B矩阵的起始地址需要按照512字节对齐,对于fp8场景A/B矩阵的起始地址需要按照1024字节对齐。
- 左矩阵A/B对应的scale矩阵起始地址为:A/B矩阵起始对应地址/16。
- 其他特殊场景约束可参考Mmad接口约束说明。
调用示例
完整使用样例请参考MmadMx最佳实践。
【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考