下载
EN
注册

GetMMConfig

功能说明

灵活的自定义Matmul模板参数配置。通过设置MatmulConfigModeMatmulShapeParamsMatmulQuantParamsMatmulBatchParamsMatmulFuncParams,获取自定义的MatmulConfig

MatmulConfigMode指定了获取并要修改的MatmulConfig模板,各模板介绍请参考表 模板特性;用户根据使用需求通过设置可变参数,即一个或多个任意顺序的MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams,修改该MatmulConfig模板的相应参数配置。

函数原型

1
2
template <MatmulConfigMode configMode, typename... ArgTypes>
__aicore__ inline constexpr MatmulConfig GetMMConfig(ArgTypes&&... args)

参数说明

表1 模板参数说明

参数名

描述

configMode

获取的MatmulConfig模板。

ArgTypes

可变模版参数。

表2 参数说明

参数名

输入/输出

描述

args

输入

可变参数,任意顺序传入需要设置的MatmulShapeParams、MatmulQuantParams、MatmulBatchParams、MatmulFuncParams中的一个或多个。

表3 MatmulConfigMode参数说明

参数

说明

CONFIG_NORM

表示设置MatmulConfig默认值为Norm模板

CONFIG_MDL

表示设置MatmulConfig默认值为MDL模板

CONFIG_SPECIALMDL

表示设置MatmulConfig默认值为SpecialMDL模板

CONFIG_IBSHARE

表示设置MatmulConfig默认值为IBShare模板

表4 MatmulShapeParams参数说明

参数

数据类型

说明

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轴长度,以元素为单位。

表5 MatmulQuantParams参数说明

参数

数据类型

说明

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系数。

表6 MatmulBatchParams参数说明

参数

数据类型

说明

batchLoop

bool

是否多Batch输入多Batch输出。仅对BatchMatmul有效。参数取值如下:

  • false:不使能多Batch(默认值)。
  • true:使能多Batch。

bmmMode

BatchMode

BatchMatmul场景中Layout类型为NORMAL时,设置BatchMatmul输入A/B矩阵的多batch数据总和与L1 Buffer的大小关系。参数取值如下:

  • BatchMode::BATCH_LESS_THAN_L1:多batch数据总和<L1 Buffer Size;
  • BatchMode::BATCH_LARGE_THAN_L1:多batch数据总和>L1 Buffer Size;
  • BatchMode::SINGLE_LARGE_THAN_L1:单batch数据总和>L1 Buffer Size。

isBiasBatch

bool

批量多Batch的Matmul场景,即BatchMatmul场景,Bias的大小是否带有Batch轴。参数取值如下:

  • true:Bias带有Batch轴,Bias大小为Batch * N(默认值)。
  • false:Bias不带Batch轴,Bias大小为N,多Batch计算Matmul时,会复用Bias。

    Atlas A2 训练系列产品/Atlas 800I A2 推理产品支持该参数。

    Atlas A2 训练系列产品/Atlas 800I A2 推理产品支持该参数。

    Atlas 推理系列产品AI Core不支持设置为false。

表7 MatmulFuncParams参数说明

参数

数据类型

说明

intrinsicsLimit

bool

当左矩阵或右矩阵在单核上内轴(即尾轴)大于等于65535(元素个数)时,是否使能循环执行数据从Global MemoryL1 Buffer的搬入。例如,左矩阵A[M, K],单核上的内轴数据singleCoreK大于65535,配置该参数为true后,API内部通过循环执行数据的搬入。参数取值如下:

  • false:当左矩阵或右矩阵在单核上内轴大于等于65535时,不使能循环执行数据的搬入(默认值)。
  • true:当左矩阵或右矩阵在单核上内轴大于等于65535时,使能数循环执行数据的搬入。

enVecND2NZ

bool

使能通过vector指令进行ND2NZ。使能时需要设置SetLocalWorkspace。参数取值如下:

  • false:不使能通过vector指令进行ND2NZ(默认值)。
  • true:使能通过vector指令进行ND2NZ。

针对Atlas 推理系列产品AI Core,在Unified Buffer空间足够的条件下(Unified Buffer空间大于2倍TCubeTiling的transLength参数),建议优先使能该参数,搬运性能更好。

doMTE2Preload

uint32_t

在MTE2流水间隙较大,且M/N数值较大时可通过该参数开启对应M/N方向的预加载功能,开启后能减小MTE2间隙,提升性能。预加载功能仅在MDL模板有效(不支持SpecialMDL模板)。参数取值如下:

  • 0:不开启(默认值)。
  • 1:开启M方向preload。
  • 2:开启N方向preload。

