使用msOpGen工具创建算子工程时,相关编译脚本被固化在本地,若需使用算子工程提供的新特性(比如支持MC2算子等),需重新运行msOpGen工具生成工程。为了解决开发者因功能更新而频繁重建工程的问题,将算子工程的cmake脚本打包到CANN软件包中。开发者可通过find_package的形式来查找对应的cmake modules包,从而使用算子工程对外提供的cmake函数接口。
该开发方式下,开发者参考如下工程目录,自行组织算子工程。目录结构与通过msOpGen生成的目录结构类似, 但无需再创建cmake与scripts目录,这些目录被打包至CANN软件包中。以AddCustom算子为例,目录结构如下:
算子工程顶层CMakeLists.txt
- 使用find_package找到对应的编译库。
- 使用npu_op_package设置算子工程的编译产物形态,支持RUN/SHARED/STATIC, 分别对应算子run包形式、算子动态库形式与算子静态库形式,同时,该接口还可配置package(即编译产物)的内容和package的安装位置。
- 添加需要进行编译的子目录。
[object Object]Host侧CMakeLists.txt
- 使用npu_op_code_gen生成aclnn单算子调用代码、入图所需的原型定义代码等。
- 单算子调用场景,使用npu_op_library编译aclnn单算子调用库。
- 算子入图场景,使用npu_op_library编译算子入图所需的算子原型库。
- 使用npu_op_library编译Tiling相关库。
- 使用npu_op_package_add添加上述Host侧库至对应package中。
[object Object]Kernel侧CMakeLists.txt
使用npu_op_kernel_sources指定算子特定目录与编译源文件。
使用npu_op_kernel_library编译Kernel库。
使用npu_op_package_add添加上述Kernel侧库到对应package中。
[object Object]
下表列出了供用户配置和使用的编译环境选项:
[object Object]
表 1 编译环境选项
[object Object][object Object]
[object Object]上述编译环境选项可通过两种方式进行配置:
支持直接通过set命令进行设置。
[object Object]通过CMakePresets.json进行设置,若通过该方式设置,则需要安装3.19及以上的cmake。
[object Object]然后使用如下命令进行构建,根据--preset指定的preset进行编译。
[object Object]
package的类型配置为RUN时,可参考如下编译命令进行编译,使用cmake的pack能力生成run包。
package的类型配置为SHARED或STATIC时,可参考如下编译命令进行编译:
提供如下cmake函数供开发者使用:
[object Object][object Object]
[object Object][object Object][object Object]npu_op_package
创建一个package。
[object Object]参数说明如下:
- <package_name>:必选,package的名称。
- TYPE <type>:必选,package的类型,取值为RUN、SHARED、STATIC。分别对应算子run包形式、算子动态库形式与算子静态库形式。
- [CONFIG]:可选,用于配置package的内容和安装位置。
- [ENABLE_SOURCE_PKG <value>]:可选,是否将源码打包到package中,默认为True。
- [ENABLE_BINARY_PACKAGE <value>] :可选,是否将二进制文件打包到package中,默认为True。
- [INSTALL_PATH <path>]:可选,指定包的安装路径,默认为CMAKE_BINARY_DIR。
- [ENABLE_CPACK <value>] :可选,是否打包,默认为True。对于用户需要定制打包的场景,可以设置为False,配置为False的情况下直接在<path>路径下生成编译产物,不会打包为run包。
[object Object][object Object]npu_op_package_add
将目标或文件添加到package中。
[object Object]参数说明如下:
<package_name>:必选,package的名称。
LIBRARY:必选,指定需要添加到package中的目标名称。
- <target_name1> [<target_name2>...]:必选,目标名称列表。
FILES:必选,指定需要添加到package中的文件名称。
- <file_name1> [<file_name2>...]:必选,文件名称列表。
[TYPE <target_type>]:可选,指定文件类型,将文件安装到对应的目录中,取值为ACLNN、GRAPH。配置为ACLNN,会将文件打包至run包目录下aclnn单算子调用头文件所在目录,配置为GRAPH,会将文件打包至run包目录下入图原型定义头文件目录下。
[PACKAGE_PATH <pkg_path>]:可选,指定文件在包中的相对路径位置。TYPE和PACKAGE_PATH参数互斥,即只能选择其中一个进行配置。
[object Object][object Object]npu_op_library
创建Host侧库。
[object Object]参数说明如下:
<library_name>:必选,Host侧库的名称。
TYPE <library_type>:必选,Host库的类型,可选值为TILING、ACLNN、GRAPH、TF_PLUGIN。
- TILING,Tiling相关库。
- ACLNN,aclnn单算子调用库。
- GRAPH,算子入图所需的算子原型库。
- TF_PLUGIN,TensorFlow框架适配相关库。
<files>:必选,设置参与编译的源文件。
[object Object][object Object]npu_op_kernel_library
创建Kernel侧库。
[object Object]参数说明如下:
- <target_name>:必选,目标的名称。
- SRC_BASE <path>:必选,指定Kernel源码的base目录,要求配置绝对路径。比如示例中的op_kernel目录的绝对路径。
- TILING_LIBRARY <tiling_target>:必选,指定依赖的Tiling目标。
[object Object][object Object]npu_op_kernel_options
添加Kernel目标编译选项。
[object Object]参数说明如下:
<target_name>:必选,目标的名称。
<op_type>:必选,定义配置生效的范围,取值为ALL、OP_TYPE。ALL表示对所有算子生效,OP_TYPE表示对特定算子生效。
[COMPUTE_UNIT <soc_version>]:可选,用于设置算子在具体AI处理器型号上的编译选项,不填写该选项时默认对所有型号生效。
[object Object]
OPTION...: 必选,传递给编译器的编译选项。
[object Object][object Object]npu_op_kernel_sources
描述Kernel目标的源码信息,包括设置算子的Kernel实现文件和源码路径等。
[object Object]参数说明如下:
<target_name>:必选,目标的名称。
[OP_TYPE <op_type>]:可选,算子类型,必须与KERNEL_FILE同时存在。
[KERNEL_DIR <path>]:可选,指定Kernel源码相对于SRC_BASE的相对路径。
若算子的源码文件没有平铺在SRC_BASE目录(通过npu_op_kernel_library设置)下,可以通过KERNEL_DIR指定特定目录。
[COMPUTE_UNIT <soc_version>] :可选,设置KERNEL_FILE在<soc_version>型号生效。默认KERNEL_FILE对所有型号生效。
[KERNEL_FILE <file>]:可选,指定算子入口的Kernel实现文件名。
若算子的Kernel实现cpp文件需要自定义命名,需同时指定OP_TYPE(算子类型)和KERNEL_FILE(Kernel实现cpp文件名),以配置两者之间的对应关系。不配置时,Kernel实现cpp文件名和OpType之间需满足。
[object Object][object Object]npu_op_device_tiling_library
创建Device侧Tiling库。使用该选项时,package的类型仅支持配置为RUN(run包模式)。
[object Object]参数说明如下:
- <target_name>:必选,目标的名称。
- <type>:必选,指定Tiling产物的类型。支持取值为SHARED、STATIC。
- <files>:必选,指定Tiling源码文件。
[object Object][object Object]npu_op_code_gen
执行代码生成过程,生成aclnn单算子调用代码和入图所需的原型定义代码。
[object Object]参数说明如下:
- SRC <src_files>:必选,参与代码生成的源文件范围。
- OUT_DIR <output_dir>:必选,生成代码的输出路径。
- PACKAGE <pkg_name>:必选,指定生成代码的package名称。
- [COMPILE_OPTIONS ...]:可选,自定义编译过程中的编译选项。
- [JOIN_OP_DEF ...]:可选,默认为False。设置为False,编译CMakePreset.json中设置的AI处理器型号对应的算子;设置成True,则编译CMakePreset.json和算子原型注册中共有的AI处理器型号对应的算子。