CANN开发套件包中提供了自定义算子工程生成工具msOpGen,可基于算子原型定义输出算子工程:包括算子host侧代码实现文件、算子kernel侧实现文件以及工程编译配置文件等。
使用msOpGen工具创建算子开发工程的步骤如下:
[
{
"op": "AddCustom",
"input_desc": [
{
"name": "x",
"param_type": "required",
"format": [
"ND",
"ND",
"ND"
],
"type": [
"float16",
"float",
"int32"
]
},
{
"name": "y",
"param_type": "required",
"format": [
"ND",
"ND",
"ND"
],
"type": [
"float16",
"float",
"int32"
]
}
],
"output_desc": [
{
"name": "z",
"param_type": "required",
"format": [
"ND",
"ND",
"ND"
],
"type": [
"float16",
"float",
"int32"
]
}
]
}
]
[
{
"op": "ReduceMaxCustom",
"input_desc": [
{
"name": "x",
"param_type": "required",
"format": ["ND"],
"type": ["float16"]
}
],
"output_desc": [
{
"name": "y",
"param_type": "required",
"format": ["ND"],
"type": ["float16"]
},
{
"name": "idx",
"param_type": "required",
"format": ["ND"],
"type": ["int32"]
}
],
"attr": [
{
"name": "reduceDim",
"param_type": "required",
"type": "int"
},
{
"name": "isKeepDim",
"param_type": "optional",
"type": "int",
"default_value": 1
}
]
}
]
原型定义json文件中的算子类型字段op需要采用大驼峰的命名方式,即采用大写字符区分不同的语义。
${INSTALL_DIR}/python/site-packages/bin/msopgen gen -i $HOME/sample/add_custom.json -c ai_core-<soc_version> -lan cpp -out $HOME/sample/AddCustom
AI处理器的型号<soc_version>请通过如下方式获取:
其中,id为设备id,通过npu-smi info -l命令查出的NPU ID即为设备id。
基于同系列的AI处理器型号创建的算子工程,其基础功能(基于该工程进行算子开发、编译和部署)通用。
AddCustom ├── build.sh // 编译入口脚本 ├── cmake // 算子工程编译所需脚本及公共编译文件存放目录 ├── CMakeLists.txt // 算子工程的CMakeLists.txt ├── CMakePresets.json // 编译配置项 ├── framework // AI框架适配时,算子插件实现文件目录 ├── op_host // host侧实现文件 │ ├── add_custom_tiling.h // 算子tiling定义文件 │ ├── add_custom.cpp // 算子原型注册、shape推导、信息库、tiling实现等内容文件 │ ├── CMakeLists.txt ├── op_kernel // kernel侧实现文件 │ ├── CMakeLists.txt │ ├── add_custom.cpp // 算子代码实现文件 └── scripts // 自定义算子工程打包相关脚本所在目录
工程目录中的op_kernel和op_host包含了算子的核心实现文件。op_kernel下存放kernel侧算子实现。op_host下存放host侧代码实现,包括算子原型定义、host侧tiling实现。其中kernel侧算子实现和host侧tiling实现在SIMD算子实现章节已经介绍了其核心的实现方法,在该章节会侧重于介绍接入CANN框架后的编程模式和API的使用。工程目录中的CMakePresets.json,用于开发者完成工程编译相关配置,之后即可进行编译部署。