---
title: 模板参数定义
description: "通过以下函数原型进行模板参数ASCENDC_TPL_ARGS_DECL和模板参数组合ASCENDC_TPL_ARGS_SEL（即可使用的模板）的定义。详细内容请参考Tiling模板编程(https://www.hiascend.comdocument/detail/zh/canncommercial/900/programug/Ascendcopdevg/atlas_ascendc_10_00025.html)。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendcopapi/atlasascendc_api_07_00011.html
sourcePath: /source/zh/canncommercial/900/API/ascendcopapi/atlasascendc_api_07_00011.html
indexId: 17cdc66b229e04d08e196bd0b874c8e8d1e2ae495ac46d5c6dfe62361c907a7877
---
# 模板参数定义

#### 功能说明

通过以下函数原型进行模板参数ASCENDC_TPL_ARGS_DECL和模板参数组合ASCENDC_TPL_ARGS_SEL（即可使用的模板）的定义。详细内容请参考Tiling模板编程(https://www.hiascend.comdocument/detail/zh/canncommercial/900/programug/Ascendcopdevg/atlas_ascendc_10_00025.html)。


#### 函数原型

```
// ParamStruct是存放用户设置的模板参数ASCENDC_TPL_ARGS_DECL和模板参数组合ASCENDC_TPL_ARGS_SEL的结构体，用作后续的Tilingkey与模板参数之间的编解码，用户无需关注
struct ParamStruct {
    const char* name;
    uint32_t paramType;
    uint8_t bitWidth;
    std::vector<uint64_t> vals;
    const char* macroType;
    ParamStruct(const char* inName, uint32_t inParamType, uint8_t inBitWidth, std::vector<uint64_t> inVals,
        const char* inMacroType):
        name(inName), paramType(inParamType), bitWidth(inBitWidth), vals(std::move(inVals)),
        macroType(inMacroType) {}
};
using TilingDeclareParams = std::vector<ParamStruct>;
using TilingSelectParams = std::vector<std::vector<ParamStruct>>;

// 模板参数定义相关接口
#define ASCENDC_TPL_DTYPE_DECL(x, ...) ParamStruct{#x, ASCENDC_TPL_DTYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "DECL"}
#define ASCENDC_TPL_DATATYPE_DECL(x, ...) ParamStruct{#x, ASCENDC_TPL_DTYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "DECL"}
#define ASCENDC_TPL_FORMAT_DECL(x, ...) ParamStruct{#x, ASCENDC_TPL_FORMAT, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "DECL"}
#define ASCENDC_TPL_UINT_DECL(x, bw, ...) ParamStruct{#x, ASCENDC_TPL_UINT, bw, {__VA_ARGS__}, "DECL"}
#define ASCENDC_TPL_BOOL_DECL(x, ...) ParamStruct{#x, ASCENDC_TPL_BOOL, ASCENDC_TPL_1_BW, {__VA_ARGS__}, "DECL"}
#define ASCENDC_TPL_KERNEL_TYPE_DECL(x, ...) ParamStruct{#x, ASCENDC_TPL_SHARED_KERNEL_TYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "DECL"}

#define ASCENDC_TPL_DTYPE_SEL(x, ...) ParamStruct{#x, ASCENDC_TPL_DTYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_DATATYPE_SEL(x, ...) ParamStruct{#x, ASCENDC_TPL_DTYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_FORMAT_SEL(x, ...) ParamStruct{#x, ASCENDC_TPL_FORMAT, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_UINT_SEL(x, ...) ParamStruct{#x, ASCENDC_TPL_UINT, 0, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_BOOL_SEL(x, ...) ParamStruct{#x, ASCENDC_TPL_BOOL, ASCENDC_TPL_1_BW, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_KERNEL_TYPE_SEL(...) ParamStruct{"kernel_type", ASCENDC_TPL_KERNEL_TYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_DETERMINISTIC_SEL(...) ParamStruct{"deterministic", ASCENDC_TPL_DETERMINISTIC, ASCENDC_TPL_1_BW, {__VA_ARGS__}, "SEL"}
#define ASCENDC_TPL_SHARED_KERNEL_TYPE_SEL(x, ...) ParamStruct{#x, ASCENDC_TPL_SHARED_KERNEL_TYPE, ASCENDC_TPL_8_BW, {__VA_ARGS__}, "SEL"}

#define ASCENDC_TPL_ARGS_DECL(x, ...) static TilingDeclareParams g_tilingDeclareParams{ __VA_ARGS__ }
#define ASCENDC_TPL_ARGS_SEL(...) { __VA_ARGS__}
#define ASCENDC_TPL_SEL(...) static TilingSelectParams g_tilingSelectParams{ __VA_ARGS__ }
```


#### 参数说明


**表1 Tiling模板参数定义说明**

| 宏 | 功能描述 | 参数解释 |
| --- | --- | --- |
| ASCENDC\_TPL\_ARGS\_DECL(args0, ...) | 用于定义算子的模板参数。 | args0：表示算子Optype。 args1\-argsn：后续为若干个DTYPE、FORMAT、UINT、BOOL、KERNEL\_TYPE的模板参数定义，分别通过ASCENDC\_TPL\_DTYPE\_DECL、ASCENDC\_TPL\_DATATYPE\_DECL、ASCENDC\_TPL\_FORMAT\_DECL、ASCENDC\_TPL\_UINT\_DECL、ASCENDC\_TPL\_BOOL\_DECL，ASCENDC\_TPL\_KERNEL\_TYPE\_DECL进行定义。 |
| ASCENDC\_TPL\_DTYPE\_DECL(args0, ...) | 自定义DataType类型的模板参数定义。 | args0：参数名。 args1\-argsn：后续若干个参数为穷举的自定义DataType枚举值。 |
| ASCENDC\_TPL\_DATATYPE\_DECL(args0, ...) | 原生DataType类型的模板参数定义。 | args0：参数名。 args1\-argsn：存在两种情况，后续若干个参数为穷举的原生DataType选项；或者为对应的输入参数的索引值（使用ASCENDC\_TPL\_INPUT(x)进行指定，其中x为对应数值）或对应输出参数的索引值（使用ASCENDC\_TPL\_OUTPUT(x)进行指定，其中x为对应数值），注意：存在多个时，仅第一个生效。 支持设置的原生DataType取值如下，数据类型的具体介绍请参考C\_DataType(https://www.hiascend.comdocument/detail/zh/canncommercial/900/maintenref/basicdataapi/atlasopapi\_07\_00719.html)。 C\_DT\_FLOAT C\_DT\_FLOAT16 C\_DT\_INT8 C\_DT\_INT32 C\_DT\_UINT8 C\_DT\_INT16 C\_DT\_UINT16 C\_DT\_UINT32 C\_DT\_INT64 C\_DT\_UINT64 C\_DT\_DOUBLE C\_DT\_BOOL C\_DT\_COMPLEX64 C\_DT\_BF16 C\_DT\_INT4 C\_DT\_UINT1 C\_DT\_INT2 C\_DT\_COMPLEX32 C\_DT\_HIFLOAT8 C\_DT\_FLOAT8\_E5M2 C\_DT\_FLOAT8\_E4M3FN C\_DT\_FLOAT4\_E2M1 C\_DT\_FLOAT4\_E1M2 |
| ASCENDC\_TPL\_FORMAT\_DECL(args0, ...) | 支持两种模式： 1. 均为自定义Format类型的模板参数定义。 2. 均为原生Format类型的模板参数定义。 | args0：参数名。 args1\-argsn：存在两种模式 1. 后续若干个参数为穷举的自定义Format枚举值。 2. 该模式存在两种情况：后续若干个参数为穷举的原生Format选项；或者对应的输入参数的索引值（使用ASCENDC\_TPL\_INPUT(x)进行指定，其中x为对应数值）或对应输出参数的索引值（使用ASCENDC\_TPL\_OUTPUT(x)进行指定，其中x为对应数值），注意：存在多个时，仅第一个生效。 支持设置的原生Format选项如下，数据格式的具体介绍请参考C\_Format(https://www.hiascend.comdocument/detail/zh/canncommercial/900/maintenref/basicdataapi/atlasopapi\_07\_00720.html)。 C\_FORMAT\_NCHW C\_FORMAT\_NHWC C\_FORMAT\_ND C\_FORMAT\_NC1HWC0 C\_FORMAT\_FRACTAL\_Z C\_FORMAT\_NC1C0HWPAD C\_FORMAT\_NHWC1C0 C\_FORMAT\_FSR\_NCHW C\_FORMAT\_FRACTAL\_DECONV C\_FORMAT\_C1HWNC0 C\_FORMAT\_FRACTAL\_DECONV\_TRANSPOSE C\_FORMAT\_FRACTAL\_DECONV\_SP\_STRIDE\_TRANS C\_FORMAT\_NC1HWC0\_C04 C\_FORMAT\_FRACTAL\_Z\_C04 C\_FORMAT\_CHWN C\_FORMAT\_FRACTAL\_DECONV\_SP\_STRIDE8\_TRANS C\_FORMAT\_HWCN C\_FORMAT\_NC1KHKWHWC0 C\_FORMAT\_BN\_WEIGHT C\_FORMAT\_FILTER\_HWCK C\_FORMAT\_HASHTABLE\_LOOKUP\_LOOKUPS C\_FORMAT\_HASHTABLE\_LOOKUP\_KEYS C\_FORMAT\_HASHTABLE\_LOOKUP\_VALUE C\_FORMAT\_HASHTABLE\_LOOKUP\_OUTPUT C\_FORMAT\_HASHTABLE\_LOOKUP\_HITS C\_FORMAT\_C1HWNCoC0 C\_FORMAT\_MD C\_FORMAT\_NDHWC C\_FORMAT\_FRACTAL\_ZZ C\_FORMAT\_FRACTAL\_NZ C\_FORMAT\_NCDHW C\_FORMAT\_DHWCN C\_FORMAT\_NDC1HWC0 C\_FORMAT\_FRACTAL\_Z\_3D C\_FORMAT\_CN C\_FORMAT\_NC C\_FORMAT\_DHWNC C\_FORMAT\_FRACTAL\_Z\_3D\_TRANSPOSE C\_FORMAT\_FRACTAL\_ZN\_LSTM C\_FORMAT\_FRACTAL\_Z\_G C\_FORMAT\_RESERVED C\_FORMAT\_ALL C\_FORMAT\_NULL C\_FORMAT\_ND\_RNN\_BIAS C\_FORMAT\_FRACTAL\_ZN\_RNN C\_FORMAT\_NYUV C\_FORMAT\_NYUV\_A C\_FORMAT\_NCL C\_FORMAT\_FRACTAL\_Z\_WINO C\_FORMAT\_C1HWC0 C\_FORMAT\_FRACTAL\_NZ\_C0\_16 C\_FORMAT\_FRACTAL\_NZ\_C0\_32 C\_FORMAT\_FRACTAL\_NZ\_C0\_2 C\_FORMAT\_FRACTAL\_NZ\_C0\_4 C\_FORMAT\_FRACTAL\_NZ\_C0\_8 |
| ASCENDC\_TPL\_UINT\_DECL(args0, args1, args2, ...) | 自定义UINT类型（无符号整形）的模板参数定义。 | args0：参数名。 args1：最大位宽，模板参数的个数不能超过最大位宽。 args2：参数定义的模式。支持以下三种模式： ASCENDC\_TPL\_UI\_RANGE：范围模式，设置该模式，后续紧跟着第一个值表示范围个数，第一个值后面的每两个数值为一组分别表示该范围的起、终位置；注意定义的范围个数要和后续的组数保持一致。 举例：ASCENDC\_TPL\_UINT\_DECL(args0, args1,ASCENDC\_TPL\_UI\_RANGE,2,0,2,3,5)表示2组参数，这2组参数范围为{0, 2}，{3, 5}，因此该参数定义的UINT参数合法值为{0, 1, 2, 3, 4, 5}。 ASCENDC\_TPL\_UI\_LIST：穷举模式，设置该模式，则表示后续将穷举出所有的参数值。 举例：ASCENDC\_TPL\_UINT\_DECL(args0, args1,ASCENDC\_TPL\_UI\_LIST,10,12,13,9,8,7,6)表示1组穷举参数，[10, 12, 13, 9, 8, 7, 6]为穷举值，因此该参数定义的UINT参数合法值为{10, 12, 13, 9, 8, 7, 6}。 ASCENDC\_TPL\_UI\_MIX：混合模式，设置该模式，则表示前n个数值为范围模式的参数定义，后m个数值为穷举模式的参数定义。 举例： ASCENDC\_TPL\_UINT\_DECL(args0, args1,ASCENDC\_TPL\_UI\_MIX,2,0,2,3, 5, 10, 12, 13, 9, 8)表示2组穷举参数，这2组范围为{0, 2}, {3, 5}，[10, 12, 13, 9, 8]为穷举值，因此该参数定义的UINT参数合法值为{0, 1, 2, 3, 4, 5, 10, 12, 13, 9, 8}。 args3\-argsn：对应不同范围模式的参数数值。 |
| ASCENDC\_TPL\_BOOL\_DECL(args0, ...) | 自定义bool类型的模板参数定义。 | args0：参数名。 args1\-args2：取值范围0，1。 |
| ASCENDC\_TPL\_KERNEL\_TYPE\_DECL(args0, ...) | 定义算子模板参数的kernel类型 | args0：参数名 args1\-argsn：后续为若干kernel类型。 当前支持的Kernel类型如下： ASCENDC\_TPL\_AIV\_ONLY // 算子执行时仅启动AI Core上的Vector核 ASCENDC\_TPL\_AIC\_ONLY // 算子执行时仅启动AI Core上的Cube核 ASCENDC\_TPL\_MIX\_AIV\_1\_0 // AIC、AIV混合场景下，算子执行时仅会启动AI Core上的Vector核 ASCENDC\_TPL\_MIX\_AIC\_1\_0 // AIC、AIV混合场景下，算子执行时仅会启动AI Core上的Cube核 ASCENDC\_TPL\_MIX\_AIC\_1\_1 // AIC、AIV混合场景下，算子执行时会同时启动AI Core上的Cube核和Vector核，比例为1：1 ASCENDC\_TPL\_MIX\_AIC\_1\_2 // AIC、AIV混合场景下，算子执行时会同时启动AI Core上的Cube核和Vector核，比例为1：2 ASCENDC\_TPL\_AICORE // 算子执行时仅会启动AI Core ASCENDC\_TPL\_VECTORCORE // 该参数为预留参数，当前版本暂不支持 ASCENDC\_TPL\_MIX\_AICORE // 该参数为预留参数，当前版本暂不支持 ASCENDC\_TPL\_MIX\_VECTOR\_CORE // 算子执行时会同时启动AI Core和Vector Core 本接口只允许与ASCENDC\_TPL\_SHARED\_KERNEL\_TYPE\_SEL(args0, ...)配合使用。 |


**表2 Tiling模板参数组合定义**

| 宏 | 功能描述 | 参数解释 |
| --- | --- | --- |
| ASCENDC\_TPL\_SEL(...) | 算子的模板参数整体组合。 | 包含多个算子的模板参数组合。 |
| ASCENDC\_TPL\_ARGS\_SEL(...) | 算子的模板参数组合。 | 一个算子的模板参数组合。 |
| ASCENDC\_TPL\_KERNEL\_TYPE\_SEL(args0) | 用于设置算子模板参数组合的Kernel类型，但该参数并不能作为核函数的模板参数传入。 | args0：该模板参数组合下，算子的Kernel类型。如不选择将走自动推导流程，ASCENDC\_TPL\_SEL下的所有算子对于是否选择Kernel类型需要保持一致。 当前支持的Kernel类型如下： ASCENDC\_TPL\_AIV\_ONLY // 算子执行时仅启动AI Core上的Vector核 ASCENDC\_TPL\_AIC\_ONLY // 算子执行时仅启动AI Core上的Cube核 ASCENDC\_TPL\_MIX\_AIV\_1\_0 // AIC、AIV混合场景下，算子执行时仅会启动AI Core上的Vector核 ASCENDC\_TPL\_MIX\_AIC\_1\_0 // AIC、AIV混合场景下，算子执行时仅会启动AI Core上的Cube核 ASCENDC\_TPL\_MIX\_AIC\_1\_1 // AIC、AIV混合场景下，算子执行时会同时启动AI Core上的Cube核和Vector核，比例为1：1 ASCENDC\_TPL\_MIX\_AIC\_1\_2 // AIC、AIV混合场景下，算子执行时会同时启动AI Core上的Cube核和Vector核，比例为1：2 ASCENDC\_TPL\_AICORE // 算子执行时仅会启动AI Core ASCENDC\_TPL\_VECTORCORE // 该参数为预留参数，当前版本暂不支持 ASCENDC\_TPL\_MIX\_AICORE // 该参数为预留参数，当前版本暂不支持 ASCENDC\_TPL\_MIX\_VECTOR\_CORE // 算子执行时会同时启动AI Core和Vector Core 通过本接口配置Kernel类型，Kernel类型的取值范围同KERNEL\_TASK\_TYPE\_DEFAULT接口一致，详见设置Kernel类型。 |
| ASCENDC\_TPL\_DTYPE\_SEL(args0, ...) | 自定义DataType类型的模板参数组合。 | args0：表示参数名。 args1\-argsn ：后续若干个参数为ASCENDC\_TPL\_DTYPE\_DECL中定义的参数范围子集。 |
| ASCENDC\_TPL\_DATATYPE\_SEL(args0, ...) | 原生DataType类型的模板参数组合 | args0：表示参数名。 args1\-argsn ：后续若干个参数为ASCENDC\_TPL\_DATATYPE\_DECL中定义的参数选项范围的子集。 |
| ASCENDC\_TPL\_FORMAT\_SEL(args0, ...) | Format类型的模板参数组合。 | args0：表示参数名。 args1\-argsn：后续若干个参数为ASCENDC\_TPL\_FORMAT\_DECL中定义的参数选项范围子集。 |
| ASCENDC\_TPL\_UINT\_SEL(args0, args1, args2, ...) | UINT类型的模板参数组合。 | args0：表示参数名。 args1：参数定义的模式。支持如下取值： ASCENDC\_TPL\_UI\_RANGE：范围模式。 ASCENDC\_TPL\_UI\_LIST：穷举模式。 ASCENDC\_TPL\_UI\_MIX：混合模式。 args2\-argsn：后续若干个参数为ASCENDC\_TPL\_UINT\_DECL中定义的参数范围子集。 模式和参数的配置方式参考ASCENDC\_TPL\_UINT\_DECL(args0, args1, args2, ...)。 |
| ASCENDC\_TPL\_BOOL\_SEL(args0, ...) | bool类型的模板参数组合。 | args0：表示参数名。 args1\-args2 ：后续若干个参数为ASCENDC\_TPL\_BOOL\_DECL定义的参数范围子集。 |
| ASCENDC\_TPL\_DETERMINISTIC\_SEL(args0) | 该组模板参数组合用于配置是否使能确定性计算。 | args0: 表示参数名， 可选值范围[true, false, 1, 0]，其中[true/1]表示该组模板参数组合使能确定性计算，[false/0]表示不使能确定性计算。需要注意，该值不作为算子的模板参数入参，在使能该值编译时，会添加"\-DDETERMINISTIC\_MODE=1", 同时会生成以"\_deterministic"结尾的json与.o文件，例如："AddCustomTemplate\_816f04e052850554f4b3cacb35f8e8c6\_deterministic.json"/"AddCustomTemplate\_816f04e052850554f4b3cacb35f8e8c6\_deterministic.o"。 备注：若通过ASCENDC\_TPL\_DETERMINISTIC\_SEL(true)接口编译出了确定性计算的版本，在算子调用时，通常需要打开确定性计算的的开关，例如通过aclnn单算子调用时，需要使用aclrtCtxSetSysParamOpt接口进行相关配置。 该参数仅支持如下型号： Atlas A3 训练系列产品 / Atlas A3 推理系列产品 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 |
| ASCENDC\_TPL\_SHARED\_KERNEL\_TYPE\_SEL(args0, ...) | 设置算子模板参数组合的Kernel类型，该参数可以作为核函数的模板参数传入。 | args0: 参数名 args1\-argsn: 该模板参数组合下，算子的Kernel类型，后续参数为若干Kernel类型。该接口不能与ASCENDC\_TPL\_KERNEL\_TYPE\_SEL接口同时使用。 若同时使用KERNEL\_TASK\_TYPE\_DEFAULT(value)接口，本接口优先级更高。 |


#### 返回值说明

无。


#### 约束说明

对模板参数定义的取值进行修改或新增后，需要重新编译自定义算子包，不能再继续使用之前的算子二进制。
