MmadBitMode

产品支持情况

产品

是否支持(

不传入bias的原型

)

是否支持(

传入bias的原型

)

Ascend 950PR/Ascend 950DT

√

√

Atlas A3 训练系列产品/Atlas A3 推理系列产品

x

x

Atlas A2 训练系列产品/Atlas A2 推理系列产品

x

x

Atlas 200I/500 A2 推理产品

x

x

Atlas 推理系列产品AI Core

x

x

Atlas 推理系列产品Vector Core

x

x

Atlas 训练系列产品

x

x

功能说明

功能一:完成矩阵乘加(C += A * B)操作。矩阵ABC分别为A2/B2/CO1中的数据。

功能二:针对Ascend 950PR/Ascend 950DT,还支持包含缩放功能的矩阵乘,公式如下:C = (ScaleA ⊗ A) ∗ (ScaleB ⊗ B) + C。ScaleA和ScaleB通过LoadData2DMX接口载入。

以AB矩阵均为fp4x2_e2m1_t数据类型为例,下图展示了ScaleA、ScaleB的分形排布格式和缩放功能原理:

函数原型

参数说明

表1 模板参数说明

参数名

描述

T

目的操作数的数据类型。

U

左矩阵的数据类型。

S

右矩阵的数据类型。

V

Bias矩阵的数据类型。

表2 参数说明

参数名称

输入/输出

含义

dst

输出

目的操作数,结果矩阵,类型为LocalTensor,支持的TPosition为CO1。

LocalTensor的起始地址需要256个元素对齐。

fm

输入

源操作数,左矩阵a,类型为LocalTensor,支持的TPosition为A2。

LocalTensor的起始地址需要512字节对齐。

filter

输入

源操作数,右矩阵b,类型为LocalTensor,支持的TPosition为B2。

LocalTensor的起始地址需要512字节对齐。

bias

输入

源操作数,bias矩阵,类型为LocalTensor,支持的TPosition为C2、CO1。

LocalTensor的起始地址需要128字节对齐。

mmadParams

输入

矩阵乘相关参数,该参数类型的具体定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_mm.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。

MmadBitModeParams,参数说明请参考表3。

表3 MmadBitModeParams类参数说明

参数名称

含义

config0

uint64_t类型,与MmadBitModeConfig0位域(bit-field)结构体类型参数config0BitMode组成联合体(union),初始化为0,可以使用类对象的GetConfig0()函数获取其值。

config0BitMode

MmadBitModeConfig0位域(bit-field)结构体类型,参数参考表4,与config0组成联合体(union)。

MmadBitModeParams类参数设计思想说明:

联合体(union)是一种特殊的数据结构,允许在相同的内存位置存储不同的数据类型。union的所有成员共享同一块内存空间,大小由最大成员决定,同一时间只能使用一个成员。

位域(bit-field)是一种特殊的类成员,允许精确控制结构体中成员变量所占用的内存位数。结构体中成员变量从上到下对应内存中从低位到高位。

MmadBitModeParams类使用union与bit-field方法,采用bit位表达参数类型,使用bit-field结构体自动处理入参的bit位数,并利用union的特性实现多参数融合传递,仅需传递一个入参即可包含全部所需信息,对应底层接口仅需要接收一个参数。同时,当需要修改参数中某一bit位的值时,仅需要通过循环和位运算即可实现,不需要重新传入参数,减少了scalar计算,实现性能提升。

MmadBitModeParams类可以直接使用MmadBitModeParams结构体类型对象初始化:

1
__aicore__ inline MmadBitModeParams(const MmadBitModeParams &mmadParams_);

也可以使用各参数的Set函数修改参数值,并且由于使用了联合体,还可以对congfig0直接进行逐bit位修改来修改参数。

表4 MmadBitModeConfig0结构体参数说明

参数名称

含义

m

左矩阵Height,取值范围:m∈[0, 4095] 。默认值为0。

该参数是位域结构体的最低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetM()函数设置其值,使用GetM()函数获取其值。

k

右矩阵Width,取值范围:n∈[0, 4095] 。默认值为0。

该参数是位域结构体的第二低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetK()函数设置其值,使用GetK()函数获取其值。

n

左矩阵Width、右矩阵Height,取值范围:k∈[0, 4095] 。默认值为0。

该参数是位域结构体的第三低位参数,占用12bit,可以使用MmadBitModeParams类对象的SetN()函数设置其值,使用GetN()函数获取其值。

unitFlag

预留参数。为后续的功能做保留,开发者暂时无需关注,使用默认值即可。

该参数是位域结构体的第四低位参数,占用2bit,可以使用MmadBitModeParams类对象的SetUnitFlag()函数设置其值,使用GetUnitFlag()函数获取其值。

