MatmulPolicy【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况产品MatmulPolicyTrianUpperMatmulPolicy/TrianLowerMatmulPolicyNBuffer33MatmulPolicyMatmulWithScalePolicy/SplitMMatmulPolicy/SplitNMatmulPolicyAscend 950PR/Ascend 950DT√√√√Atlas A3 训练系列产品 / Atlas A3 推理系列产品√√√xAtlas A2 训练系列产品 / Atlas A2 推理系列产品√√√xAtlas 200I/500 A2 推理产品√xxxAtlas 推理系列产品 AI Core√xxxAtlas 推理系列产品 Vector CorexxxxAtlas 训练系列产品xxxxKirin X90√√√x功能说明模板参数MatmulPolicy用于定义Matmul可拓展模块策略。目前支持设置以下四种Matmul内置模板策略。MatmulPolicy默认模板策略使能Matmul API的默认实现策略。TrianUpperMatmulPolicy上三角模板策略一次矩阵乘指令计算的结果为baseM * baseN大小的矩阵块称该矩阵块为基本块。若Matmul结果矩阵C中的基本块位于下三角位置则Matmul内部做数据计算和数据搬出时将不对该基本块进行处理最后得到的矩阵C为一个上三角矩阵。上三角模板策略如下图所示图示中矩阵形状的相关大小为MN512K256baseMbaseNbaseK32。图 1上三角模板策略示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/64a9cc04b1c451b719675ebf8e72d743414e9a20/docs/api/figures/上三角模板策略示意图.png 上三角模板策略示意图?utm_sourcegitcode_repo_files)TrianLowerMatmulPolicy下三角模板策略一次矩阵乘指令计算的结果为baseM * baseN大小的矩阵块称该矩阵块为基本块。若Matmul结果矩阵C中的基本块位于上三角位置则Matmul内部做数据计算和数据搬出时将不对该基本块进行处理最后得到的矩阵C为一个下三角矩阵。下三角模板策略如下图所示图示中矩阵形状的相关大小为MN512K256baseMbaseNbaseK32。图 2下三角模板策略示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/64a9cc04b1c451b719675ebf8e72d743414e9a20/docs/api/figures/下三角模板策略示意图.png 下三角模板策略示意图?utm_sourcegitcode_repo_files)NBuffer33MatmulPolicyNBuffer33模板策略一次矩阵乘指令计算的结果为baseM * baseN大小的矩阵块称该矩阵块为基本块。单核计算的A矩阵切分为3x3个基本块该3x3个A矩阵的基本块全载和保持在L1 Buffer中每次与3x1个B矩阵的基本块计算矩阵乘同时DoubleBuffer并行搬入下次计算所需的3x1个B矩阵基本块直到singleCoreN方向的矩阵乘计算完成。NBuffer33模板策略如下图所示图中singleCoreM、singleCoreN、singleCoreK表示单核内A、B矩阵的shape大小单核计算的A矩阵切分为3x3个基本块3x3个基本块全载在L1 Buffer上这些基本块每次与B矩阵的3x1个基本块计算矩阵乘。图 3NBuffer33模板策略示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/64a9cc04b1c451b719675ebf8e72d743414e9a20/docs/api/figures/NBuffer33模板策略示意图.png NBuffer33模板策略示意图?utm_sourcegitcode_repo_files)MatmulWithScalePolicyMxMatmul模板策略实现带有量化系数的矩阵乘法即左矩阵和右矩阵均有对应的量化系数矩阵左量化系数矩阵scaleA和右量化系数矩阵scaleB。MxMatmul场景中左量化系数矩阵与左矩阵乘积右量化系数矩阵与右矩阵乘积对两个乘积的结果做矩阵乘法。图4 MxMatmul模板策略示意图SplitMMatmulPolicySplitM模板策略Matmul一次Iterate的计算结果从L0C Buffer搬到Unified Buffer时采用双输出模式即在分离模式下AIC核与AIV核的核数比为12时在调用GetTensorC接口后Matmul一次Iterate的计算结果在矩阵的M方向一分为二将被切分后的两块结果数据分别搬运到两个AIV核的Unified Buffer。模板策略示意图如下所示。图 4SplitM模板策略示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/64a9cc04b1c451b719675ebf8e72d743414e9a20/docs/api/figures/SplitM模板策略示意图.png SplitM模板策略示意图?utm_sourcegitcode_repo_files)SplitNMatmulPolicySplitN模板策略Matmul一次Iterate的计算结果从L0C Buffer搬到Unified Buffer时采用双输出模式即在分离模式下AIC核与AIV核的核数比为12时在调用GetTensorC接口后Matmul一次Iterate的计算结果在矩阵的N方向一分为二将被切分后的两块结果数据分别搬运到两个AIV核的Unified Buffer。模板策略示意图如下所示。图 5SplitN模板策略示意图![](https://raw.gitcode.com/cann/asc-devkit/raw/64a9cc04b1c451b719675ebf8e72d743414e9a20/docs/api/figures/SplitN模板策略示意图.png SplitN模板策略示意图?utm_sourcegitcode_repo_files)约束说明TrianUpperMatmulPolicy当前只支持Norm模板和MDL模板。TrianLowerMatmulPolicy当前只支持Norm模板和MDL模板。NBuffer33MatmulPolicy当前只支持MDL模板。A矩阵、B矩阵的内存逻辑位置只支持TPosition::GM。暂不支持MIX模式包含矩阵计算和矢量计算仅支持纯Cube模式只有矩阵计算。只支持通过IterateAll接口获取Matmul的计算结果C矩阵。stepM、stepKa、stepKb小于等于3且满足stepKastepKbceil(singleCoreK/baseK)。A矩阵全载的基本块大小与B矩阵载入的基本块大小之和不超过L1 Buffer大小。在使用GetTiling接口生成Tiling参数前必须通过SetMatmulConfigParams接口将scheduleTypeIn参数设置为ScheduleType::N_BUFFER_33以启用NBuffer33模板策略的Tiling生成逻辑。MatmulWithScalePolicy仅在Ascend 950PR/Ascend 950DT上支持。当前只支持Norm模板和MDL模板。SplitMMatmulPolicy仅在Ascend 950PR/Ascend 950DT上支持。只支持C矩阵输出到Unified Buffer。A矩阵、B矩阵类型信息MatmulType中的参数IBSHARE必须为true。SplitNMatmulPolicy仅在Ascend 950PR/Ascend 950DT上支持。只支持C矩阵输出到Unified Buffer。baseN必须满足是16的倍数。Tiling参数必须满足singleCoreM baseMsingleCoreN baseNsingleCoreK baseK。A矩阵、B矩阵类型信息MatmulType中的参数IBSHARE必须为true。调用示例默认模板策略MatmulPolicy为模板参数的默认值下面主要介绍TrianUpperMatmulPolicy上三角模板策略和TrianLowerMatmulPolicy下三角模板策略的使用方式。上三角模板策略使用示例#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; // Matmul定义时传入TrianUpperMatmulPolicy AscendC::MatmulaType, bType, cType, biasType, CFG_NORM, MatmulCallBackFuncnullptr, nullptr, nullptr, AscendC::Impl::Detail::TrianUpperMatmulPolicy mm; // 常规Matmul计算最后输出上三角形式的结果 TPipe pipe; TCubeTiling tiling; REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); mm.SetTensorA(gmA, isTransposeA); mm.SetTensorB(gmB, isTransposeB); if (tiling.isBias) { mm.SetBias(gmBias); } mm.IterateAll(gmC); mm.End();下三角模板策略使用示例#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; // Matmul定义时传入TrianLowerMatmulPolicy AscendC::MatmulaType, bType, cType, biasType, CFG_NORM, MatmulCallBackFuncnullptr, nullptr, nullptr, AscendC::Impl::Detail::TrianLowerMatmulPolicy mm; // 常规Matmul计算最后输出下三角形式的结果 TPipe pipe; TCubeTiling tiling; REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); mm.SetTensorA(gmA, isTransposeA); mm.SetTensorB(gmB, isTransposeB); if (tiling.isBias) { mm.SetBias(gmBias); } mm.IterateAll(gmC); mm.End();NBuffer33模板策略使用示例#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; // Matmul定义时传入NBuffer33MatmulPolicy AscendC::MatmulaType, bType, cType, biasType, CFG_NORM, MatmulCallBackFuncnullptr, nullptr, nullptr, AscendC::Impl::Detail::NBuffer33MatmulPolicy mm; // 常规Matmul计算最后输出下三角形式的结果 TPipe pipe; TCubeTiling tiling; REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); mm.SetTensorA(gmA, isTransposeA); mm.SetTensorB(gmB, isTransposeB); if (tiling.isBias) { mm.SetBias(gmBias); } mm.IterateAll(gmC); mm.End();MxMatmul模板策略使用示例#include lib/matmul_intf.h typedef MatmulTypeWithScaleAscendC::TPosition::GM, AscendC::TPosition::GM, CubeFormat::ND, AType, isTransposeA aType; typedef MatmulTypeWithScaleAscendC::TPosition::GM, AscendC::TPosition::GM, CubeFormat::ND, BType, isTransposeB bType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float cType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float biasType; // Matmul定义时传入MatmulWithScalePolicy AscendC::MatmulaType, bType, cType, biasType, CFG_NORM, MatmulCallBackFuncnullptr, nullptr, nullptr, AscendC::Impl::Detail::MatmulWithScalePolicy mm; // MxMatmul计算逻辑最后输出结果 TPipe pipe; TCubeTiling tiling; REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); mm.SetTensorA(gmA, isTransposeA); mm.SetTensorB(gmB, isTransposeB); mm.SetTensorScaleA(gm_scaleA, isTransposeScaleA); mm.SetTensorScaleB(gm_scaleB, isTransposeScaleB); if (tiling.isBias) { mm.SetBias(gmBias); } mm.IterateAll(gmC); mm.End();SplitM模板策略使用示例#include lib/matmul_intf.h typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half, LayoutMode::NONE, true aType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half, LayoutMode::NONE, true bType; typedef AscendC::MatmulTypeAscendC::TPosition::VECCALC, CubeFormat::ND, float cType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float biasType; // Matmul定义时传入SplitMMatmulPolicy AscendC::MatmulaType, bType, cType, biasType, CFG_NORM, MatmulCallBackFuncnullptr, nullptr, nullptr, AscendC::Impl::Detail::SplitMMatmulPolicy mm; // Matmul计算 TPipe pipe; TCubeTiling tiling; REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); mm.SetTensorA(gmA, isTransposeA); mm.SetTensorB(gmB, isTransposeB); if (tiling.isBias) { mm.SetBias(gmBias); } // 调用GetTensorC接口后将Matmul一次Iterate的计算结果一分为二搬运到两个AIV核的Unified Buffer。 pipe.InitBuffer(resultCMatrix, 1, tiling.M * tiling.N * sizeof(C_T)); mm.template Iteratefalse(); bufferC resultCMatrix.AllocTensorC_T(); uint16_t nIter_ Ceil(tiling.singleCoreN, tiling.baseN); uint16_t mIter_ Ceil(tiling.singleCoreM, tiling.baseM); uint16_t mnIter_ nIter_ * mIter_; uint16_t size tiling.baseM / 2 * tiling.baseN; for (int i 0; i mnIter_; i) { mm.template GetTensorCfalse(bufferC, false, false); // false // kfc vec0 iterate PipeBarrierPIPE_ALL(); } mm.End(); resultCMatrix.EnQue(bufferC); bufferC resultCMatrix.DeQueC_T(); uint16_t baseOffset tiling.M / 2 * tiling.N; uint16_t stride tiling.M / 2 * tiling.N * sizeof(C_T) / 32; // 32B const uint16_t blockCount tiling.M / tiling.M; if (GetSubBlockIdxImpl() 0) { DataCopy(gmC, bufferC, {blockCount, stride, stride, stride}); } else { DataCopy(gmC[baseOffset], bufferC, {blockCount, stride, stride, stride}); }SplitN模板策略使用示例#include lib/matmul_intf.h typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half, LayoutMode::NONE, true aType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, half, LayoutMode::NONE, true bType; typedef AscendC::MatmulTypeAscendC::TPosition::VECCALC, CubeFormat::ND, float cType; typedef AscendC::MatmulTypeAscendC::TPosition::GM, CubeFormat::ND, float biasType; // Matmul定义时传入SplitNMatmulPolicy AscendC::MatmulaType, bType, cType, biasType, CFG_NORM, MatmulCallBackFuncnullptr, nullptr, nullptr, AscendC::Impl::Detail::SplitNMatmulPolicy mm; // Matmul计算 TPipe pipe; TCubeTiling tiling; REGIST_MATMUL_OBJ(pipe, GetSysWorkSpacePtr(), mm, tiling); mm.SetTensorA(gmA, isTransposeA); mm.SetTensorB(gmB, isTransposeB); if (tiling.isBias) { mm.SetBias(gmBias); } // 调用GetTensorC接口后将Matmul一次Iterate的计算结果一分为二搬运到两个AIV核的Unified Buffer。 pipe.InitBuffer(resultCMatrix, 1, tiling.M * tiling.N * sizeof(C_T)); mm.template Iteratefalse(); bufferC resultCMatrix.AllocTensorC_T(); uint16_t nIter_ Ceil(tiling.singleCoreN, tiling.baseN); uint16_t mIter_ Ceil(tiling.singleCoreM, tiling.baseM); uint16_t mnIter_ nIter_ * mIter_; uint16_t size tiling.baseM / 2 * tiling.baseN; for (int i 0; i mnIter_; i) { mm.template GetTensorCfalse(bufferC, false, false); // false // kfc vec0 iterate PipeBarrierPIPE_ALL(); } mm.End(); resultCMatrix.EnQue(bufferC); bufferC resultCMatrix.DeQueC_T(); uint16_t baseOffset tiling.N / 2; uint16_t blockCount tiling.M; uint16_t blockLen (tiling.N / 2 * sizeof(C_T)) / 32; uint16_t srcStride 0; uint16_t dstStride (tiling.N / 2 * sizeof(C_T)) / 32; if (GetSubBlockIdxImpl() 0) { DataCopy(gmC, bufferC, {blockCount, blockLen, srcStride, dstStride}); } else { DataCopy(gmC[baseOffset], bufferC, {blockCount, blockLen, srcStride, dstStride}); }【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考