注意:开启M/N方向的预加载功能时需保证K全载且M/N方向开启Double Buffer;其中,M方向的K全载条件为:singleCoreK/baseK <= stepKa;N方向的K全载条件为:singleCoreK/baseK <= stepKb。

enableReuse

bool

SetSelfDefineData函数设置的回调函数中的dataPtr是否直接传递计算数据。参数取值如下:

  • true:直接传递计算数据,仅限单个值
  • false:传递GM上存储的数据地址信息

enableUBReuse

bool

是否使能Unified Buffer复用。在Unified Buffer空间足够的条件下(Unified Buffer空间大于4倍TCubeTiling的transLength参数),使能该参数后,Unified Buffer空间分为互不重叠的两份,分别存储Matmul计算相邻前后两轮迭代的数据,后一轮迭代数据的搬入将不必等待前一轮迭代的Unified Buffer空间释放,从而优化流水。参数取值如下:

  • true:使能Unified Buffer复用。
  • false:不使能Unified Buffer复用。

Atlas A2 训练系列产品/Atlas 800I A2 推理产品不支持该参数。

Atlas 推理系列产品AI Core支持该参数。

enableL1CacheUB

bool

是否使能L1 Buffer缓存Unified Buffer计算块。建议在MTE3和MTE2流水串行较多的场景使用。参数取值如下:

  • true:使能L1 Buffer缓存Unified Buffer计算块。
  • false:不使能L1 Buffer缓存Unified Buffer计算块。

若要使能L1 Buffer缓存Unified Buffer计算块,必须在Tiling实现中调用SetMatmulConfigParams接口将参数enableL1CacheUBIn设置为true。

Atlas A2 训练系列产品/Atlas 800I A2 推理产品不支持该参数。

Atlas 推理系列产品AI Core支持该参数。

iterateOrder

IterateOrder

Matmul做矩阵运算的循环迭代顺序,与表1中的iterateOrder参数含义相同。当ScheduleType参数取值为ScheduleType::OUTER_PRODUCT或1时,本参数生效。参数取值如下:

1
2
3
4
5
enum class IterateOrder {
    ORDER_M = 0,   // 先往M轴方向偏移再往N轴方向偏移
    ORDER_N,       // 先往N轴方向偏移再往M轴方向偏移
    UNDEF,         // 当前无效
};

注:Norm模板的Matmul场景、MDL模板使用时,若IterateOrder取值ORDER_M,TCubeTiling结构中的stepN需要大于1,IterateOrder取值ORDER_N时,TCubeTiling结构中的stepM需要大于1。

Atlas A2 训练系列产品/Atlas 800I A2 推理产品支持该参数。

Atlas 推理系列产品AI Core不支持该参数。

scheduleType

ScheduleType

配置Matmul数据搬运模式。参数取值如下:

  • ScheduleType::INNER_PRODUCT或0:默认模式,在K方向上做MTE1的循环搬运;
  • ScheduleType::OUTER_PRODUCT或1:在M或N方向上做MTE1的循环搬运;使能后,需要与IterateOrder参数配合使用。该配置当前只在BatchMatmul场景(使能Norm模板)或Matmul场景(使能MDL模板或Norm模板)生效。
    • 若IterateOrder取值ORDER_M,则N方向循环搬运(在singleCoreN大于baseN场景可能有性能提升),即B矩阵的MTE1搬运并行;
    • 若IterateOrder取值ORDER_N,则M方向循环搬运(在singleCoreM大于baseM场景可能有性能提升),即A矩阵的MTE1搬运并行;
    • 不能同时使能M方向和N方向循环搬运;

注:

  • Norm模板的Batch Matmul场景或者MDL模板中,singleCoreK>baseK时,不能使能ScheduleType::OUTER_PRODUCT取值,需使用默认模式。
  • MDL模板仅在调用IterateAll计算的场景支持配置ScheduleType::OUTER_PRODUCT或1。
  • 仅在C矩阵输出至GM时,支持配置ScheduleType::OUTER_PRODUCT或1。

Atlas A2 训练系列产品/Atlas 800I A2 推理产品支持该参数。

Atlas 推理系列产品AI Core不支持该参数。

enableDoubleCache

bool

开启IBShare模板后,在L1 Buffer上是否同时缓存两块数据。注意,需要控制base块大小,防止两块缓存超过L1 Buffer大小限制。参数取值如下:

  • false:L1 Buffer上同时缓存一块数据(默认值)。
  • true:使能L1 Buffer上同时缓存两块数据。

支持的型号

Atlas A2 训练系列产品/Atlas 800I A2 推理产品

Atlas 推理系列产品AI Core

注意事项

调用示例

 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);