CANN Ascend C Tiling模板参数定义
模板参数定义【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit功能说明通过以下函数原型进行模板参数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::vectoruint64_t vals; const char* macroType; ParamStruct(const char* inName, uint32_t inParamType, uint8_t inBitWidth, std::vectoruint64_t inVals, const char* inMacroType): name(inName), paramType(inParamType), bitWidth(inBitWidth), vals(std::move(inVals)), macroType(inMacroType) {} }; using TilingDeclareParams std::vectorParamStruct; using TilingSelectParams std::vectorstd::vectorParamStruct; // 模板参数定义相关接口 #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__ }参数说明表 1Tiling模板参数定义说明宏功能描述参数解释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_DECLASCENDC_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_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_E1M2ASCENDC_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_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_8ASCENDC_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取值范围01。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核比例为11ASCENDC_TPL_MIX_AIC_1_2 // AIC、AIV混合场景下算子执行时会同时启动AI Core上的Cube核和Vector核比例为12ASCENDC_TPL_AICORE // 算子执行时仅会启动AI CoreASCENDC_TPL_VECTORCORE // 该参数为预留参数当前版本暂不支持ASCENDC_TPL_MIX_AICORE // 该参数为预留参数当前版本暂不支持ASCENDC_TPL_MIX_VECTOR_CORE // 算子执行时会同时启动AI Core和Vector Core本接口只允许与ASCENDC_TPL_SHARED_KERNEL_TYPE_SEL(args0, ...)配合使用。表 2Tiling模板参数组合定义宏功能描述参数解释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核比例为11ASCENDC_TPL_MIX_AIC_1_2 // AIC、AIV混合场景下算子执行时会同时启动AI Core上的Cube核和Vector核比例为12ASCENDC_TPL_AICORE // 算子执行时仅会启动AI CoreASCENDC_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_MODE1, 同时会生成以_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_TILING_STRUCT_SEL(args0)用于为当前模板参数组合指定Tiling结构体该结构体不作为核函数模板参数传入。args0表示当前模板参数组合使用的Tiling结构体名。该接口只能在ASCENDC_TPL_ARGS_SEL(...)中使用不参与ASCENDC_TPL_SEL_PARAM(...)或GET_TPL_TILING_KEY(...)的参数顺序也不参与TilingKey编码。未配置本接口的模板参数组合将使用REGISTER_TILING_DEFAULT注册的默认Tiling结构体。使用本接口时必须通过REGISTER_TILING_DEFAULT提供默认Tiling结构体。ASCENDC_TPL_SHARED_KERNEL_TYPE_SEL(args0, ...)设置算子模板参数组合的Kernel类型该参数可以作为核函数的模板参数传入。args0: 参数名args1-argsn: 该模板参数组合下算子的Kernel类型后续参数为若干Kernel类型。该接口不能与ASCENDC_TPL_KERNEL_TYPE_SEL接口同时使用。若同时使用KERNEL_TASK_TYPE_DEFAULT(value)接口本接口优先级更高。返回值说明无。约束说明对模板参数定义的取值进行修改或新增后需要重新编译自定义算子包不能再继续使用之前的算子二进制。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考