Ascend C暑期优才班——上海站 Ascend C 学习笔记
理论学习
AI Core是昇腾AI处理器的计算核心,采用华为自研的达芬奇架构,通常也被叫做DaVinci Core。根据不同的处理器版本,AICore里的计算、存储和带宽资源有不同的规格。
达芬奇架构主要部分:计算单元: 包含三种基础计算资源(矩阵计算单元、向量计算单元、标量计算单元);存储系统: AI Core的片上存储单元和相应的数据通路构成了存储系统;控制单元:整个计算过程提供了指令控制,相当于AI Core的司令部,负责整个AI Core的运行。
使用Ascend C编程语言开发的算子运行在AI Core上,AI Core是昇腾AI处理器中的计算核心一个AI处理器内部有多个AI Core,AI Core中包含计算单元、存储单元、搬运单元等核心组件,具体如下图所示。
图中绿色部分表示计算单元,包括了三种基础计算资源:Scalar计算单元,其执行地址计算、循环控制等标量计算工作,并把向量计算、矩阵计算、数据搬运、同步指令发射给对应单元执行;Cube计算单元,其负责执行矩阵运算;Vector计算单元,其负责执行向量运算。
图中浅绿色部分表示搬运单元,负责在Global Memory和Local Memory之间搬运数据,包含搬运单元MTE2(Memory Transfer Engine,数据搬入单元),MTE3(数据搬出单元)等。
图中粉色部分表示存储单元。AI Core的内部存储,统称为 Local Memory,而Al Core的外部存储则称之为 Global Memory。
在NVIDIA GPU中的编程模型CUDA框架中,其有着多级的存储层次结构,如寄存器(Registers),局部内存(Local Memory),共享内存(Shared Memory)等,线程访问不同存储结构的速度不同。因此,了解其存储层次结构,管理好数据在不同层级之间流动,将大幅优化程序的运行速度。在昇腾AI处理器中,不同的流水任务之间存在数据依赖,需要进行数据传递 Ascend C 中使用Queue队列完成任务之间的数据通信和同步。Queue提供了EnQue、DeQue等基础API。与NVIDIA GPU不同,Queue队列管理NPU上不同层级的物理内存时,用一种抽象的逻辑位置(QuePosition)来表达各个级别的存储(Storage Scope),代替了片上物理存储的概念,开发A2者无需感知硬件架构。
TPosition类型包括:VECIN、VECCALC、VECOUT等。其中VECIN、VECCALC、VECOUT主要用于向量编程;A1、A2、B1、B2、CO1、CO2用于矩阵编程。它们的具体含义如下图:
香橙派实践
实践内容:实现Ascend C算子Sinh,算子命名为SinhCustom,编写其kernel侧代码、host侧代码,并完成aclnn算子调用测试。
开发流程如下: 
矢量算子编程范式把算子的实现流程分为3个基本任务:CopyIn,Compute和CopyOut。CopyIn负责数据搬入操作,Compute负责矢量计算操作,CopyOut负责数据搬出操作。
因此,我们可以分步骤实现Sinh算子,不同部件执行不同的功能:
- CopyIn任务:将Global Memory上的输入Tensor xGm搬运至Local Memory,存储在xLocal。
- Compute任务:对xLocal执行Sinh操作,计算结果存储在yLocal中。
- CopyOut任务:将输出数据从yLocal搬运至GlobalMemory上的输出Tensor yGm中。
在Init初始化函数中,针对单核处理数据的情形,我们可以进行数据切块(Tiling),将数据切分成多块。切分后的每个数据块再次切分成BUFFERNUM=2块可开启double buffer,实现流水线之间的并行。
Process函数是本算子的核心计算部分。将数据切块后,我们将依次对每组数据进行“CopyIn,Compute和CopyOut”的矢量算子编程范式操作,不同组之间可以实现流水线之间的并行,具体实现如下图所示。
自此,算子Sinh便已开发完成。
Ascend C暑期优才班——上海站 Ascend C 学习笔记
理论学习
AI Core是昇腾AI处理器的计算核心,采用华为自研的达芬奇架构,通常也被叫做DaVinci Core。根据不同的处理器版本,AICore里的计算、存储和带宽资源有不同的规格。
达芬奇架构主要部分:计算单元: 包含三种基础计算资源(矩阵计算单元、向量计算单元、标量计算单元);存储系统: AI Core的片上存储单元和相应的数据通路构成了存储系统;控制单元:整个计算过程提供了指令控制,相当于AI Core的司令部,负责整个AI Core的运行。
使用Ascend C编程语言开发的算子运行在AI Core上,AI Core是昇腾AI处理器中的计算核心一个AI处理器内部有多个AI Core,AI Core中包含计算单元、存储单元、搬运单元等核心组件,具体如下图所示。
图中绿色部分表示计算单元,包括了三种基础计算资源:Scalar计算单元,其执行地址计算、循环控制等标量计算工作,并把向量计算、矩阵计算、数据搬运、同步指令发射给对应单元执行;Cube计算单元,其负责执行矩阵运算;Vector计算单元,其负责执行向量运算。
图中浅绿色部分表示搬运单元,负责在Global Memory和Local Memory之间搬运数据,包含搬运单元MTE2(Memory Transfer Engine,数据搬入单元),MTE3(数据搬出单元)等。
图中粉色部分表示存储单元。AI Core的内部存储,统称为 Local Memory,而Al Core的外部存储则称之为 Global Memory。
在NVIDIA GPU中的编程模型CUDA框架中,其有着多级的存储层次结构,如寄存器(Registers),局部内存(Local Memory),共享内存(Shared Memory)等,线程访问不同存储结构的速度不同。因此,了解其存储层次结构,管理好数据在不同层级之间流动,将大幅优化程序的运行速度。在昇腾AI处理器中,不同的流水任务之间存在数据依赖,需要进行数据传递 Ascend C 中使用Queue队列完成任务之间的数据通信和同步。Queue提供了EnQue、DeQue等基础API。与NVIDIA GPU不同,Queue队列管理NPU上不同层级的物理内存时,用一种抽象的逻辑位置(QuePosition)来表达各个级别的存储(Storage Scope),代替了片上物理存储的概念,开发A2者无需感知硬件架构。
TPosition类型包括:VECIN、VECCALC、VECOUT等。其中VECIN、VECCALC、VECOUT主要用于向量编程;A1、A2、B1、B2、CO1、CO2用于矩阵编程。它们的具体含义如下图:
香橙派实践
实践内容:实现Ascend C算子Sinh,算子命名为SinhCustom,编写其kernel侧代码、host侧代码,并完成aclnn算子调用测试。
开发流程如下:
矢量算子编程范式把算子的实现流程分为3个基本任务:CopyIn,Compute和CopyOut。CopyIn负责数据搬入操作,Compute负责矢量计算操作,CopyOut负责数据搬出操作。
因此,我们可以分步骤实现Sinh算子,不同部件执行不同的功能:
在Init初始化函数中,针对单核处理数据的情形,我们可以进行数据切块(Tiling),将数据切分成多块。切分后的每个数据块再次切分成BUFFERNUM=2块可开启double buffer,实现流水线之间的并行。
Process函数是本算子的核心计算部分。将数据切块后,我们将依次对每组数据进行“CopyIn,Compute和CopyOut”的矢量算子编程范式操作,不同组之间可以实现流水线之间的并行,具体实现如下图所示。
自此,算子Sinh便已开发完成。