开发者
资源
[object Object]
[object Object]

下文将以Add矢量算子为例对Kernel直调算子开发流程进行详细介绍。

[object Object]
  • 使用Kernel Launch算子工程之前,需要参考章节安装驱动固件和CANN软件包,完成开发环境和运行环境的准备。

  • 使用该算子工程要求cmake版本为3.16及以上版本,如不符合要求,请参考如下的命令示例更新cmake版本,如下示例以更新到3.16.0版本为例。

    [object Object]
[object Object]

您可以单击,获取核函数开发和运行验证的完整样例。样例目录结构如下所示:

[object Object]

基于该算子工程,开发者进行算子开发的步骤如下:

  • 完成算子kernel侧实现。

  • 编写算子调用应用程序main.cpp。

  • 编写CMake编译配置文件CMakeLists.txt。

  • 根据实际需要修改输入数据和真值数据生成脚本文件gen_data.py;验证输出数据和真值数据是否一致的验证脚本verify_result.py。

  • 根据实际需要修改编译运行算子的脚本run.sh并执行该脚本,完成算子的编译运行和结果验证。

[object Object]

请参考工程目录中的矢量算子、矩阵算子、融合算子的Kernel实现完成Ascend C算子实现文件的编写。

[object Object]
[object Object]

下面代码以固定shape的add_custom算子为例,介绍算子核函数调用的应用程序main.cpp如何编写。您在实现自己的应用程序时,需要关注由于算子核函数不同带来的修改,包括算子核函数名,入参出参的不同等,合理安排相应的内存分配、内存拷贝和文件读写等,相关API的调用方式直接复用即可。

  1. 按需包含头文件,通过ASCENDC_CPU_DEBUG宏区分CPU/NPU侧需要包含的头文件。需要注意的是,NPU侧需要包含对应的核函数调用接口声明所在的头文件aclrtlaunch_{kernel_name}.h(该头文件为工程框架自动生成),kernel_name为算子核函数的名称。

    [object Object]
  2. 应用程序框架编写。该应用程序通过ASCENDC_CPU_DEBUG宏区分代码逻辑运行于CPU侧还是NPU侧。

    [object Object]
  3. CPU侧运行验证。完成算子核函数CPU侧运行验证的步骤如下:

    图 1 CPU侧运行验证步骤[object Object][object Object]

    [object Object]
  4. NPU侧运行验证。完成算子核函数NPU侧运行验证的步骤如下:

    图 2 NPU侧运行验证步骤[object Object][object Object]

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

本节会介绍CMake文件中一些关键环境变量和Cmake命令参数的说明,通常情况下不需要开发者修改,但是这些参数可以帮助开发者更好的理解编译原理,方便有能力的开发者对Cmake进行定制化处理。

表 1 环境变量说明

[object Object][object Object]

[object Object]

表 2 Cmake命令语法说明

[object Object][object Object]

[object Object]

简化的编译流程图如下图所示:将算子核函数源文件编译生成kernel侧的库文件(*.so或*.a库文件);工程框架自动生成核函数调用接口声明头文件;编译main.cpp(算子调用应用程序)时依赖上述头文件,将编译应用程序生成的目标文件和kernel侧的库文件进行链接,生成最终的可执行文件。

图 3 编译简化流程图[object Object][object Object]

编译安装结束后在CMAKE_INSTALL_PREFIX目录下生成的编译产物示例如下;最终的可执行文件会生成在cmake命令的执行目录下。

[object Object]

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

[object Object]

以固定shape的add_custom算子为例,输入数据和真值数据生成的脚本样例如下:根据算子的输入输出编写脚本,生成输入数据和真值数据。

[object Object]

验证输出数据和真值数据是否一致的验证脚本样例如下:当前使用numpy接口计算了输出数据和真值数据的绝对误差和相对误差,误差在容忍偏差范围内,视为精度符合要求,输出"test pass"字样。

[object Object]
[object Object]

您可以基于样例工程中提供的一键式编译运行脚本进行快速编译,并在CPU侧和NPU侧执行Ascend C算子。一键式编译运行脚本主要完成以下功能:

图 4 一键式编译运行脚本流程图[object Object][object Object]

[object Object]

完成上述文件的编写后,可以执行一键式编译运行脚本,编译和运行应用程序。

脚本执行方式和脚本参数介绍如下:

[object Object]

表 3 脚本参数介绍

[object Object][object Object]

[object Object]

脚本执行完毕输出"test pass"字样表示算子精度符合要求。

[object Object]

在非昇腾设备上,开发者可以利用CPU仿真环境先行进行算子开发和测试,并在准备就绪后,利用昇腾设备进行加速计算。在章节,我们已经介绍了算子Kernel程序NPU域的编译运行。相比于NPU域的算子运行逻辑,CPU域调试,实际上是通过标准的GCC编译器编译算子Kernel程序。此时算子Kernel程序链接CPU调测库,执行编译生成的可执行文件,可以完成算子CPU域的运行验证。CPU侧的运行程序,通过GDB通用调试工具进行单步调试,可以精准验证程序执行流程是否符合预期。

图 5 CPU域和NPU域的核函数运行逻辑对比[object Object][object Object]

基于Kernel直调样例工程,通过ACLRT_LAUNCH_KERNEL接口调用核函数时,可实现CPU与NPU域的代码的统一,且该方式仅支持以下型号:

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品
  • Atlas 推理系列产品

下面代码以add_custom算子为例,介绍算子核函数在CPU侧验证时,算子调用的应用程序如何编写(通过ACLRT_LAUNCH_KERNEL接口调用核函数的方式)。您在实现自己的应用程序时,需要关注由于算子核函数不同带来的修改,包括算子核函数名,入参出参的不同等,合理安排相应的内存分配、内存拷贝和文件读写等,相关API的调用方式直接复用即可。

  1. 按需包含头文件。

    [object Object]
  2. 应用程序框架编写。

    [object Object]
  3. 运行验证。

    [object Object]
[object Object]