开发者
资源
[object Object]

本章节介绍的简易自定义算子工程,是上文中介绍的自定义算子工程的简化版,对算子的编译、打包、部署过程进行简化,便于开发者将该工程集成到自己的算子工程。

[object Object]

基于简易自定义算子工程的算子开发流程图如下:

[object Object]

类似,简易自定义算子工程通过msOpGen生成,基于算子原型定义输出算子工程,包括算子host侧代码实现文件算子kernel侧实现文件以及工程编译配置文件等。主要差异点在于:创建简易算子工程需要通过-f参数配置framework框架为aclnn。

使用msOpGen工具创建简易算子开发工程的步骤如下:

  1. 编写算子的原型定义json文件,用于生成算子开发工程。

    例如,AddCustom算子的json文件命名为add_custom.json,文件内容如下:

    [object Object]
  2. 使用msOpGen工具生成算子的开发工程。以生成AddCustom的算子工程为例,下文仅针对关键参数进行解释,详细参数说明请参见

    [object Object]
    • ${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际环境进行替换。

    • -i:指定算子原型定义文件_add_custom_.json所在路径,请根据实际情况修改。

    • -c:[object Object]代表算子在AI Core上执行,[object Object]为昇腾AI处理器的型号。

    • -lan:参数cpp代表算子基于Ascend C编程框架,使用C/C++编程语言开发。

    • -out:生成文件所在路径,可配置为绝对路径或者相对路径,并且工具执行用户对路径具有可读写权限。若不配置,则默认生成在执行命令的当前路径。

    • -f:表示框架类型,aclnn表示生成简易工程。

  3. 命令执行完后,会在-out指定目录或者默认路径下生成算子工程目录,工程中包含算子实现的模板文件,编译脚本等,以AddCustom算子为例,目录结构如下所示:

    [object Object]
    [object Object]
[object Object]

参考完成算子实现。

[object Object]

算子kernel侧和host侧实现开发完成后,需要对算子进行编译,生成算子静态库;自动生成aclnn调用实现代码和头文件,链接算子静态库生成aclnn动态库,以支持后续的单算子API执行方式(aclnn)的算子调用。编译过程如下:

  • 根据host侧算子实现文件自动生成aclnn接口aclnn_*.h和aclnn实现文件aclnn_.cpp。
  • 编译Tiling实现和算子原型定义生成Tiling动态库liboptiling.so(libcust_opmaster_rt2.0)。
  • 编译kernel侧算子实现文件,并加载Tiling动态库,生成kernel静态库libkernels.a。
  • 编译aclnn实现文件,并链接kernel静态库libkernels.a生成单算子API调用的动态库libcust_opapi.so。

上述编译过程示意图如下:

图 1 编译过程示意图[object Object][object Object]

上文描述的过程都封装在编译脚本中,开发者进行编译时参考如下的步骤进行操作:

  1. 完成工程编译相关配置。

    • 修改cmake目录下config.cmake中的配置项,config.cmake文件内容如下:

      [object Object]

      表 1 需要开发者配置的常用参数列表

      [object Object][object Object]

      [object Object]
    • 配置编译相关环境变量(可选)

      表 2 环境变量说明

      [object Object][object Object]

      [object Object]
  2. (可选)如果需要编译多个算子,在op_kernel目录下的CMakeLists.txt中增加要编译的算子。

    [object Object]
  3. (可选)在算子工程中,如果开发者想对算子kernel侧代码增加一些自定义的编译选项,可以参考进行编译选项的定制。

  4. 在算子工程目录下执行如下命令,进行算子工程编译。

    [object Object]

    编译成功后,会在CMAKE_INSTALL_PREFIX/op_api目录存放生成的aclnn头文件和lib库,每一个算子都会对应一个单独的头文件。具体目录结构如下:

    [object Object]

    对于lib目录下生成的库文件可通过msobjdump工具进一步解析得到kernel信息,具体操作参见

[object Object]

完成