# Matmul模板参数

## 功能说明

创建Matmul对象时需要传入：

* A、B、C、Bias的参数类型信息，类型信息通过MatmulType来定义，包括：内存逻辑位置、数据格式、数据类型、是否转置、数据排布和是否使能L1复用。

* MatmulConfig信息（可选），用于配置Matmul模板信息以及相关的配置参数。不配置默认使能Norm模板。

  针对Kirin9020系列处理器、Kirin9030系列处理器，当前只支持使能默认的MDL模板。
* MatmulCallBack回调函数信息（可选），用于配置左右矩阵从GM拷贝到L1、计算结果从CO1拷贝到GM的自定义函数。

* MatmulPolicy信息（可选），预留参数。

## 实现原理

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

**图1** Matmul算法框图

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/2/v3/35swc_EpQiKrWCUuwCWH4A/zh-cn_image_0000002717772136.png?HW-CC-KV=V1&HW-CC-Date=20260909T172949Z&HW-CC-Expire=31536000000&HW-CC-Sign=77432ED89957235CCF81E262675FF06A81437A624A43DE37AD283A964311F961)

计算过程分为如下几步：

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的计算。

## 函数原型

```cpp
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类型信息通过[使用说明](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-matmul-usage-description)表1来定义。

* MatmulConfig（可选），参数说明见表2。

  * 该参数可选取提供的模板默认值之一，当前提供的MatmulConfig模板取值范围为[CFG_NORM、CFG_MDL、CFG_IBSHARE_NORM、MM_CFG_BB]，分别对应默认的Norm、MDL、IBShare、BasicBlock模板。各模板的介绍请参考表3。
  * 该参数可以通过MatmulConfig章节中介绍的获取模板的接口，自定义模板参数配置。
  * 另外，MatmulConfig可拆分为表5、表6、表7、表8二级子Config，使用GetMMConfig接口，设置需要的二级子Config和表4，可以更加灵活的获取自定义的模板参数配置MatmulConfig。
* MM_CB（可选），用于支持不同的搬入搬出需求，实现定制化的搬入搬出功能，如非连续搬入或针对搬出设置不同的数据片段间隔等。MM_CB中3个函数指针分别对应计算结果从CO1拷贝到GM、左矩阵从GM拷贝到L1、右矩阵从GM拷贝到L1的回调函数指针，各个功能回调函数接口定义及参数释义见表9。

* MATMUL_POLICY_DEFAULT_OF(MatmulPolicy)（可选），当前为预留参数，无须配置。

  ```cpp
  #define MATMUL_POLICY_DEFAULT_OF(DEFAULT)      \
  template <const auto& = MM_CFG, typename ...> class MATMUL_POLICY = DEFAULT
  ```

## 参数说明

**表1** MatmulType参数说明

|参数|说明|
|:---------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|POSITION|内存逻辑位置 Kirin9020系列处理器、Kirin9030系列处理器： - A矩阵可设置为TPosition::GM，TPosition::TSCM。 - B矩阵可设置为TPosition::GM，TPosition::TSCM。 - C矩阵可设置为TPosition::GM。|
|CubeFormat|Kirin9020系列处理器、Kirin9030系列处理器： - A矩阵在GM时，支持CubeFormat::ND。 - A矩阵在TSCM时，支持CubeFormat::NZ/CubeFormat::VECTOR。 - B矩阵在GM时，支持CubeFormat::ND/CubeFormat::NZ。 - B矩阵在TSCM时支持CubeFormat::NZ。 - C矩阵在GM时，支持CubeFormat::ND。|
|TYPE|Kirin9020系列处理器、Kirin9030系列处理器： - A矩阵可设置为half。 - B矩阵可设置为half。 - C矩阵可设置为half。|
|ISTRANS|是否开启使能矩阵转置的功能。当前不支持转置，只支持设为false。 false为不开启使能矩阵转置的功能，通过[SetTensorA](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-settensora)和[SetTensorB](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-settensorb)不能设置A、B矩阵是否转置。Matmul会认为A矩阵形状为[M, K]，B矩阵形状为[K, N]。 默认为false不使能转置。|
|LAYOUT|表征数据的排布。 NONE：默认值，表示不使用BatchMatmul，其他选项表示使用BatchMatmul。|

**表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。|所有模板|
|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复用|MDL|
|enableL1CacheUB|是否使能L1缓存UB计算块。参数取值如下。 - true：使能L1缓存UB计算块 - false：不使能L1缓存UB计算块 若要使能L1缓存UB计算块，必须在tiling实现中调用SetMatmulConfigParams接口配置相关信息。|MDL|
|isDoubleCache|开启IBShare模板后，在L1上是否同时缓存两块数据。注意，需要控制base块大小，防止两块缓存超过L1大小限制。参数取值如下。 - false：L1上同时缓存一块数据（默认值） - true：使能L1上同时缓存两块数据|IBShare|
|IterateOrder|Matmul做矩阵运算的循环迭代顺序，与[TCubeTiling结构体](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-tcubetiling-structure)表1中的iterateOrder参数含义相同。当ScheduleType参数取值为ScheduleType::OUTER_PRODUCT或1时，本参数生效。参数取值如下。 - ORDER_M = 0, // 先往M轴方向偏移再往N轴方向偏移 - ORDER_N, // 先往N轴方向偏移再往M轴方向偏移 - UNDEF, // 当前无效 **说明：** MDL模板使用时，若IterateOrder取值ORDER_M，[TCubeTiling结构体](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-tcubetiling-structure)表1中的stepN需要大于1，IterateOrder取值ORDER_N时，TCubeTiling结构中的stepM需要大于1。|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。|Norm、MDL|
|isBiasBatch|批量多Batch的Matmul场景，即BatchMatmul场景，Bias的大小是否带有Batch轴。参数取值如下。 - true：Bias带有Batch轴，Bias大小为Batch * N（默认值）。 - false：Bias不带Batch轴，Bias大小为N，多Batch计算Matmul时，会复用Bias。|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的数据搬运模式。|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系数，true为使用offset系数，false为不使用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。|

**表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复用|
|enableL1CacheUB|bool|是否使能L1缓存UB计算块。参数取值如下。 - true：使能L1缓存UB计算块 - false：不使能L1缓存UB计算块 若要使能L1缓存UB计算块，必须在tiling实现中调用SetMatmulConfigParams接口配置相关信息。|
|iterateOrder|IterateOrder|Matmul做矩阵运算的循环迭代顺序，与[TCubeTiling结构体](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-tcubetiling-structure)表1中的iterateOrder参数含义相同。当ScheduleType参数取值为ScheduleType::OUTER_PRODUCT或1时，本参数生效。参数取值如下。 - ORDER_M = 0, // 先往M轴方向偏移再往N轴方向偏移 - ORDER_N, // 先往N轴方向偏移再往M轴方向偏移 - UNDEF, // 当前无效 **说明：** MDL模板使用时，若IterateOrder取值ORDER_M，[TCubeTiling结构体](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-tcubetiling-structure)表1中的stepN需要大于1，IterateOrder取值ORDER_N时，TCubeTiling结构中的stepM需要大于1。|
|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。|
|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结构体指针，供开发者参考使用。 - uint16_t cBurstNum：传输数据片段数目 - uint16_t burstLen：连续传输数据片段长度 - int16_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|[参数说明](#参数说明)下的表2|Matmul模板的参数配置。|

## 返回值

无

## 支持的型号

Kirin9020系列处理器

Kirin9030系列处理器

KirinX90系列处理器

## 注意事项

无

## 调用示例

```cpp
// 开发者自定义回调函数
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;
```

