文档
注册
评分
提单
论坛
小AI

Matmul模板参数

功能说明

创建Matmul对象时需要传入:

  • A、B、C、Bias的参数类型信息, 类型信息通过MatmulType来定义,包括:内存逻辑位置、数据格式、数据类型、是否转置、数据排布和是否使能L1复用。
  • MatmulConfig信息(可选),用于配置Matmul模板信息以及相关的配置参数。不配置默认使能Norm模板。

    针对Atlas 200/500 A2推理产品,当前只支持使能默认的Norm模板。

  • MatmulCallBack回调函数信息(可选),用于配置左右矩阵从GM拷贝到L1、计算结果从CO1拷贝到GM的自定义函数。当前支持如下产品型号:

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

  • MatmulPolicy信息(可选),预留参数。

实现原理

以输入矩阵A (GM, ND, half)、矩阵B(GM, ND, half),输出矩阵C (GM, ND, float),无Bias场景为例,其中(GM, ND, half)表示数据存放在GM上,数据格式为ND,数据类型为half,描述Matmul高阶API典型场景的内部算法框图,如下图所示。
图1 Matmul算法框图

计算过程分为如下几步:

  1. 数据从GM搬到A1:DataCopy每次从矩阵A,搬出一个stepM*baseM*stepKa*baseK的矩阵块a1,循环多次完成矩阵A的搬运;数据从GM搬到B1:DataCopy每次从矩阵B,搬出一个stepKb*baseK*stepN*baseN的矩阵块b1,循环多次完成矩阵B的搬运;
  2. 数据从A1搬到A2:LoadData每次从矩阵块a1,搬出一个baseM * baseK的矩阵块a0;数据从B1搬到B2,并完成转置:LoadData每次从矩阵块b1,搬出一个baseK * baseN的矩阵块,并将其转置为baseN * baseK的矩阵块b0;
  3. 矩阵乘:每次完成一个矩阵块a0 * b0的计算,得到baseM * baseN的矩阵块co1;
  4. 数据从矩阵块co1搬到矩阵块co2: DataCopy每次搬运一块baseM * baseN的矩阵块co1到singleCoreM * singleCoreN的矩阵块co2中;
  5. 重复2-4步骤,完成矩阵块a1 * b1的计算;
  6. 数据从矩阵块co2搬到矩阵块C:DataCopy每次搬运一块singleCoreM * singleCoreN的矩阵块co2到矩阵块C中;
  7. 重复1-6步骤,完成矩阵A * B = C的计算。

函数原型

1
2
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>, MATMUL_POLICY_DEFAULT_OF(MatmulPolicy)>
using Matmul = matmul::MatmulImpl<A_TYPE, B_TYPE, C_TYPE, BIAS_TYPE, MM_CFG, MM_CB, MATMUL_POLICY>;
  • A_TYPE、B_TYPE、C_TYPE类型信息通过MatmulType来定义。
  • MatmulConfig(可选),参数说明见表2
    • 该参数可选取提供的模板默认值之一,当前提供的MatmulConfig模板取值范围为【CFG_NORM、CFG_MDL、CFG_IBSHARE_NORM、MM_CFG_BB】,分别对应默认的Norm、MDL、IBShare、BasicBlock模板。各模板的介绍请参考表3
    • 该参数可以通过MatmulConfig章节中介绍的获取模板的接口,自定义模板参数配置。
    • 另外,MatmulConfig可拆分为MatmulShapeParamsMatmulQuantParamsMatmulBatchParamsMatmulFuncParams二级子Config,使用GetMMConfig接口,设置需要的二级子Config和MatmulConfigMode,可以更加灵活的获取自定义的模板参数配置MatmulConfig。
  • MM_CB(可选),用于支持不同的搬入搬出需求,实现定制化的搬入搬出功能,如非连续搬入或针对搬出设置不同的数据片段间隔等。MM_CB中3个函数指针分别对应计算结果从CO1拷贝到GM、左矩阵从GM拷贝到L1、右矩阵从GM拷贝到L1的回调函数指针,各个功能回调函数接口定义及参数释义见表9
  • MATMUL_POLICY_DEFAULT_OF(MatmulPolicy)(可选),当前为预留参数,无须配置。
    1
    2
    #define MATMUL_POLICY_DEFAULT_OF(DEFAULT)      \
    template <const auto& = MM_CFG, typename ...> class MATMUL_POLICY = DEFAULT
    

