
# MmadBitMode【免费下载链接】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。MmadBitMode对于MmadParams结构体构造进行了优化本接口适用于scalar流水成为性能优化瓶颈的场景支持基础Mmad/MmadMx计算功能。本接口与Mmad/MmadMx接口的差异在于参数传入的方式不同本接口传入的是联合结构体MmadBitModeParams。MmadBitModeParams类参数设计思想说明联合体union是一种特殊的数据结构允许在相同的内存位置存储不同的数据类型。union的所有成员共享同一块内存空间大小由最大成员决定同一时间只能使用一个成员。位域bit-field是一种特殊的类成员允许精确控制结构体中成员变量所占用的内存位数。结构体中成员变量从上到下对应内存中从低位到高位。MmadBitModeParams类使用union与bit-field方法采用bit位表达参数类型使用bit-field结构体自动处理入参的bit位数并利用union的特性实现多参数融合传递仅需传递一个入参即可包含全部所需信息对应底层接口仅需要接收一个参数。同时当需要修改参数中某一bit位的值时仅需要通过循环和位运算即可实现不需要重新传入参数减少了scalar计算实现性能提升。MmadBitModeParams类可以直接使用MmadBitModeParams结构体类型对象初始化__aicore__ inline MmadBitModeParams(const MmadBitModeParams mmadParams_);也可以使用各参数的Set函数修改参数值并且由于使用了联合体还可以对config0直接进行逐bit位修改来修改参数。函数原型不传入biastemplate typename T, typename U, typename S __aicore__ inline void Mmad(const LocalTensorT dst, const LocalTensorU fm, const LocalTensorS filter, const MmadBitModeParams mmadParams) template typename T, typename U, typename S __aicore__ inline void MmadMx(const LocalTensorT dst, const LocalTensorU fm, const LocalTensorS filter, const MmadBitModeParams mmadParams)传入biastemplate typename T, typename U, typename S, typename V __aicore__ inline void Mmad(const LocalTensorT dst, const LocalTensorU fm, const LocalTensorS filter, const LocalTensorV bias, const MmadBitModeParams mmadParams) template typename T, typename U, typename S, typename V __aicore__ inline void MmadMx(const LocalTensorT dst, const LocalTensorU fm, const LocalTensorS filter, const LocalTensorV bias, const MmadBitModeParams mmadParams)参数说明表1参数说明参数名称输入/输出含义dst输出目的操作数结果矩阵C类型为LocalTensor支持的物理存储位置为L0C BufferTPosition:CO1。LocalTensor的起始地址需要按照1024字节对齐。fm输入源操作数左矩阵A类型为LocalTensor支持的物理存储位置为L0A BufferTPosition:A2。左矩阵A对应的scale矩阵起始地址为A矩阵起始对应地址/16。对于fp4场景LocalTensor的起始地址需要按照512字节对齐。对于fp8场景LocalTensor的起始地址需要按照1024字节对齐。filter输入源操作数右矩阵B类型为LocalTensor支持的物理存储位置为L0B BufferTPosition:B2。右矩阵b对应的scale矩阵起始地址为B矩阵起始对应地址/16。对于fp4场景LocalTensor的起始地址需要按照512字节对齐。对于fp8场景LocalTensor的起始地址需要按照1024字节对齐。bias输入源操作数Bias矩阵类型为LocalTensor支持的物理存储位置为BT BufferTPosition:C2。LocalTensor的起始地址需要按照64字节对齐。mmadParams输入矩阵乘相关参数。该参数类型的具体定义请参考${INSTALL_DIR}/asc/include/basic_api/interface/kernel_struct_mm.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。MmadBitModeParams参数说明请参考下表。表2MmadBitModeParams类参数说明参数名称含义config0uint64_t类型与MmadBitModeConfig0位域bit-field结构体类型参数config0BitMode组成联合体union初始化为0可以使用类对象的GetConfig0()函数获取其值。config0BitModeMmadBitModeConfig0位域bit-field结构体类型参数参考表3与config0组成联合体union。表3MmadBitModeConfig0结构体参数说明参数名称含义m左矩阵Height取值范围m∈[0, 4095]。默认值为0。该参数是位域结构体的最低位参数占用12bit可以使用MmadBitModeParams类对象的SetM()函数设置其值使用GetM()函数获取其值。k左矩阵Width、右矩阵Height取值范围k∈[0, 4095]。默认值为0。该参数是位域结构体的第二低位参数占用12bit可以使用MmadBitModeParams类对象的SetK()函数设置其值使用GetK()函数获取其值。n右矩阵Width取值范围n∈[0, 4095]。默认值为0。该参数是位域结构体的第三低位参数占用12bit可以使用MmadBitModeParams类对象的SetN()函数设置其值使用GetN()函数获取其值。unitFlag预留参数。为后续的功能做保留开发者暂时无需关注使用默认值即可。该参数是位域结构体的第四低位参数占用2bit可以使用MmadBitModeParams类对象的SetUnitFlag()函数设置其值使用GetUnitFlag()函数获取其值。disableGemvM 1时用于配置Mmad计算是否开启GEMV。当输入为false时表示开启GEMV反之输入为true时表示关闭GEMV。GEMVGeneral Matrix-Vector Multiplication表示实现矩阵和向量的乘积开启GEMV后Mmad API从L0A Buffer读取数据时数据将以ND格式进行读取而不会将其视为ZZ格式。该参数是位域结构体的第五低位参数占用1bit可以使用MmadBitModeParams类对象的SetDisableGemv()函数设置其值使用GetDisableGemv()函数获取其值。cmatrixSource配置C矩阵初始值是否来源于BT BufferTPosition:C2。默认值为false。• false来源于L0C BufferTPosition:CO1• true来源于BT BufferTPosition:C2。注意带bias输入的接口配置该参数无效会根据bias输入的位置来判断C矩阵初始值是否来源于L0C Buffer还是BT Buffer。该参数是位域结构体的第六低位参数占用1bit可以使用MmadBitModeParams类对象的SetCmatrixSource()函数设置其值使用GetCmatrixSource()函数获取其值。cmatrixInitVal配置C矩阵初始值是否为0。默认值为 true。• trueC矩阵初始值为0• falseC矩阵初始值通过cmatrixSource参数进行配置。该参数是位域结构体的最高位参数占用1bit可以使用MmadBitModeParams类对象的SetCmatrixInitVal()函数设置其值使用GetCmatrixInitVal()函数获取其值。数据类型表4Mmad接口左矩阵、右矩阵、Bias矩阵、结果矩阵支持的精度类型组合左矩阵fm type右矩阵filter typebias type结果矩阵dst typeint8_tint8_tint32_tint32_thalfhalffloatfloatfloatfloatfloatfloatbfloat16_tbfloat16_tfloatfloatfp8_e4m3fn_tfp8_e4m3fn_tfloatfloatfp8_e4m3fn_tfp8_e5m2_tfloatfloatfp8_e5m2_tfp8_e4m3fn_tfloatfloatfp8_e5m2_tfp8_e5m2_tfloatfloathifloat8_thifloat8_tfloatfloat表5MmadMx接口左矩阵、右矩阵、Scale矩阵、Bias矩阵、结果矩阵支持的精度类型组合左矩阵fm右矩阵filterScale矩阵偏置Bias结果矩阵dstfp4x2_e1m2_tfp4x2_e1m2_tfp8_e8m0_tfloatfloatfp4x2_e2m1_tfp4x2_e1m2_tfp8_e8m0_tfloatfloatfp4x2_e1m2_tfp4x2_e2m1_tfp8_e8m0_tfloatfloatfp4x2_e2m1_tfp4x2_e2m1_tfp8_e8m0_tfloatfloatfp8_e4m3fn_tfp8_e4m3fn_tfp8_e8m0_tfloatfloatfp8_e4m3fn_tfp8_e5m2_tfp8_e8m0_tfloatfloatfp8_e5m2_tfp8_e4m3fn_tfp8_e8m0_tfloatfloatfp8_e5m2_tfp8_e5m2_tfp8_e8m0_tfloatfloat返回值说明无约束说明不同矩阵对于存储位置的约束结果矩阵C只支持位于物理存储位置为L0C BufferTPosition:CO1大小256KB。左矩阵A只支持位于物理存储位置为L0A BufferTPosition:A2大小64KB。右矩阵B只支持位于物理存储位置为L0B BufferTPosition:B2大小64KB。Bias矩阵只支持位于物理存储位置为BT BufferTPosition:C2大小4KB。地址约束说明请参考表1。当M、K、N中的任意一个值为0时表示指令不会执行该接口将被视为NOP空操作。K需要是64的倍数。对于fp4场景A/B矩阵的起始地址需要按照512字节对齐对于fp8场景A/B矩阵的起始地址需要按照1024字节对齐。左矩阵A/B对应的scale矩阵起始地址为A/B矩阵起始对应地址/16。其他特殊场景约束可参考Mmad接口约束说明。调用示例样例请参考Mmad样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考