CANN/AscendC矩阵乘加API

📅 2026/7/16 13:32:46
CANN/AscendC矩阵乘加API
# Mmad【免费下载链接】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。Mmad接口是Ascend C面向昇腾AI芯片的矩阵乘加核心计算接口专为高性能算子开发设计封装了昇腾NPU硬件的矩阵乘加计算能力广泛用于神经网络层如全连接层、卷积层、数值计算类算子的开发。Mmad接口实现昇腾NPU矩阵乘计算能力其数学表达式为$$C A \times B C$$针对Ascend 950PR/Ascend 950DT表1矩阵计算矩阵A、B、C解释说明矩阵计算逻辑矩阵计算物理位置维度输入/输出数据格式数据类型AL0A BufferM x KNz数据类型BL0B BufferK x NZn数据类型CL0C BufferM x N可支持使用偏置矩阵Bias进行初始化维度为1 x NNz数据类型图1Mmad接口矩阵乘分形示意图Ascend 950PR/Ascend 950DT![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/mmad_demo_a5.png Mmad接口计算分形示意图?utm_sourcegitcode_repo_files)针对如下产品型号矩阵说明见下表Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品表2矩阵计算矩阵A、B、C解释说明矩阵计算逻辑矩阵计算物理位置维度输入/输出数据格式数据类型AL0A BufferM x KZz数据类型BL0B BufferK x NZnCL0C BufferM x N可支持使用偏置矩阵Bias进行初始化维度为1 x NNz函数原型不传入biastemplate typename T, typename U, typename S __aicore__ inline void Mmad(const LocalTensorT dst, const LocalTensorU fm, const LocalTensorS filter, const MmadParams 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 MmadParams mmadParams)参数说明表3参数说明参数名称输入/输出含义dst输出目的操作数结果矩阵C类型为LocalTensor支持的物理存储位置为L0C BufferTPosition:CO1。LocalTensor的起始地址需要按照1024字节对齐。fm输入源操作数左矩阵A类型为LocalTensor支持的物理存储位置为L0A BufferTPosition: A2。LocalTensor的起始地址需要按照512字节对齐。filter输入源操作数右矩阵B类型为LocalTensor支持的物理存储位置为L0B BufferTPosition: B2。LocalTensor的起始地址需要按照512字节对齐。bias输入源操作数Bias矩阵类型为LocalTensor支持的物理存储位置为BT BufferTPosition:C2。LocalTensor的起始地址需要按照64字节对齐。mmadParams输入矩阵乘相关参数。该参数类型的具体定义请参考${INSTALL_DIR}/asc/include/basic_api/interface/kernel_struct_mm.h${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。MmadParams参数说明请参考表4。表4MmadParams结构体内参数说明参数名称含义m左矩阵Height取值范围m∈[0, 4095]。默认值为0。n右矩阵Width取值范围n∈[0, 4095]。默认值为0。k左矩阵Width、右矩阵Height取值范围k∈[0, 4095]。默认值为0。cmatrixInitVal是否开启C矩阵默认初始化清零操作。默认值为 true。• trueC矩阵默认初始化为0• falseC矩阵不进行默认操作通过设置cmatrixSource参数进行初始化。cmatrixSource配置C矩阵初始值是否来源于BT Buffer。默认值为false。• false不对L0C Buffer进行初始化操作• true使用BT Buffer(TPosition:C2)的数据对L0C Buffer进行初始化操作。Atlas 训练系列产品仅支持配置为false。Atlas 推理系列产品AI Core仅支持配置为false。Atlas A2 训练系列产品/Atlas A2 推理系列产品支持配置为true/false。Atlas A3 训练系列产品/Atlas A3 推理系列产品支持配置为true/false。Atlas 200I/500 A2 推理产品支持配置为true/false。Ascend 950PR/Ascend 950DT支持配置为true/false。Kirin X90仅支持配置为false。Kirin 9030仅支持配置为false。注意带Bias输入的接口配置该参数无效会根据bias输入的位置来判断C矩阵初始值是否来源于BT Buffer。isBias该参数废弃新开发内容不要使用该参数。如果需要累加初始矩阵请使用带Bias的接口来实现也可以通过cmatrixInitVal和cmatrixSource参数配置C矩阵的初始值来源来实现。推荐使用带Bias的接口相比于配置cmatrixInitVal和cmatrixSource参数更加简单方便。配置是否需要累加初始矩阵默认值为false取值说明如下• false矩阵乘无需累加初始矩阵C A * B。• true矩阵乘加需要累加初始矩阵C A * B。disableGemvM1时该参数用来配置Mmad计算是否开启GEMV模式。• false开启GEMV模式。• true关闭GEMV模式。该参数仅支持如下型号Ascend 950PR/Ascend 950DTunitFlagunitFlag可以控制Mmad指令和Fixpipe指令细粒度的并行开启该功能后硬件每计算完一个分形计算结果就会被搬出。取值说明如下• 02b00不开启unitFlag• 22b10开启unitFlag硬件执行完指令之后不复位单元标记位• 32b11开启unitFlag硬件执行完指令之后复位单元标记位。开启该功能时须将Mmad指令和Fixpipe指令的unitFlag值设置为2或3。该参数仅支持如下型号Ascend 950PR/Ascend 950DTAtlas A2 训练系列产品/Atlas A2 推理系列产品Atlas A3 训练系列产品/Atlas A3 推理系列产品。参数设置方案和特性细节可参考UnitFlag特性说明kDirectionAlignK方向对齐的核心功能是通过kDirectionAlign参数控制在使用float数据类型时L0A Buffer和L0B Buffer矩阵在K方向上的对齐方式。取值说明如下• false默认值K方向对齐到ceil(K / 8) * 8。• trueK方向对齐到ceil(K/16)*16。Atlas 训练系列产品仅支持配置为false。Atlas 推理系列产品AI Core仅支持配置为false。Atlas A2 训练系列产品/Atlas A2 推理系列产品仅支持配置为true/false。Atlas A3 训练系列产品/Atlas A3 推理系列产品仅支持配置为true/false。Atlas 200I/500 A2 推理产品仅支持配置为false。Ascend 950PR/Ascend 950DT仅支持配置为false。Kirin X90支持配置为true/false。Kirin 9030支持配置为true/false。特性细节可参考kDirectionAlign特性说明。fmOffset左矩阵offset整个左矩阵对应一个值支持Scalar应与src_fm.dtype一致/立即数默认0。注未使用兼容旧款产品接口传入Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。enSsparse开启结构化稀疏特性默认false注未使用兼容旧款产品接口传入Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。enWinogradA指示矩阵a是否通过winograd_feature_map_transform()生成用于支持winograd特性bool类型默认false注未使用兼容旧款产品接口传入Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。enWinogradB指示矩阵b是否通过winograd_weight_transform()生成用于支持winograd特性bool类型默认false注未使用兼容旧款产品接口传入Atlas A2 训练系列产品/Atlas A2 推理系列产品及往后产品不做处理。数据类型表5dst、fm、filter支持的精度类型组合Ascend 950PR/Ascend 950DT左矩阵fm type右矩阵filter type结果矩阵dst typeint8_tint8_tint32_thalfhalffloatfloatfloatfloatbfloat16_tbfloat16_tfloatfp8_e4m3fn_tfp8_e4m3fn_tfloatfp8_e4m3fn_tfp8_e5m2_tfloatfp8_e5m2_tfp8_e4m3fn_tfloatfp8_e5m2_tfp8_e5m2_tfloathifloat8_thifloat8_tfloat表6dst、fm、filter、bias支持的精度类型组合Ascend 950PR/Ascend 950DT左矩阵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表7dst、fm、filter支持的精度类型组合Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas 200I/500 A2 推理产品左矩阵fm type右矩阵filter type结果矩阵dst typeint8_tint8_tint32_thalfhalffloatfloatfloatfloatbfloat16_tbfloat16_tfloatint4b_tint4b_tint32_t表8dst、fm、filter、bias支持的精度类型组合Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas 200I/500 A2 推理产品左矩阵fm type右矩阵filter typebias type结果矩阵dst typeint8_tint8_tint32_tint32_thalfhalffloatfloatfloatfloatfloatfloatbfloat16_tbfloat16_tfloatfloat表9dst、fm、filter支持的精度类型组合Atlas 推理系列产品AI Core左矩阵fm type右矩阵filter type结果矩阵dst typeint8_tint8_tint32_tuint8_tint8_tint32_tuint8_tuint8_tint32_thalfhalfhalf说明该精度类型组合精度无法达到双千分之一且后续处理器版本不支持该类型转换建议直接使用half输入float输出。双千分之一是指每个实际数据和真值数据之间的误差不超过千分之一误差超过千分之一的数据总和不超过总数据数的千分之一。halfhalffloatint4b_tint4b_tint32_t表10dst、fm、filter支持的精度类型组合Atlas 训练系列产品左矩阵fm type右矩阵filter type结果矩阵dst typeuint8_tuint8_tuint32_tint8_tint8_tint32_tuint8_tint8_tint32_thalfhalfhalf说明该精度类型组合精度无法达到双千分之一且后续处理器版本不支持该类型转换建议直接使用half输入float输出。双千分之一是指每个实际数据和真值数据之间的误差不超过千分之一误差超过千分之一的数据总和不超过总数据数的千分之一。halfhalffloat表11dst、fm、filter、bias支持的精度类型组合Kirin X90左矩阵fm type右矩阵filter typebias type结果矩阵dst typeint8_tint8_tint32_tint32_thalfhalfhalfhalf表12dst、fm、filter、bias支持的精度类型组合Kirin 9030左矩阵fm type右矩阵filter typebias type结果矩阵dst typehalfhalfhalfhalf返回值说明无约束说明结果矩阵C只支持位于L0C BufferCO1左矩阵A只支持位于L0A BufferA2右矩阵B只支持位于L0B BufferB2。当M、K、N中的任意一个值为0时表示指令不会执行该接口将被视为NOP空操作。当M 1时会默认开启GEMVGeneral Matrix-Vector Multiplication功能。在这种情况下Mmad API从L0A Buffer读取数据时会以ND格式进行读取而不会将其视为ZZ或NZ格式。所以此时左矩阵需要直接按照ND格式进行排布GEMV特性说明。要注意的是开启GEMV的情况下A矩阵的起始地址仍要求512字节对齐。 针对Ascend 950PR/Ascend 950DT产品可以通过设置MmadParams的disableGemv参数为true将该功能关闭。一般来说一次Mmad计算至少完成一次A(16*16*half) * B(16*16*half)数据块计算。但实际计算时M、K、N有效值可能不是16的倍数从而有部分数据为无效数据。以M30K70N40为例来介绍无效数据与有效数据的排布方式。数据为half类型当M30K70N40的时候L0A BufferA2中有2x5个16x16矩阵L0B BufferB2中有5x3个16x16矩阵L0C BufferCO1中有2x3个16x16矩阵。在这种场景下M、K和N都不是16的倍数A2中右下角的矩阵实际有效的数据只有14x6个但是也需要占一个16x16矩阵的空间其他无效数据在计算中会被忽略。一个16x16分形的数据块中无效数据与有效数据排布的方式示意如下同步优化说明当矩阵计算沿K轴进行累加时中间结果通常需要写入同一块L0C Buffer。理论上在连续两次Mmad接口调用之间应插入PipeBarrier(PIPE_M)以确保前一次Mmad的写操作已完成再进行下一轮Mmad的读操作从而保证数据一致性。然而当矩阵维度m和n超过一定阈值时由于计算量足够大数据访问模式具备良好的局部性和流水线并行潜力硬件调度器能够自动处理写-读依赖问题。此时无需插入PipeBarrier(PIPE_M)Mmad指令可并行执行从而显著提升计算性能。阈值公式$$(m / 16) * (n / 16) 10$$当计算量小于阈值时需要插入PipeBarrier(PIPE_M)。if ((m / 16) * (n / 16) 10) { AscendC::PipeBarrierPIPE_M(); }当计算量大于阈值时不需要插入PipeBarrier(PIPE_M)。UnitFlag特性约束说明Mmad和Fixpipe接口均提供了 unitFlag参数来控制该功能的启用需确保两者同步开启才能正常生效。当希望控制同一块L0C Buffer内存空间能持续只被多条Mmad或多条Fixpipe指令操作时需将对应的前n-1条指令的unitFlag值设置为2维持被操作内存空间的持续占用状态最后一条指令设置为3解除被占用状态。当启用 unitFlag功能后建议Mmad的计算数据量与Fixpipe搬出的数据量保持一致。若Mmad计算了大块数据M × N 128 × 128但Fixpipe只搬出了其中一部分数据M × N 64 × 64则可能会导致执行异常可以通过SetFixPipeConfig()接口重置L0C Buffer的状态详细操作方式见UnitFlag特性说明中的示例。特殊值/边界值约束说明对于浮点类型inf/nan输入输出可以通过CTRL寄存器控制寄存器的CTRL[48]比特位进行设置控制浮点数计算时的饱和模式非饱和模式CTRL[48]设置成1b1inf/nan保持原输出。饱和模式CTRL[48]设置成1b0inf输出会被饱和为±MAXnan输出会被饱和为0。// 设置CTRL[48]为0开启浮点数计算饱和模式 AscendC::AscendCUtils::SetOverflow(0);注Mmad指令应避免NaN输入否则可能会产生执行报错。对于整数类型只有饱和模式。调用示例矩阵乘的样例请参考Mmad样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考