参数说明

表1 MatmulType参数说明

参数

说明

POSITION

内存逻辑位置

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

  • A矩阵可设置为TPosition::GM,TPosition::VECOUT,TPosition::TSCM
  • B矩阵可设置为TPosition::GM,TPosition::VECOUT,TPosition::TSCM
  • Bias可设置为TPosition::GM,TPosition::VECOUT,TPosition::TSCM
  • C矩阵可设置为TPosition::GM,TPosition::VECIN

针对Atlas推理系列产品AI Core

  • A矩阵可设置为TPosition::GM,TPosition::VECOUT
  • B矩阵可设置为TPosition::GM,TPosition::VECOUT
  • Bias可设置为TPosition::GM,TPosition::VECOUT
  • C矩阵可设置为TPosition::GM,TPosition::VECIN

针对Atlas 200/500 A2推理产品

  • A矩阵可设置为TPosition::GM,TPosition::VECOUT,TPosition::TSCM
  • B矩阵可设置为TPosition::GM,TPosition::VECOUT,TPosition::TSCM
  • C矩阵可设置为TPosition::GM,TPosition::VECIN
  • Bias可设置为TPosition::GM,TPosition::VECOUT

CubeFormat

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

  • A矩阵可设置为CubeFormat::ND,CubeFormat::NZ
  • B矩阵可设置为CubeFormat::ND,CubeFormat::NZ
  • Bias可设置为CubeFormat::ND
  • C矩阵可设置为CubeFormat::ND,CubeFormat::NZ,CubeFormat::ND_ALIGN

针对Atlas推理系列产品AI Core

  • A矩阵可设置为CubeFormat::ND,CubeFormat::NZ
  • B矩阵可设置为CubeFormat::ND,CubeFormat::NZ
  • Bias可设置为CubeFormat::ND
  • C矩阵可设置为CubeFormat::ND,CubeFormat::NZ,CubeFormat::ND_ALIGN

TYPE

针对Atlas A2训练系列产品/Atlas 800I A2推理产品
  • A矩阵可设置为half、float、bfloat16_t 、int8_t、int4b_t
  • B矩阵可设置为half、float、bfloat16_t 、int8_t、int4b_t
  • Bias可设置为half、float、int32_t
  • C矩阵可设置为half、float、bfloat16_t、int32_t、int8_t

针对Atlas推理系列产品AI Core

  • A矩阵可设置为half、int8_t
  • B矩阵可设置为half、int8_t
  • Bias可设置为float、int32_t
  • C矩阵可设置为half、float、int8_t、int32_t

针对Atlas 200/500 A2推理产品

  • A矩阵可设置为half、float、bfloat16_t 、int8_t
  • B矩阵可设置为half、float、bfloat16_t 、int8_t
  • Bias矩阵可设置为half、float、int32_t
  • C矩阵可设置为half、float、bfloat16_t、int32_t

注意:A矩阵和B矩阵数据类型需要一致,具体数据类型组合关系请参考表2

ISTRANS

是否开启使能矩阵转置的功能。

  • true为开启使能矩阵转置的功能,开启后,分别通过SetTensorASetTensorB中的isTransposeA、isTransposeB参数设置A、B矩阵是否转置。若设置A、B矩阵转置,Matmul会认为A矩阵形状为[K, M],B矩阵形状为[N, K]。
  • false为不开启使能矩阵转置的功能,通过SetTensorASetTensorB不能设置A、B矩阵是否转置。Matmul会认为A矩阵形状为[M, K],B矩阵形状为[K, N]。

默认为false不使能转置。

LAYOUT

表征数据的排布

NONE:默认值,表示不使用BatchMatmul;其他选项表示使用BatchMatmul。

NORMAL:BMNK的数据排布格式。

BSNGD:原始BSH shape做reshape后的数据排布,具体可参考IterateBatch中对该数据排布的介绍。

SBNGD:原始SBH shape做reshape后的数据排布,具体可参考IterateBatch中对该数据排布的介绍。

BNGS1S2:一般为前两种数据排布进行矩阵乘的输出,S1S2数据连续存放,一个S1S2为一个batch的计算数据。

IBSHARE

是否使能IBShare。IBShare的功能是能够复用L1上相同的A矩阵或B矩阵数据。当A矩阵和B矩阵同时使能IBShare时,表示L1上的A矩阵和B矩阵同时复用,此时只支持Norm模板。