disableGemv

M = 1时,用于配置Mmad计算是否开启GEMV。当输入为false时,表示开启GEMV;反之,输入为true时,表示关闭GEMV。

GEMV(General Matrix-Vector Multiplication)表示实现矩阵和向量的乘积,开启GEMV后,Mmad API 从L0A Buffer读取数据时,数据将以ND格式进行读取,而不会将其视为ZZ格式。

该参数是位域结构体的第五低位参数,占用1bit,可以使用MmadBitModeParams类对象的SetDisableGemv()函数设置其值,使用GetDisableGemv()函数获取其值。

cmatrixSource

配置C矩阵初始值是否来源于C2(存放Bias的硬件缓存区)。默认值为false。

  • false:来源于CO1;
  • true:来源于C2。

注意:带bias输入的接口配置该参数无效,会根据bias输入的位置来判断C矩阵初始值是否来源于CO1还是C2。

该参数是位域结构体的第六低位参数,占用1bit,可以使用MmadBitModeParams类对象的SetCmatrixSource()函数设置其值,使用GetCmatrixSource()函数获取其值。

cmatrixInitVal

配置C矩阵初始值是否为0。默认值true。

  • true:C矩阵初始值为0;
  • false:C矩阵初始值通过cmatrixSource参数进行配置。

该参数是位域结构体的最高位参数,占用1bit,可以使用MmadBitModeParams类对象的SetCmatrixInitVal()函数设置其值,使用GetCmatrixInitVal()函数获取其值。

MmadBitModeConfig0结构体参数的含义与MmadBitModeParams结构体中的同名参数含义相同,具体参考表3。

表5 dst、fm、filter支持的精度类型组合(Ascend 950PR/Ascend 950DT)

左矩阵fm type

右矩阵filter type

结果矩阵dst type

备注

int8_t

int8_t

int32_t

仅支持不含缩放的矩阵乘

half

half

float

float

float

float

bfloat16_t

bfloat16_t

float

fp8_e4m3fn_t

fp8_e4m3fn_t

float

fp8_e4m3fn_t

fp8_e5m2_t

float

fp8_e5m2_t

fp8_e4m3fn_t

float

fp8_e5m2_t

fp8_e5m2_t

float

hifloat8_t

hifloat8_t

float

fp4x2_e1m2_t

fp4x2_e1m2_t

float

仅支持包含缩放的矩阵乘

fp4x2_e2m1_t

fp4x2_e1m2_t

float

fp4x2_e1m2_t

fp4x2_e2m1_t

float

fp4x2_e2m1_t

fp4x2_e2m1_t

float

AscendC::mx_fp8_e4m3_t

AscendC::mx_fp8_e4m3_t

float

AscendC::mx_fp8_e4m3_t

AscendC::mx_fp8_e5m2_t

float

AscendC::mx_fp8_e5m2_t

AscendC::mx_fp8_e4m3_t

float

AscendC::mx_fp8_e5m2_t

AscendC::mx_fp8_e5m2_t

float

表6 dst、fm、filter、bias支持的精度类型组合(Ascend 950PR/Ascend 950DT)

左矩阵fm type

右矩阵filter type

bias type

结果矩阵dst type

备注

int8_t

int8_t

int32_t

int32_t

仅支持不含缩放的矩阵乘

half

half

float

float

float

float

float

float

bfloat16_t

bfloat16_t

float

float

fp8_e4m3fn_t

fp8_e4m3fn_t

float

float

fp8_e4m3fn_t

fp8_e5m2_t

float

float

fp8_e5m2_t

fp8_e4m3fn_t

float

float

fp8_e5m2_t

fp8_e5m2_t

float

float

hifloat8_t

hifloat8_t

float

float

fp4x2_e1m2_t

fp4x2_e1m2_t

float

float

仅支持包含缩放的矩阵乘

fp4x2_e2m1_t

fp4x2_e1m2_t

float

float

fp4x2_e1m2_t

fp4x2_e2m1_t

float

float

fp4x2_e2m1_t

fp4x2_e2m1_t

float

float

AscendC::mx_fp8_e4m3_t

AscendC::mx_fp8_e4m3_t

float

float

AscendC::mx_fp8_e4m3_t

AscendC::mx_fp8_e5m2_t

float

float

AscendC::mx_fp8_e5m2_t

AscendC::mx_fp8_e4m3_t

float

float

AscendC::mx_fp8_e5m2_t

AscendC::mx_fp8_e5m2_t

float

float

约束说明

调用示例

不含矩阵乘偏置的样例请参考Mmad样例。

包含矩阵乘偏置的样例请参考包含矩阵乘偏置的Mmad样例。