开发者
资源
[object Object]

本入门教程,将会引导你完成以下任务,体验Ascend C SIMT算子开发基本流程。

  1. 算子分析,明确数学表达式和计算逻辑等内容;
  2. Add算子核函数开发;
  3. 算子核函数运行验证。

在正式的开发之前,需要先完成环境准备工作,开发Ascend C算子的基本流程如下图所示:

图 1 开发Ascend C算子的基本流程[object Object][object Object]

[object Object]
[object Object]
  • CANN软件安装

    开发算子前,需要先准备好开发环境和运行环境,开发环境和运行环境的介绍和具体的安装步骤可参见

  • 环境变量配置

    安装CANN软件后,使用CANN运行用户进行编译、运行时,需要以CANN运行用户登录环境,执行source ${INSTALL_DIR}/set_env.sh命令设置环境变量。${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。以root用户安装为例,安装后文件默认存储路径为:/usr/local/Ascend/cann。

[object Object]

主要分析算子的数学表达式、输入输出的数量、Shape范围以及计算逻辑的实现,明确需要调用的Ascend C SIMT接口或操作符。下文以Add算子为例,介绍具体的分析过程。

  1. 明确算子的数学表达式及计算逻辑。

    Add算子的数学表达式为:

    计算逻辑是:逐元素将外部存储Global Memory对应位置上的输入x与y相加,结果存储在Global Memory输出z上。

  2. 明确输入和输出。

    • Add算子有两个输入:x与y,输出为z。
    • 本样例中算子输入支持的数据类型为float,算子输出的数据类型与输入数据类型相同。
    • 算子的输入、输出shape为(48,256)。
  3. 确定核函数名称和参数。

    • 本样例中核函数命名为add_custom。
    • 根据对算子输入输出的分析,确定核函数有3个输入输出参数x,y,z, 数据类型均为float。
    • 增加一个核函数入参total_length,用于记录算子实际的输入、输出数据长度,数据类型为uint64_t。
  4. 确定算子实现逻辑。

    • 将数据均分到48个Thread Block上,每个Thread Block起256个线程处理256个元素,每个线程处理一个元素。
    • 通过每个线程独有的线程索引,计算当前线程需要处理的数据的偏移量。

通过以上分析,得到Ascend C SIMT实现的Add算子的设计规格如下:

表 1 Add算子输入输出规格

[object Object][object Object]

[object Object]
  • 核函数名称:add_custom
  • 算子实现文件名称:add.asc
[object Object]

通过当前线程块索引blockIdx、单个线程块包含的线程数blockDim、当前线程索引threadIdx计算获得当前线程的索引,以当前线程索引作为当前计算数据行的偏移量。

[object Object]

通过下标偏移和加法运算符,计算该偏移位置的数据相加的结果,并将结果写入到输出中。

[object Object]

完整的核函数代码实现如下所示:

[object Object]
[object Object]

完成Kernel侧核函数开发后,即可编写Host侧的核函数调用程序。实现从Host侧的APP程序调用算子,执行计算过程。

  1. Host侧应用程序框架的编写。

    [object Object]
  2. 编写通过<<<...>>>内核调用符调用算子的代码。

    图 2 调用步骤[object Object][object Object]

    如下示例中的acl API使用方法请参考

    [object Object]
  3. CMake编译配置如下:

    [object Object]
  4. 编译和运行命令如下:

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

如果您想了解更多SIMT编程相关概念,可以参考学习基本概念,再来回顾本教程;如果您已经了解相关概念,并跑通了该样例,您可以参考了解Ascend C SIMT编程中的更多细节。