除A、B矩阵同时复用的场景外,与Matmul模板参数中的IBShare模板配合使用,具体参数设置详见表2

表2 MatmulConfig参数说明

参数

说明

支持模板:Norm, MDL, SpecialMDL, IBShare, BasicBlock

doNorm

使能Norm模板。参数取值如下:

  • true:使能Norm模板
  • false:不使能Norm模板

不指定模板的情况默认使能Norm模板。

Norm

doMultiDataLoad

使能MDL模板。参数取值如下:

  • true:使能MDL模板
  • false:不使能MDL模板

MDL

doSpecialMDL

使能SpecialMDL模板。参数取值如下:

  • true:使能SpecialMDL模板
  • false:不使能SpecialMDL模板

本质上也是MDL模板。MDL模板Matmul K方向不全载时(singleCoreK/baseK > stepKb),仅支持stepN设置为1,开启后支持stepN=2。

SpecialMDL

doIBShareNorm

使能IBShare模板。参数取值如下:

  • false:不使能IBShare(默认值)
  • true:使能IBShare

IBShare的功能是能够复用L1上相同的A矩阵或B矩阵数据,开启后在数据复用场景能够避免重复搬运数据到L1。

IBShare

intrinsicsLimit

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

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

所有模板

batchLoop

是否多Batch输入多Batch输出。参数取值如下:

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

仅对BatchMatmul有效。

所有模板

isVecND2NZ

使能通过vector进行ND2NZ。参数取值如下:

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

使能时需要设置SetLocalWorkspace。

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

所有模板

enableInit

是否启用Init函数,不使能Init函数能够提升常量传播效果,优化性能。默认使能。

所有模板

bmmMode

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。

Norm, IBShare

enUnitFlag

使能unitflag功能,使计算与搬运流水并行,提高性能。Norm, IBShare下默认使能,MDL下默认不使能。参数取值如下:

  • false:不使能unitflag功能
  • true:使能unitflag功能

MDL, Norm, IBShare

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模板有效。参数取值如下:

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

注意,开启M/N预加载功能时需保证K全载,且M/N开启Double Buffer。

MDL, SpecialMDL

isMsgReuse

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

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

Norm, MDL

enableUBReuse

是否使能UB复用。参数取值如下:

  • true:使能UB复用
  • false:不使能UB复用

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

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

Atlas 200/500 A2推理产品不支持该参数。

MDL

enableL1CacheUB

是否使能L1缓存UB计算块。参数取值如下:

  • true:使能L1缓存UB计算块
  • false:不使能L1缓存UB计算块

若要使能L1缓存UB计算块,必须在tiling实现中调用SetMatmulConfigParams接口配置相关信息。

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

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

Atlas 200/500 A2推理产品不支持该参数。

MDL

isDoubleCache

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

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

IBShare

IterateOrder

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

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

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

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

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

Atlas 200/500 A2推理产品不支持该参数。

Norm、MDL

ScheduleType

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

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

注:

  • singleCoreK>baseK的场景,不能使能ScheduleType::OUTER_PRODUCT取值,需使用默认模式
  • MDL模板仅在调用IterateAll计算的场景支持配置ScheduleType::OUTER_PRODUCT或1

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

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

Atlas 200/500 A2推理产品不支持该参数。

Norm、MDL

isBiasBatch

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

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

    Atlas A2训练系列产品/Atlas 800I A2推理产品支持设置为false。

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

    Atlas 200/500 A2推理产品不支持设置为false。

Norm

doBasicBlock

是否使能BasicBlock模板。模板参数取值如下:

  • true:使能BasicBlock模板
  • false:不使能BasicBlock模板

调用GetBasicConfig接口获取BasicBlock模板时,该参数被置为true。注意:

  • BasicBlock模板暂不支持输入为int8, int4数据类型的A、B矩阵,支持half/float/bfloat16_t数据类型的A、B矩阵。
  • BasicBlock模板暂不支持A矩阵的格式为标量数据Scalar或向量数据Vector。
  • BasicBlock模板暂不支持ScheduleType::OUTER_PRODUCT的数据搬运模式。

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

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

Atlas 200/500 A2推理产品不支持设置为true。

BasicBlock

basicM

相当于baseM

BasicBlock

