GetMMConfig
功能说明
灵活的自定义Matmul模板参数配置。通过设置MatmulConfigMode、MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams,获取自定义的MatmulConfig。
MatmulConfigMode指定了获取并要修改的MatmulConfig模板,各模板介绍请参考表 模板特性;用户根据使用需求通过设置可变参数,即一个或多个任意顺序的MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams,修改该MatmulConfig模板的相应参数配置。
函数原型
1 2 | template <MatmulConfigMode configMode, typename... ArgTypes> __aicore__ inline constexpr MatmulConfig GetMMConfig(ArgTypes&&... args) |
参数说明
参数名 |
描述 |
---|---|
configMode |
获取的MatmulConfig模板。 |
ArgTypes |
可变模版参数。 |
参数名 |
输入/输出 |
描述 |
---|---|---|
args |
输入 |
可变参数,任意顺序传入需要设置的MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams中的一个或多个。 |
参数 |
说明 |
---|---|
CONFIG_NORM |
表示设置MatmulConfig默认值为Norm模板 |
CONFIG_MDL |
表示设置MatmulConfig默认值为MDL模板 |
CONFIG_SPECIALMDL |
表示设置MatmulConfig默认值为SpecialMDL模板 |
CONFIG_IBSHARE |
表示设置MatmulConfig默认值为IBShare模板 |
参数 |
数据类型 |
说明 |
---|---|---|
singleCoreM |
uint32_t |
单核内M轴shape大小,以元素为单位。 |
singleCoreN |
uint32_t |
单核内N轴shape大小,以元素为单位。 |
singleCoreK |
uint32_t |
单核内K轴shape大小,以元素为单位。 |
basicM |
uint32_t |
相当于baseM,Matmul计算时base块M轴长度,以元素为单位。 |
basicN |
uint32_t |
相当于baseN,Matmul计算时base块N轴长度,以元素为单位。 |
basicK |
uint32_t |
相当于baseK,Matmul计算时base块K轴长度,以元素为单位。 |
参数 |
数据类型 |
说明 |
---|---|---|
isPerTensor |
bool |
A矩阵half类型输入且B矩阵int8_t类型输入场景,使能B矩阵量化时是否为per tensor,true为per tensor,false为per channel。 |
hasAntiQuantOffset |
bool |
A矩阵half类型输入且B矩阵int8_t类型输入场景,使能B矩阵量化时是否使用offset系数。 |
参数 |
数据类型 |
说明 |
---|---|---|
batchLoop |
bool |
是否多Batch输入多Batch输出。仅对BatchMatmul有效。参数取值如下:
|
bmmMode |
BatchMode |
BatchMatmul场景中Layout类型为NORMAL时,设置BatchMatmul输入A/B矩阵的多batch数据总和与L1 Buffer的大小关系。参数取值如下:
|
isBiasBatch |
bool |
批量多Batch的Matmul场景,即BatchMatmul场景,Bias的大小是否带有Batch轴。参数取值如下:
|
参数 |
数据类型 |
说明 |
||
---|---|---|---|---|
intrinsicsLimit |
bool |
当左矩阵或右矩阵在单核上内轴(即尾轴)大于等于65535(元素个数)时,是否使能循环执行数据从Global Memory到L1 Buffer的搬入。例如,左矩阵A[M, K],单核上的内轴数据singleCoreK大于65535,配置该参数为true后,API内部通过循环执行数据的搬入。参数取值如下:
|
||
enVecND2NZ |
bool |
使能通过vector指令进行ND2NZ。使能时需要设置SetLocalWorkspace。参数取值如下:
针对 |
||
doMTE2Preload |
uint32_t |
在MTE2流水间隙较大,且M/N数值较大时可通过该参数开启对应M/N方向的预加载功能,开启后能减小MTE2间隙,提升性能。预加载功能仅在MDL模板有效(不支持SpecialMDL模板)。参数取值如下:
注意:开启M/N方向的预加载功能时需保证K全载且M/N方向开启Double Buffer;其中,M方向的K全载条件为:singleCoreK/baseK <= stepKa;N方向的K全载条件为:singleCoreK/baseK <= stepKb。 |
||
enableReuse |
bool |
SetSelfDefineData函数设置的回调函数中的dataPtr是否直接传递计算数据。参数取值如下:
|
||
enableUBReuse |
bool |
是否使能Unified Buffer复用。在Unified Buffer空间足够的条件下(Unified Buffer空间大于4倍TCubeTiling的transLength参数),使能该参数后,Unified Buffer空间分为互不重叠的两份,分别存储Matmul计算相邻前后两轮迭代的数据,后一轮迭代数据的搬入将不必等待前一轮迭代的Unified Buffer空间释放,从而优化流水。参数取值如下:
|
||
enableL1CacheUB |
bool |
是否使能L1 Buffer缓存Unified Buffer计算块。建议在MTE3和MTE2流水串行较多的场景使用。参数取值如下:
若要使能L1 Buffer缓存Unified Buffer计算块,必须在Tiling实现中调用SetMatmulConfigParams接口将参数enableL1CacheUBIn设置为true。 |
||
iterateOrder |
IterateOrder |
Matmul做矩阵运算的循环迭代顺序,与表1中的iterateOrder参数含义相同。当ScheduleType参数取值为ScheduleType::OUTER_PRODUCT或1时,本参数生效。参数取值如下:
注:Norm模板的Matmul场景、MDL模板使用时,若IterateOrder取值ORDER_M,TCubeTiling结构中的stepN需要大于1,IterateOrder取值ORDER_N时,TCubeTiling结构中的stepM需要大于1。 |
||
scheduleType |
ScheduleType |
配置Matmul数据搬运模式。参数取值如下:
注:
|
||
enableDoubleCache |
bool |
开启IBShare模板后,在L1 Buffer上是否同时缓存两块数据。注意,需要控制base块大小,防止两块缓存超过L1 Buffer大小限制。参数取值如下:
|
返回值
支持的型号
注意事项
无
调用示例
1 2 3 4 5 6 7 8 9 10 11 | // 获取MatmulConfig模板为Norm模板 constexpr static MatmulConfigMode configMode = MatmulConfigMode::CONFIG_NORM; // singleCoreM、singleCoreN、singleCoreK、basicM、basicN、basicK constexpr static MatmulShapeParams shapeParams = {128, 128, 128, 64, 64, 64}; // B矩阵量化时为per channel且不使用offset系数 constexpr static MatmulQuantParams quantParams = {false, false}; // 不使能多Batch constexpr static MatmulBatchParams batchParams{false}; // 不进行芯片指令搬运地址偏移量校验,使能通过vector进行ND2NZ constexpr static MatmulFuncParams funcParams{false, true}; constexpr static MatmulConfig mmConfig = GetMMConfig<configMode>(shapeParams, quantParams, batchParams, funcParams); |