模板参数定义
功能说明
通过以下函数原型进行模板参数ASCENDC_TPL_ARGS_DECL和模板参数组合ASCENDC_TPL_ARGS_SEL(即可使用的模板)的定义。详细内容请参考Tiling模板编程。
函数原型
// 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_TILING_STRUCT_SEL(x, ...)
#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模板参数定义说明
表2 Tiling模板参数组合定义
args0:该模板参数组合下,算子的Kernel类型。如不选择将走自动推导流程,ASCENDC_TPL_SEL下的所有算子对于是否选择Kernel类型需要保持一致。
|
||
|
||
|
||
|
||
模式和参数的配置方式参考ASCENDC_TPL_UINT_DECL(args0, args1, args2, ...)。 |
||
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接口进行相关配置。 |
||
args0:表示当前模板参数组合使用的Tiling结构体名。该接口只能在ASCENDC_TPL_ARGS_SEL(...)中使用,不参与ASCENDC_TPL_SEL_PARAM(...)或GET_TPL_TILING_KEY(...)的参数顺序,也不参与TilingKey编码。 未配置本接口的模板参数组合,将使用REGISTER_TILING_DEFAULT注册的默认Tiling结构体。使用本接口时,必须通过REGISTER_TILING_DEFAULT提供默认Tiling结构体。 |
||
|
args1-argsn: 该模板参数组合下,算子的Kernel类型,后续参数为若干Kernel类型。该接口不能与ASCENDC_TPL_KERNEL_TYPE_SEL接口同时使用。 |
返回值说明
无。
约束说明
对模板参数定义的取值进行修改或新增后,需要重新编译自定义算子包,不能再继续使用之前的算子二进制。