Matmul模板参数
功能说明
创建Matmul对象时需要传入:
- A、B、C、Bias的参数类型信息, 类型信息通过MatmulType来定义,包括:内存逻辑位置、数据格式、数据类型、是否转置、数据排布和是否使能L1复用。
- MatmulConfig信息(可选),用于配置Matmul模板信息以及相关的配置参数。不配置默认使能Norm模板。
针对Atlas 200/500 A2推理产品,当前只支持使能默认的Norm模板。
实现原理
以输入矩阵A (GM, ND, half)、矩阵B(GM, ND, half),输出矩阵C (GM, ND, float),无bias场景为例,其中(GM, ND, half)表示数据存放在GM上,数据格式为ND,数据类型为half,描述matmul高阶API典型场景的内部算法框图,如下图所示。

计算过程分为如下几步:
- 数据从GM搬到A1:DataCopy每次从矩阵A,搬出一个stepM*baseM*stepKa*baseK的矩阵块a1,循环多次完成矩阵A的搬运;数据从GM搬到B1:DataCopy每次从矩阵B,搬出一个stepKb*baseK*stepN*baseN的矩阵块b1,循环多次完成矩阵B的搬运;
- 数据从A1搬到A2:LoadData每次从矩阵块a1,搬出一个baseM * baseK的矩阵块a0;数据从B1搬到B2,并完成转置: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搬到矩阵块C:DataCopy每次搬运一块singleCoreM * singleCoreN的矩阵块co2到矩阵块C中;
- 重复1-6步骤,完成矩阵A * B = C的计算。
函数原型
template <class A_TYPE, class B_TYPE, class C_TYPE, class BIAS_TYPE = C_TYPE, const MatmulConfig& MM_CFG = CFG_NORM,class MM_CB = MatmulCallBackFunc<nullptr, nullptr, nullptr>>
using Matmul = matmul::MatmulImpl<A_TYPE, B_TYPE, C_TYPE, BIAS_TYPE, MM_CFG, MM_CB>;
其中A_TYPE, B_TYPE, C_TYPE类型信息通过MatmulType来定义;
- 获取MDL模板的接口
__aicore__ constexpr MatmulConfig GetMDLConfig(const bool intrinsicsCheck = false, const bool isNBatch = false, const uint32_t doMTE2Preload = 0, const bool enVecND2NZ = false, bool isPerTensor = false, bool hasAntiQuantOffset = false, const bool enUnitFlag = false)
- 获取SpecialMDL的接口
__aicore__ constexpr MatmulConfig GetSpecialMDLConfig(const bool intrinsicsCheck = false, const bool isNBatch = false, const uint32_t doMTE2Preload = 0, const bool enVecND2NZ = false, bool isPerTensor = false, bool hasAntiQuantOffset = false)
- 获取IBShare模板的接口
__aicore__ constexpr MatmulConfig GetIBShareNormConfig(const bool intrinsicsCheck = false, const bool isNBatch = false, const bool enVecND2NZ = false, const BatchMode batchMode = BatchMode::BATCH_LESS_THAN_L1)
- 获取BasicBlock模板的接口(预留接口)
__aicore__ constexpr MatmulConfig GetBasicConfig(const uint32_t basicM, const uint32_t basicN, const uint32_t basicK, const bool intrinsicsCheck = false, const bool isNBatch = false, const BatchMode batchMode = BatchMode::BATCH_LESS_THAN_L1)
- 获取SpecialBasicBlock模板的接口(预留接口)
__aicore__ constexpr MatmulConfig GetSpecialBasicConfig(const uint32_t basicM, const uint32_t basicN, const uint32_t basicK, const uint32_t singleCoreM, const uint32_t singleCoreN, const uint32_t singleCoreK, const uint32_t stepM, const uint32_t stepN, const bool intrinsicsCheck = false, const bool isNBatch = false, const BatchMode batchMode = BatchMode::BATCH_LESS_THAN_L1)
MM_CB为预留参数,不需传入。
参数说明
参数 |
说明 |
POSITION |
内存逻辑位置 针对Atlas A2训练系列产品:
针对Atlas推理系列产品AI Core:
针对Atlas 200/500 A2推理产品:
|
CubeFormat |
针对Atlas A2训练系列产品:
针对Atlas推理系列产品AI Core:
|
TYPE |
针对Atlas A2训练系列产品:
针对Atlas推理系列产品AI Core:
针对Atlas 200/500 A2推理产品:
注意:A矩阵和B矩阵数据类型需要一致,具体数据类型组合关系请参考表2。 |
ISTRANS |
表征是否使能转置
默认为false不使能转置 |
LAYOUT |
表征数据的排布 NONE:默认值,表示不使用BatchMatmul;其他选项表示使用BatchMatmul。 NORMAL:BMNK的数据排布格式。 BSNGD:原始BSH shape做reshape后的数据排布,具体可参考IterateBatch中对该数据排布的介绍。 SBNGD:原始SBH shape做reshape后的数据排布,具体可参考IterateBatch中对该数据排布的介绍。 BNGS1S2:一般为前两种数据排布进行矩阵乘的输出,S1S2数据连续存放,一个S1S2为一个batch的计算数据。 |
IBSHARE |
是否使能IBShare,不支持同时复用A矩阵和B矩阵的数据 |
参数 |
说明 |
支持模板:当前共支持4个模板Norm, MDL, SpecialMDL, IBShare |
doNorm |
使能Norm模板。参数取值如下:
不指定模板的情况默认使能Norm模板。 |
Norm |
doMultiDataLoad |
使能MDL模板。参数取值如下:
|
MDL |
doSpecialMDL |
使能SpecialMDL模板。参数取值如下:
本质上也是MDL模板。MDL模板matmul K方向不全载时(singleCoreK/baseK > stepKb),仅支持stepN设置为1,开启后支持stepN=2。 |
SpecialMDL |
doIBShareNorm |
使能IBShare模板。参数取值如下:
IBShare的功能是能够复用L1上相同的A矩阵或B矩阵数据,开启后在数据复用场景能够避免重复搬运数据到L1。 |
IBShare |
intrinsicsCheck |
进行芯片指令搬运地址偏移量校验,影响性能。参数取值如下:
|
所有模板 |
isNBatch |
是否多Batch输入多Batch输出。参数取值如下:
仅对BatchMatmul有效。 |
所有模板 |
enVecND2NZ |
使能通过vector进行ND2NZ。参数取值如下:
使能时需要设置SetLocalWorkspace。 |
所有模板 |
enableInit |
是否启用Init函数,不使能Init函数能够提升常量传播效果,优化性能。默认使能 |
所有模板 |
batchMode |
Layout类型为NORMAL时,设置BatchMatmul输入A/B矩阵的多batch数据总和与L1 Buffer的大小关系。参数取值如下:
|
Norm, IBShare |
enUnitFlag |
使能unitflag功能,使计算与搬运流水并行,提高性能。Norm、IBShare模板下默认使能。 |
MDL |
isPerTensor |
A矩阵half类型输入,B矩阵int8类型输入场景使能B矩阵量化时是否为per tensor,true为per tensor,false为per channel。 |
MDL, SpecialMDL |
hasAntiQuantOffset |
A矩阵half类型输入,B矩阵int8类型输入场景使能B矩阵量化时是否使用offset系数。 |
MDL, SpecialMDL |
doMTE2Preload |
在MTE2流水间隙较大,且M/N数值较大时可通过该参数开启对应M/N方向的预加载功能,开启后能减小MTE2间隙,提升性能。预加载功能仅在MDL模板有效。参数取值如下:
注意,开启M/N预加载功能时需保证K全载,且M/N开启Double Buffer。 |
MDL, SpecialMDL |
enableReuse |
SetSelfDefineData函数设置的回调函数中的dataPtr是否直接传递计算数据。参数取值如下:
|
预留参数 |
doBasicBlock |
使能BasicBlock模板。参数取值如下:
|
预留参数 |
basicM |
相当于baseM |
预留参数 |
basicN |
相当于baseN |
预留参数 |
basicK |
相当于baseK |
预留参数 |
doSpecialBasicBlock |
使能SpecialBasicBlock模板。参数取值如下:
本质上也是BasicBlock模板,但消除了头开销scalar计算。 |
预留参数 |
singleCoreM |
单核内M轴shape大小,以元素为单位。 |
预留参数 |
singleCoreN |
单核内N轴shape大小,以元素为单位。 |
预留参数 |
singleCoreK |
单核内K轴shape大小,以元素为单位。 |
预留参数 |
stepM |
左矩阵在A1中缓存的bufferM方向上baseM的倍数。 |
预留参数 |
stepN |
右矩阵在B1中缓存的bufferN方向上baseN的倍数。 |
预留参数 |
baseMN |
baseM*baseN的大小。 |
预留参数 |
singleCoreMN |
singleCoreM*singleCoreN的大小。 |
预留参数 |
模板 |
实现 |
优点 |
推荐使用场景 |
---|---|---|---|
Norm |
支持L1缓存多个基本块,MTE2分多次从GM搬运基本块到L1,每次搬运一份基本块,已搬的基本块不清空。(举例说明:depthA1=6,代表搬入6份A矩阵基本块到L1,1次搬运一份基本块,MTE2进行6次搬运) |
可以提前启动MTE1流水(因为搬1份基本块就可以做MTE1后面的运算) |
默认使能Norm模板 |
MDL,SpecialMDL |
支持L1缓存多个基本块,MTE2从GM到L1的搬运为一次性"大包"搬运。(举例说明:depthA1=6,代表一次性搬入6份A矩阵基本块到L1,MTE2进行1次搬运) |
对于一般的大shape场景,可以减少MTE2的循环搬运,提升性能 |
大shape场景 |
IBShare |
MIX场景下,多个AIV的A矩阵或B矩阵GM地址相同的时候,通过共享L1 Buffer,减少MTE2搬运 |
减少MTE2搬运,提升性能 |
MIX场景多个AIV的A矩阵或B矩阵GM地址相同 |
返回值
无
支持的型号
Atlas A2训练系列产品
Atlas推理系列产品AI Core
Atlas 200/500 A2推理产品
注意事项
无
调用示例
typedef MatmulType<TPosition::GM, CubeFormat::ND, half> aType; typedef MatmulType<TPosition::GM, CubeFormat::ND, half> bType; typedef MatmulType<TPosition::GM, CubeFormat::ND, float> cType; typedef MatmulType<TPosition::GM, CubeFormat::ND, float> biasType; Matmul<aType, bType, cType, biasType, CFG_MDL> mm1; MatmulConfig mmConfig{false, true, false, 128, 128, 64}; mmConfig.enUnitFlag = false; Matmul<aType, bType, cType, biasType, mmConfig> mm2;