编程接口概述

本章提供编程API的概述。具体API参考见Ascend C API

Ascend C提供一组类库API,开发者使用标准C++语法和类库API进行编程。Ascend C编程类库API示意图如下所示,分为:

进行Ascend C算子Host侧编程时,需要使用基础数据结构和API,请参考基础数据结构与接口;完成算子开发后,需要使用Runtime API完成算子的调用,请参考“AscendCL API(C&C++)”

Ascend C API所在头文件目录为:

  • 基础API:${INSTALL_DIR}/include/ascendc/basic_api/interface
  • 高阶API:(注意,如下目录头文件中包含的接口如果未在资料中声明,属于间接调用接口,开发者无需关注)
    • ${INSTALL_DIR}/include/ascendc/highlevel_api/lib
    • ${INSTALL_DIR}/include/tiling

${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。若安装的Ascend-cann-toolkit软件包,以root安装举例,则安装后文件存储路径为:/usr/local/Ascend/ascend-toolkit/latest。

基础API概述

对于基础API,主要分为以下几类:
  • 标量计算API,实现调用Scalar计算单元执行计算的功能。
  • 矢量计算API,实现调用Vector计算单元执行计算的功能。
  • 矩阵计算API,实现调用Cube计算单元执行计算的功能。
  • 数据搬运API,计算API基于Local Memory数据进行计算,所以数据需要先从Global Memory搬运至Local Memory,再使用计算API完成计算,最后从Local Memory搬出至Global Memory。执行搬运过程的接口称之为数据搬运API,比如DataCopy接口。
  • 内存管理与同步控制API
    • 内存管理API,用于分配管理内存,比如AllocTensor、FreeTensor接口;
    • 同步控制API,完成任务间的通信和同步,比如EnQue、DeQue接口。不同的API指令间有可能存在依赖关系,从抽象硬件架构可知,不同的指令异步并行执行,为了保证不同指令队列间的指令按照正确的逻辑关系执行,需要向不同的组件发送同步指令。同步控制API内部即完成这个发送同步指令的过程,开发者无需关注内部实现逻辑,使用简单的API接口即可完成。

对于基础API中的计算API,根据对数据操作方法的不同,分为以下几种计算方式:

下图以矢量加法为例,展示了几种计算方式的特点。

图1 计算API几种计算方式的特点

高阶API概述

高阶API一般是基于单核对常见算法的抽象和封装,用于提高编程开发效率,通常会调用多种基础API实现。高阶API包括数学库、Matmul、Softmax等API

如下图所示,实现一个矩阵乘操作,使用基础API需要的步骤较多,需要关注格式转换、数据切分等逻辑;使用高阶API则无需关注这些逻辑,可以快速实现功能。

由于AI处理器的Scalar计算单元执行能力有限,为减少算子Kernel侧的Scalar计算,将部分计算在Host端执行,这需要编写Host端Tiling代码。注意,在程序中调用高阶API的Tiling接口或者使用高阶API的Tiling结构体参数时,需要引入依赖的头文件,示例如下:

1
#include "tiling/tiling_api.h"