CANN/asc-devkit Matmul使用指南

📅 2026/7/17 18:40:45
CANN/asc-devkit Matmul使用指南
Matmul使用说明【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkitAscend C提供一组Matmul高阶API方便用户快速实现Matmul矩阵乘法的运算操作。Matmul的计算公式为C A * B Bias其示意图如下。A、B为源操作数A为左矩阵形状为[M, K]B为右矩阵形状为[K, N]。C为目的操作数存放矩阵乘结果的矩阵形状为[M, N]。Bias为矩阵乘偏置形状为[1, N]。对A*B结果矩阵的每一行都采用该Bias进行偏置。图1Matmul矩阵乘示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/1680a8274bf627fb844cc7e09f9e1a9e99e24425/docs/zh/api/figures/Matmul矩阵乘示意图.png Matmul矩阵乘示意图?utm_sourcegitcode_repo_files)[!NOTE]说明 下文中提及的M轴方向即为A矩阵纵向K轴方向即为A矩阵横向或B矩阵纵向N轴方向即为B矩阵横向尾轴即为矩阵最后一个维度。Kernel侧实现Matmul矩阵乘运算的步骤概括为创建Matmul对象。初始化操作。设置左矩阵A、右矩阵B、Bias。完成矩阵乘操作。结束矩阵乘操作。使用Matmul API实现矩阵乘运算的具体步骤如下创建Matmul对象。创建Matmul对象的示例如下默认为MIX模式包含矩阵计算和矢量计算该场景下通常不定义ASCENDC_CUBE_ONLY宏如果在程序中使用了ASCENDC_CUBE_ONLY宏则必须使用ASCEND_IS_AIC宏和ASCEND_IS_AIV宏将Cube计算和Vector计算隔离开。纯Cube模式只有矩阵计算场景下建议在代码中定义ASCENDC_CUBE_ONLY宏避免额外的性能开销。// 纯cube模式只有矩阵计算场景下需要设置该代码宏并且必须在#include lib/matmul_intf.h之前设置 // #define ASCENDC_CUBE_ONLY #include lib/matmul_intf.h typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half aType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half bType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float cType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float biasType; AscendC::MatmulaType, bType, cType, biasType mm;创建对象时需要传入A、B、C、Bias的参数类型信息类型信息通过MatmulType来定义包括内存逻辑位置、数据格式、数据类型、数据来源的内存逻辑位置。template AscendC::TPosition POSITION, CubeFormat FORMAT, typename TYPE, bool ISTRANS false, LayoutMode LAYOUT LayoutMode::NONE, bool IBSHARE false, TPosition SRCPOS TPosition::GM struct MatmulType { constexpr static AscendC::TPosition pos POSITION; constexpr static CubeFormat format FORMAT; using T TYPE; constexpr static bool isTrans ISTRANS; constexpr static LayoutMode layout LAYOUT; constexpr static bool ibShare IBSHARE; constexpr static TPosition srcPos SRCPOS; };表1MatmulType参数说明| 参数 | 说明 | | --- | --- | | POSITION | 内存逻辑位置。针对Ascend 950PR/Ascend 950DTA矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMB矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMBias可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMC矩阵可设置为TPosition::GMTPosition::VECIN注意A矩阵、B矩阵或Bias矩阵设置为TPosition::VECOUT或TPosition::TSCM时对应矩阵用于单核计算的数据必须全部在Unified Buffer或L1 Buffer上具体样例请参考matmul_vecout样例、自定义数据来源为VECOUT的TSCM输入的Matmul算子样例、自定义数据来源为GM的TSCM输入的Matmul算子样例。针对Atlas A3 训练系列产品/Atlas A3 推理系列产品A矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMB矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMBias可设置为TPosition::GMTPosition::VECOUTC矩阵可设置为TPosition::GMTPosition::VECIN, TPosition::CO1注意C矩阵设置为TPosition::CO1时C矩阵的数据排布格式仅支持CubeFormat::NZC矩阵的数据类型仅支持float、int32_t。针对Atlas A2 训练系列产品/Atlas A2 推理系列产品A矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMB矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMBias可设置为TPosition::GMTPosition::VECOUTC矩阵可设置为TPosition::GMTPosition::VECIN, TPosition::CO1注意C矩阵设置为TPosition::CO1时C矩阵的数据排布格式仅支持CubeFormat::NZC矩阵的数据类型仅支持float、int32_t。针对Atlas 推理系列产品AI CoreA矩阵可设置为TPosition::GMTPosition::VECOUTB矩阵可设置为TPosition::GMTPosition::VECOUTBias可设置为TPosition::GMTPosition::VECOUTC矩阵可设置为TPosition::GMTPosition::VECIN针对Atlas 200I/500 A2 推理产品A矩阵可设置为TPosition::GMB矩阵可设置为TPosition::GMBias可设置为TPosition::GMC矩阵可设置为TPosition::GM针对Kirin X90:A矩阵可设置为TPosition::GMTPosition::VECOUTTPosition::TSCMB矩阵可设置为TPosition::GMTPosition::VECOUT, TPosition::TSCMBias可设置为TPosition::GMTPosition::VECOUTC矩阵可设置为TPosition::GMTPosition::CO1针对Kirin 9030A矩阵可设置为TPosition::TSCMB矩阵可设置为TPosition::TSCMBias可设置为TPosition::GMC矩阵可设置为TPosition::GM | | FORMAT | 数据的物理排布格式。针对Ascend 950PR/Ascend 950DTA矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::COLUMN_MAJORCubeFormat::VECTORB矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::COLUMN_MAJORBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::ND_ALIGNCubeFormat::COLUMN_MAJOR针对Ascend 950PR/Ascend 950DT请注意仅在非MxMatmul场景中A、B、C矩阵Format支持CubeFormat::COLUMN_MAJOR。当Format为CubeFormat::COLUMN_MAJOR时对应矩阵仅支持内存逻辑位置为TPosition::GM。输入A矩阵或B矩阵设置为TPosition::TSCM时对应的Format仅支持CubeFormat::NZ。C矩阵设置为TPosition::VECINCubeFormat::ND时要求尾轴32字节对齐比如数据类型是half的情况下N要求是16的倍数。针对Atlas A3 训练系列产品/Atlas A3 推理系列产品A矩阵可设置为CubeFormat::NDCubeFormat::NZ, CubeFormat::VECTORB矩阵可设置为CubeFormat::NDCubeFormat::NZBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::ND_ALIGN针对Atlas A2 训练系列产品/Atlas A2 推理系列产品A矩阵可设置为CubeFormat::NDCubeFormat::NZ, CubeFormat::VECTORB矩阵可设置为CubeFormat::NDCubeFormat::NZBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::ND_ALIGN针对Atlas 推理系列产品AI CoreA矩阵可设置为CubeFormat::NDCubeFormat::NZB矩阵可设置为CubeFormat::NDCubeFormat::NZBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::ND_ALIGN注意针对Atlas 推理系列产品AI CoreC矩阵设置为CubeFormat::ND时要求尾轴32字节对齐比如数据类型是half的情况下N要求是16的倍数。针对Atlas 200I/500 A2 推理产品A矩阵可设置为CubeFormat::NDCubeFormat::NZB矩阵可设置为CubeFormat::NDCubeFormat::NZBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::NDCubeFormat::NZ针对Kirin X90:A矩阵可设置为CubeFormat::NDCubeFormat::NZ, CubeFormat::VECTORB矩阵可设置为CubeFormat::NDCubeFormat::NZBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::NDCubeFormat::NZCubeFormat::ND_ALIGN针对Kirin 9030A矩阵可设置为CubeFormat::NZCubeFormat::VECTORB矩阵可设置为CubeFormat::NZBias可设置为CubeFormat::NDC矩阵可设置为CubeFormat::ND注意: 针对Atlas 200I/500 A2 推理产品C矩阵设置为TPosition::VECIN或者TPosition::TSCMCubeFormat::ND时要求尾轴32字节对齐比如数据类型是half的情况下N要求是16的倍数C矩阵设置为TPosition::VECIN或者TPosition::TSCMCubeFormat::NZ时N要求是16的倍数。关于CubeFormat::NZ格式的A矩阵、B矩阵、C矩阵的对齐约束请参考表3。 | | TYPE | 数据类型。针对Ascend 950PR/Ascend 950DT1、非MxMatmul场景A矩阵可设置为half、float、bfloat16_t 、int8_t、fp8_e4m3fn_t、fp8_e5m2_t、hifloat8_tB矩阵可设置为half、float、bfloat16_t 、int8_t、fp8_e4m3fn_t、fp8_e5m2_t、hifloat8_tBias可设置为half、float、int32_t、bfloat16_tC矩阵可设置为half、float、bfloat16_t、int32_t、int8_t、fp8_e4m3fn_t、hifloat8_t2、MxMatmul场景A矩阵可设置为fp8_e4m3fn_t、fp8_e5m2_t、fp4x2_e2m1_t、fp4x2_e1m2_tB矩阵可设置为fp8_e4m3fn_t、fp8_e5m2_t、fp4x2_e2m1_t、fp4x2_e1m2_tBias可设置为half、float、bfloat16_tC矩阵可设置为half、float、bfloat16_t针对Atlas A3 训练系列产品/Atlas A3 推理系列产品A矩阵可设置为half、float、bfloat16_t 、int8_t、int4b_tB矩阵可设置为half、float、bfloat16_t 、int8_t、int4b_tBias可设置为half、float、int32_tC矩阵可设置为half、float、bfloat16_t、int32_t、int8_t针对Atlas A2 训练系列产品/Atlas A2 推理系列产品A矩阵可设置为half、float、bfloat16_t 、int8_t、int4b_tB矩阵可设置为half、float、bfloat16_t 、int8_t、int4b_tBias可设置为half、float、int32_tC矩阵可设置为half、float、bfloat16_t、int32_t、int8_t针对Atlas 推理系列产品AI CoreA矩阵可设置为half、int8_tB矩阵可设置为half、int8_tBias可设置为float、int32_tC矩阵可设置为half、float、int8_t、int32_t针对Atlas 200I/500 A2 推理产品A矩阵可设置为half、float、bfloat16_t 、int8_tB矩阵可设置为half、float、bfloat16_t 、int8_tBias矩阵可设置为half、float、int32_tC矩阵可设置为half、float、bfloat16_t、int32_t针对Kirin X90:A矩阵可设置为half、int8_tB矩阵可设置为half、int8_tBias可设置为half、int32_tC矩阵可设置为half、int32_t、int8_t针对Kirin 9030A矩阵可设置为halfB矩阵可设置为halfBias可设置为halfC矩阵可设置为half注意除fp8_e4m3fn_t/fp8_e5m2_t两种数据类型、B矩阵为int8_t数据类型外A矩阵和B矩阵数据类型需要一致具体数据类型组合关系请参考表2。A矩阵和B矩阵为int4b_t数据类型时矩阵内轴的数据个数必须为偶数。例如A矩阵为int4b_t数据类型且不转置时singleCoreK必须是偶数。 | | ISTRANS | 是否开启支持矩阵转置的功能。true开启支持矩阵转置的功能运行时可以分别通过SetTensorA和SetTensorB中的isTransposeA、isTransposeB参数设置A、B矩阵是否转置。若设置A、B矩阵转置Matmul会认为A矩阵形状为[K, M]B矩阵形状为[N, K]。false默认值不开启支持矩阵转置的功能通过SetTensorA和SetTensorB不能设置A、B矩阵的转置情况。Matmul会认为A矩阵形状为[M, K]B矩阵形状为[K, N]。注意由于L1 Buffer上的矩阵数据有分形对齐的约束A、B矩阵转置和不转置时所需的L1空间可能不相同在开启支持矩阵转置功能时必须保证按照Matmul Tiling参数申请的L1空间不超过L1 Buffer的规格判断方式为(depthA1*Ceil(baseM/c0Size)baseK depthB1Ceil(baseN/c0Size)*baseK) * db * sizeof(dtype) L1Sizedb表示L1是否开启double buffer取值1不开启double buffer或2开启double buffer其余参数的含义请参考表1。Kirin 9030不支持此参数。 | | LAYOUT | 表征数据的排布。NONE默认值表示不使用BatchMatmul其他选项表示使用BatchMatmul。NORMALBMNK的数据排布格式具体可参考IterateBatch中对该数据排布的介绍。BSNGD原始BSH shape做reshape后的数据排布具体可参考IterateBatch中对该数据排布的介绍。SBNGD原始SBH shape做reshape后的数据排布具体可参考IterateBatch中对该数据排布的介绍。BNGS1S2一般为前两种数据排布进行矩阵乘的输出S1S2数据连续存放一个S1S2为一个batch的计算数据具体可参考IterateBatch中对该数据排布的介绍。Kirin 9030不支持此参数。 | | IBSHARE| 是否开启IBShareIntraBlock Share。IBShare的功能是能够复用L1 Buffer上相同的A矩阵或B矩阵数据复用的矩阵必须在L1 Buffer上全载。A矩阵和B矩阵仅有一个开启IBShare的场景与IBShare模板配合使用具体参数设置详见表2。注意A矩阵和B矩阵同时开启IBShare的场景表示L1 Buffer上的A矩阵和B矩阵同时复用需要满足同一算子中其它Matmul对象的A矩阵和B矩阵也必须同时开启IBShareAtlas A2 训练系列产品/Atlas A2 推理系列产品获取矩阵计算结果时只支持调用IterateAll接口且只支持输出到GlobalTensor即计算结果放置于Global Memory的地址。Atlas A3 训练系列产品/Atlas A3 推理系列产品获取矩阵计算结果时只支持调用IterateAll接口且只支持输出到GlobalTensor即计算结果放置于Global Memory的地址。Ascend 950PR/Ascend 950DT获取矩阵计算结果时支持输出到GlobalTensor和LocalTensor。输出到LocalTensor即计算结果放置于Local Memory的场景默认实现策略与SplitM模板策略相同且仅支持输出数据类型为float仅支持Norm模板。Ascend 950PR/Ascend 950DT支持该参数。Atlas A3 训练系列产品/Atlas A3 推理系列产品支持该参数。Atlas A2 训练系列产品/Atlas A2 推理系列产品支持该参数。Atlas 推理系列产品AI Core不支持该参数。Atlas 200I/500 A2 推理产品不支持该参数。Kirin X90不支持此参数。Kirin 9030不支持此参数。 | | SRC_POSITION | 该参数仅支持Ascend 950PR/Ascend 950DT。A/B矩阵的POSITION参数配置为TPosition::TSCM时必须要设置TSCM中矩阵数据的来源的内存逻辑位置默认为TPosition::GM。针对Ascend 950PR/Ascend 950DTA矩阵可设置为TPosition::GMTPosition::VECOUTB矩阵可设置为TPosition::GMTPosition::VECOUT |表2Matmul输入输出数据类型的支持列表| A矩阵 | B矩阵 | Bias | C矩阵 | 支持平台 | | --- | --- | --- | --- | --- | | float | float | float/half | float/half/bfloat16_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 200I/500 A2 推理产品 | | half | half | float | float | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 推理系列产品AI CoreAtlas 200I/500 A2 推理产品 | | half | half | half | float/bfloat16_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 200I/500 A2 推理产品 | | int8_t | int8_t | int32_t | int32_t/half | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 推理系列产品AI CoreAtlas 200I/500 A2 推理产品Kirin X90 | | int4b_t | int4b_t | int32_t | int32_t/half | Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | bfloat16_t | bfloat16_t | float | float | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 200I/500 A2 推理产品 | | bfloat16_t | bfloat16_t | half | float/half | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | half | half | float | int8_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | bfloat16_t | bfloat16_t | float | int8_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品 | | int8_t | int8_t | int32_t | int8_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 推理系列产品AI CoreKirin X90 | | half | half | float | half/bfloat16_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 推理系列产品AI CoreAtlas 200I/500 A2 推理产品 | | half | half | half | half/bfloat16_t | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品 !-- npu910b id100 --Atlas A2 训练系列产品/Atlas A2 推理系列产品 !-- npu310b id101 --Atlas 200I/500 A2 推理产品Kirin X90Kirin 9030 | | bfloat16_t | bfloat16_t | float | bfloat16_t/half | Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品Atlas 200I/500 A2 推理产品 | | half | int8_t | float | float | Atlas 推理系列产品AI Core | | fp8_e4m3fn_t/fp8_e5m2_t | fp8_e4m3fn_t/fp8_e5m2_t | float/half/bfloat16_t | fp8_e4m3fn_t/half/bfloat16_t/float | Ascend 950PR/Ascend 950DT | | hifloat8_t | hifloat8_t | float/half/bfloat16_t | hifloat8_t/half/bfloat16_t/float | Ascend 950PR/Ascend 950DT | | float | float | bfloat16_t | float/half/bfloat16_t | Ascend 950PR/Ascend 950DT | | bfloat16_t | bfloat16_t | bfloat16_t | float/half/bfloat16_t | Ascend 950PR/Ascend 950DT | | half | half | bfloat16_t | float/half/bfloat16_t | Ascend 950PR/Ascend 950DT | | int8_t | int8_t | int32_t | bfloat16_t | Ascend 950PR/Ascend 950DT |初始化操作。REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); // 初始化matmul对象参数含义请参考REGIST_MATMUL_OBJ章节设置左矩阵A、右矩阵B、Bias。mm.SetTensorA(gm_a); // 设置左矩阵A mm.SetTensorB(gm_b); // 设置右矩阵B mm.SetBias(gm_bias); // 设置BiasAtlas 推理系列产品AI Core上需要额外调用SetLocalWorkspace接口设置计算所需的UB空间。mm.SetLocalWorkspace(usedUbBufLen);完成矩阵乘操作。用户可以选择以下三种调用方式之一。调用Iterate完成单次迭代计算叠加while循环完成单核全量数据的计算。Iterate方式可以自行控制迭代次数完成所需数据量的计算方式比较灵活。// API接口内部会进行循环结束条件判断处理 while (mm.Iterate()) { mm.GetTensorC(gm_c); }调用IterateAll完成单核上所有数据的计算。IterateAll方式无需循环迭代使用比较简单。mm.IterateAll(gm_c);用户申请用于存放矩阵乘结果的L0C BufferCO1内存调用一次或多次Iterate完成单次或多次迭代计算在需要搬出计算结果时调用Fixpipe接口完成L0C BufferCO1上计算结果的搬运然后释放申请的L0C BufferCO1内存。该方式下用户可以灵活控制计算和搬运的节奏根据实际需要一次计算对应一次结果的搬出或者将多次计算结果缓存在L0C BufferCO1内存中再一次性搬出计算结果。在此种调用方式下创建Matmul对象时必须定义C矩阵的内存逻辑位置为TPosition::CO1、数据排布格式为CubeFormat::NZ、数据类型为float或int32_t。Ascend 950PR/Ascend 950DT暂不支持该方式。Atlas 推理系列产品AI Core暂不支持该方式。Atlas 200I/500 A2 推理产品暂不支持该方式。// 定义C矩阵的类型信息 typedef AscendC::MatmulTypeAscendC::TPosition::CO1, CubeFormat::NZ, float cType; // 创建Matmul对象 AscendC::MatmulaType, bType, cType, biasType mm; // 用户提前申请L0C BufferCO1的内存l0cTensor TQueTPosition::CO1, 1 CO1_; // 128 * 1024为申请的L0C BufferCO1内存大小 GetTPipePtr()-InitBuffer(CO1_, 1, 128 * 1024); // L0cT为C矩阵的数据类型。 // A矩阵数据类型是int8_t或int4b_t时C矩阵的数据类型是int32_t。 // A矩阵数据类型是half、float或bfloat16_t时C矩阵的数据类型是float。 LocalTensorL0cT l0cTensor CO1_.template AllocTensorL0cT(); // 将l0cTensor作为入参传入Iterate矩阵乘结果输出到用户申请的l0cTensor上 mm.Iterate(false, l0cTensor); // 调用Fixpipe接口将L0C BufferCO1上的计算结果搬运到GM FixpipeParamsV220 params; params.nSize nSize; params.mSize mSize; params.srcStride srcStride; params.dstStride dstStride; CO1_.EnQue(l0cTensor); CO1_.template DeQueL0cT(); FixpipecType, L0cT, CFG_ROW_MAJOR(gm[dstOffset], l0cTensor, params); // 释放L0C BufferCO1内存 CO1_.FreeTensor(l0cTensor);结束矩阵乘操作。mm.End();表3CubeFormat::NZ格式的矩阵对齐要求| 源/目的操作数 | 外轴 | 内轴 | | --- | --- | --- | | A矩阵/B矩阵 | 16的倍数 | C0_size的倍数 | | C矩阵 | 16的倍数 | 16的倍数 | | C矩阵开启channel_split功能 | 16的倍数 | C0_size的倍数 | | C矩阵不开启channel_split功能 | 16的倍数 | float/int32_t16的倍数half/bfloat16_t/int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_tC0_size的倍数 |对于上表中相关参数和概念的补充说明如下float/int32_t数据类型的C0_size为8half/bfloat16_t数据类型的C0_size为16int8_t/fp8_e4m3fn_t/fp8_e5m2_t/hifloat8_t数据类型的C0_size为32int4b_t/fp4x2_e2m1_t/fp4x2_e1m2_t数据类型的C0_size为64。channel_split功能通过MatmulConfig中的isEnableChannelSplit参数配置具体内容请参考MatmulConfig。需要包含的头文件#include lib/matmul/matmul_intf.h实现原理以输入矩阵A (GM, ND, half)、矩阵B(GM, ND, half)输出矩阵C (GM, ND, float)无Bias场景为例其中(GM, ND, half)表示数据存放在GM上数据格式为ND数据类型为half描述Matmul高阶API典型场景的内部算法框图如下图所示。图2Matmul算法框图![](https://raw.gitcode.com/cann/asc-devkit/raw/1680a8274bf627fb844cc7e09f9e1a9e99e24425/docs/zh/api/figures/Matmul算法框图.png Matmul算法框图?utm_sourcegitcode_repo_files)计算过程分为如下几步数据从GM搬到L1 BufferA1DataCopy每次从矩阵A中搬出一个stepM*baseM*stepKa*baseK的矩阵块a1循环多次完成矩阵A的搬运数据从GM搬到L1 BufferB1DataCopy每次从矩阵B中搬出一个stepKb*baseK*stepN*baseN的矩阵块b1循环多次完成矩阵B的搬运数据从L1 BufferA1搬到L0A BufferA2LoadData每次从矩阵块a1搬出一个baseM * baseK的矩阵块a0数据从L1 BufferB1搬到L0B BufferB2并完成转置LoadData每次从矩阵块b1搬出一个baseK * baseN的矩阵块并将其转置为baseN * baseK的矩阵块b0矩阵乘每次完成一个矩阵块a0 * b0的计算得到baseM * baseN的矩阵块co1数据从矩阵块co1搬到矩阵块co2:DataCopy每次搬运一块baseM * baseN的矩阵块co1到singleCoreM * singleCoreN的矩阵块co2中重复2-4步骤完成矩阵块a1 * b1的计算数据从矩阵块co2搬到矩阵块CDataCopy每次搬运一块singleCoreM * singleCoreN的矩阵块co2到矩阵块C中重复1-6步骤完成矩阵A * B C的计算。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考