开发者
资源
[object Object]

使用msOpGen工具创建算子工程时,相关编译脚本被固化在本地,若需使用算子工程提供的新特性(比如支持MC2算子等),需重新运行msOpGen工具生成工程。为了解决开发者因功能更新而频繁重建工程的问题,将算子工程的cmake脚本打包到CANN软件包中。开发者可通过find_package的形式来查找对应的cmake modules包,从而使用算子工程对外提供的cmake函数接口。

该开发方式下,开发者参考如下工程目录,自行组织算子工程。目录结构与通过msOpGen生成的目录结构类似, 但无需再创建cmake与scripts目录,这些目录被打包至CANN软件包中。以AddCustom算子为例,目录结构如下:

[object Object]
[object Object]
  • 算子工程顶层CMakeLists.txt

    1. 使用find_package找到对应的编译库。
    2. 使用npu_op_package设置算子工程的编译产物形态,支持RUN/SHARED/STATIC, 分别对应算子run包形式、算子动态库形式与算子静态库形式,同时,该接口还可配置package(即编译产物)的内容和package的安装位置。
    3. 添加需要进行编译的子目录。
    [object Object]
  • Host侧CMakeLists.txt

    1. 使用npu_op_code_gen生成aclnn单算子调用代码、入图所需的原型定义代码等。
    2. 单算子调用场景,使用npu_op_library编译aclnn单算子调用库。
    3. 算子入图场景,使用npu_op_library编译算子入图所需的算子原型库。
    4. 使用npu_op_library编译Tiling相关库。
    5. 使用npu_op_package_add添加上述Host侧库至对应package中。
    [object Object]
  • Kernel侧CMakeLists.txt

    1. 使用npu_op_kernel_options添加算子编译选项。支持的编译选项可参考

    2. 使用npu_op_kernel_sources指定算子特定目录与编译源文件。

      • 若算子的源码文件没有平铺在SRC_BASE目录(通过npu_op_kernel_library设置)下,可以通过KERNEL_DIR指定特定目录。
      • 若算子的Kernel实现cpp文件需要自定义命名,需同时指定OP_TYPE(算子类型)和KERNEL_FILE(Kernel实现cpp文件名),以配置两者之间的对应关系。不配置时,Kernel实现cpp文件名和OpType之间需满足
    3. 使用npu_op_kernel_library编译Kernel库。

    4. 使用npu_op_package_add添加上述Kernel侧库到对应package中。

    [object Object]
[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]
[object Object]

package的类型配置为RUN时,可参考如下编译命令进行编译,使用cmake的pack能力生成run包。

[object Object]

package的类型配置为SHARED或STATIC时,可参考如下编译命令进行编译:

[object Object]
[object Object]

提供如下cmake函数供开发者使用:

[object Object][object Object]

[object Object]
  1. [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包。
  2. [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参数互斥,即只能选择其中一个进行配置。

  3. [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>:必选,设置参与编译的源文件。

  4. [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目标。
  5. [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...: 必选,传递给编译器的编译选项。

  6. [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之间需满足

  7. [object Object][object Object]npu_op_device_tiling_library

    创建Device侧Tiling库。使用该选项时,package的类型仅支持配置为RUN(run包模式)。

    [object Object]

    参数说明如下:

    • <target_name>:必选,目标的名称。
    • <type>:必选,指定Tiling产物的类型。支持取值为SHARED、STATIC。
    • <files>:必选,指定Tiling源码文件。
  8. [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处理器型号对应的算子。