basicN

相当于baseN

BasicBlock

basicK

相当于baseK

BasicBlock

doSpecialBasicBlock

使能SpecialBasicBlock模板。参数取值如下:

  • true:使能SpecialBasicBlock模板
  • false:不使能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的大小。

预留参数

表3 模板特性

模板

实现

优点

推荐使用场景

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地址相同

BasicBlock

在无尾块的场景,base块大小确定的情况下,通过GetBasicConfig接口配置输入的基本块大小,固定MTE1每次搬运的矩阵大小及MMAD每次计算的矩阵大小,减少参数计算量

减少MTE1矩阵搬运和MMAD矩阵计算过程中的参数计算开销

无尾块,base块(baseM,baseN)大小确定

表4 MatmulConfigMode参数说明

参数

说明

CONFIG_NORM

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

CONFIG_MDL

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

CONFIG_SPECIALMDL

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

CONFIG_IBSHARE

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

表5 MatmulShapeParams参数说明

参数

数据类型

说明

singleCoreM

uint32_t

单核内M轴shape大小,以元素为单位

singleCoreN

uint32_t

单核内N轴shape大小,以元素为单位

singleCoreK

uint32_t

单核内K轴shape大小,以元素为单位

basicM

uint32_t

相当于baseM

basicN

uint32_t

相当于baseN

basicK

uint32_t

相当于baseK

表6 MatmulQuantParams参数说明

参数

数据类型

说明

isPerTensor

bool

A矩阵half类型输入且B矩阵int8类型输入场景,使能B矩阵量化时是否为per tensor,true为per tensor,false为per channel。

hasAntiQuantOffset

bool

A矩阵half类型输入且B矩阵int8类型输入场景,使能B矩阵量化时是否使用offset系数。

表7 MatmulBatchParams参数说明

参数

数据类型

说明

batchLoop

bool

是否多Batch输入多Batch输出。参数取值如下:

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

仅对BatchMatmul有效。

bmmMode

BatchMode

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推理产品支持设置为false。

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

    Atlas 200/500 A2推理产品不支持设置为false。

表8 MatmulFuncParams参数说明

参数

数据类型

说明

intrinsicsLimit

bool

进行芯片指令搬运地址偏移量校验,影响性能。参数取值如下:

  • false:不进行芯片指令搬运地址偏移量校验(默认值)
  • true:进行芯片指令搬运地址偏移量校验

enVecND2NZ

bool

使能通过vector进行ND2NZ。参数取值如下:

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

使能时需要设置SetLocalWorkspace。

doMTE2Preload

uint32_t

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

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

注意,开启M/N预加载功能时需保证K全载,且M/N开启Double Buffer。

enableReuse

bool

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

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

enableUBReuse

bool

是否使能UB复用。参数取值如下:

  • true:使能UB复用
  • false:不使能UB复用

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

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

Atlas 200/500 A2推理产品不支持该参数。

enableL1CacheUB

bool

是否使能L1缓存UB计算块。参数取值如下:

  • true:使能L1缓存UB计算块
  • false:不使能L1缓存UB计算块

若要使能L1缓存UB计算块,必须在tiling实现中调用SetMatmulConfigParams接口配置相关信息。

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

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

Atlas 200/500 A2推理产品不支持该参数。

iterateOrder

IterateOrder

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

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

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

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

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

Atlas 200/500 A2推理产品不支持该参数。

scheduleType

ScheduleType

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

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

注:

  • singleCoreK>baseK的场景,不能使能ScheduleType::OUTER_PRODUCT取值,需使用默认模式
  • MDL模板仅在调用IterateAll计算的场景支持配置ScheduleType::OUTER_PRODUCT或1

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

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

Atlas 200/500 A2推理产品不支持该参数。

enableDoubleCache

bool

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

  • false:L1上同时缓存一块数据(默认值)
  • true:使能L1上同时缓存两块数据
表9 MatmulCallBackFunc回调函数接口及参数说明

回调函数功能

回调函数接口

参数说明

可自定义设置不同的搬出数据片段数目等参数,实现将Matmul计算结果从CO1搬出到GM的功能

void DataCopyOut(const __gm__ void *gm, const LocalTensor<int8_t> &co1Local, const void *dataCopyOutParams, const uint64_t tilingPtr, const uint64_t dataPtr)

gm:输出的GM地址

co1Local: CO1上的计算结果

dataCopyOutParams:

Matmul定义的

DataCopyOutParams结构体指针,供用户参考使用

struct DataCopyOutParams {

uint16_t cBurstNum; //传输数据片段数目

uint16_t burstLen; //连续传输数据片段长度

uint16_t srcStride;//源tensor相邻连续数据片段间隔

uint32_t dstStride; // 目的tensor相邻连续数据片段间隔

uint16_t oriNSize; // NZ转ND时,源tensorN方向大小

bool enUnitFlag; // 是否使能UnitFlag

uint64_t quantScalar; // 量化场景下量化Scalar的值

uint64_t cbufWorkspaceAddr; //量化场景下量化Tensor地址

}

tilingPtr: 用户使用SetUserDefInfo设置的tiling参数地址

dataPtr: 用户使用SetSelfDefineData设置的计算数据地址

可自定义左矩阵搬入首地址、搬运块位置、搬运块大小,实现左矩阵从GM搬入L1的功能

void CopyA1(const LocalTensor<int8_t> &aMatrix, const __gm__ void *gm, int row, int col, int useM, int useK, const uint64_t tilingPtr, const uint64_t dataPtr)

aMatrix: 目标L1Buffer地址

gm:左矩阵GM首地址

row、col:搬运块左上角坐标在左矩阵中的位置

useM、useK:搬运块M、K方向大小

tilingPtr: 用户使用SetUserDefInfo设置的tiling参数地址

dataPtr: 用户使用SetSelfDefineData设置的计算数据地址

可自定义右矩阵搬入首地址、搬运块位置、搬运块大小,实现右矩阵从GM搬入L1的功能

void CopyB1(const LocalTensor<int8_t> &bMatrix, const __gm__ void *gm, int row, int col, int useK, int useN, const uint64_t tilingPtr, const uint64_t dataPtr)

bMatrix: 目标L1Buffer地址

gm:右矩阵GM首地址

row、col:搬运块左上角坐标在右矩阵中的位置

useK、useN:搬运块K、N方向大小

tilingPtr: 用户使用SetUserDefInfo设置的tiling参数地址

dataPtr: 用户使用SetSelfDefineData设置的计算数据地址

表10 MatmulApiStaticTiling常量化Tiling参数说明

参数

数据类型

说明

M, N, Ka, Kb,

singleCoreM, singleCoreN, singleCoreK,

baseM, baseN, baseK,

depthA1, depthB1,

stepM, stepN,stepKa,stepKb,

isBias,

transLength,

iterateOrder,

dbL0A, dbL0B,

dbL0C,

shareMode,

shareL1Size,

shareL0CSize,

shareUbSize,

batchM,

batchN,

singleBatchM,

singleBatchN

int

TCubeTiling结构体中各同名参数含义一致。本结构体中的参数是常量化后的常数值。

cfg

MatmulConfig

Matmul模板的参数配置。

返回值

支持的型号

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

Atlas推理系列产品AI Core

Atlas 200/500 A2推理产品

注意事项

调用示例

//用户自定义回调函数
void DataCopyOut(const __gm__ void *gm, const LocalTensor<int8_t> &co1Local, const void *dataCopyOutParams, const uint64_t tilingPtr, const uint64_t dataPtr);
void CopyA1(const AscendC::LocalTensor<int8_t> &aMatrix, const __gm__ void *gm, int row, int col, int useM, int useK, const uint64_t tilingPtr, const uint64_t dataPtr);
void CopyB1(const AscendC::LocalTensor<int8_t> &bMatrix, const __gm__ void *gm, int row, int col, int useK, int useN, const uint64_t tilingPtr, const uint64_t dataPtr);

typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, half> aType; 
typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, half> bType; 
typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, float> cType; 
typedef matmul::MatmulType<AscendC::TPosition::GM, CubeFormat::ND, float> biasType; 
matmul::Matmul<aType, bType, cType, biasType, CFG_MDL> mm1; 
matmul::MatmulConfig mmConfig{false, true, false, 128, 128, 64};
mmConfig.enUnitFlag = false;
matmul::Matmul<aType, bType, cType, biasType, mmConfig> mm2;
matmul::Matmul<aType, bType, cType, biasType, CFG_NORM, matmul::MatmulCallBackFunc<DataCopyOut, CopyA1, CopyB1>> mm3;
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词