基本架构

如下图所示,基于Ascend C开发的算子运行在AI Core上。Ascend C编程模型基于AI Core硬件架构的抽象进行介绍,了解硬件架构能够帮助开发者更好的理解编程模型;对于需要完成高性能编程的深度开发者,更需要了解硬件架构相关知识,算子实践参考中很多内容都以本章为基础进行介绍。

AI Core负责执行矩阵、矢量计算密集的任务,其包括以下组成部分:

Atlas A2 训练系列产品 / Atlas A2 推理系列产品 为例,硬件架构图如下:

本章节首先介绍硬件架构相关的关键概念和术语,以及AI Core的工作模式,为理解后续内容奠定基础。随后以 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 为例,提供AI Core基本架构的介绍:首先介绍计算单元、存储单元和搬运单元的基本功能与结构,然后通过典型的数据流和控制流示例,帮助开发者深入理解硬件架构的工作原理。针对不同产品型号对应的具体架构规格和细节说明需要参考后续架构规格章节。

关键概念和术语

AI Core的工作模式

Ascend C编程中,不同产品的工作模式如下:
  • Atlas 推理系列产品 :耦合模式
  • Atlas 训练系列产品 :耦合模式
  • Atlas A2 训练系列产品 / Atlas A2 推理系列产品 :分离模式
  • Atlas A3 训练系列产品 / Atlas A3 推理系列产品 :分离模式
  • Atlas 350 加速卡:分离模式
  • Atlas 200I/500 A2 推理产品 :耦合模式

注意:针对 Atlas 200I/500 A2 推理产品 ,硬件的工作模式既可以支持耦合模式,又可以支持分离模式。耦合模式下,开发者仅需关注AI Core数量,无需关注Vector Core和Cube Core数量;分离模式下,需要关注AI Core、Vector Core、Cube Core的数量。Ascend C编程场景下,仅支持耦合模式。

计算单元

计算单元是AI Core中提供强大算力的核心单元,包括三种基础计算单元:Cube(矩阵)计算单元、Vector(矢量)计算单元和Scalar(标量)计算单元,完成AI Core中不同类型的数据计算。

存储单元和搬运单元

AI处理器中的计算资源要想发挥强劲算力,必要条件是保证输入数据能够及时准确地出现在计算单元中,需要精心设计存储系统,保证计算单元所需的数据供应。

如下图所示:AI Core中包含多级内部存储,AI Core需要把外部存储中的数据加载到内部存储中,才能完成相应的计算。AI Core的主要内部存储包括:L1 Buffer(L1缓冲区),L0 Buffer(L0缓冲区),Unified Buffer(统一缓冲区)等。为了配合AI Core中的数据传输和搬运,AI Core中还包含MTE(Memory Transfer Engine,数据传递引擎)搬运单元,在搬运过程中可执行随路数据格式/类型转换。

内部存储单元和搬运单元的具体介绍请参考表1表2

图6 存储单元
表1 存储单元介绍

存储单元

描述

L1 Buffer

L1缓冲区,通用内部存储,是AI Core内比较大的一块数据中转区,可暂存Cube计算单元需要反复使用的一些数据从而减少从总线读写的次数。

L0A Buffer / L0B Buffer

Cube指令的输入。

L0C Buffer

Cube指令的输出,但进行累加计算的时候,也是输入的一部分。

Unified Buffer

统一缓冲区,向量和标量计算的输入和输出。

BT Buffer

BiasTable Buffer,存放矩阵计算中的Bias。

FP Buffer

Fixpipe Buffer,存放量化参数、Relu参数等。

表2 搬运单元介绍

搬运单元

描述

MTE1

负责如下通路的数据搬运:

  • L1->L0A/L0B
  • L1->BT Buffer

MTE2

负责如下通路的数据搬运:

  • GM->{L1, L0A/B},在该通路下,基于分形大小搬运,搬运时满足Cache Line大小对齐,性能更优。
  • GM->UB,基于Cache Line大小搬运性能更优。

MTE3

负责如下通路的数据搬运:

  • UB -> GM

FixPipe

负责如下通路的数据搬运,搬运过程中可以完成随路数据格式/类型转换:

  • L0C->{GM/L1}
  • L1->FP Buffer
  • 不同类型的AI处理器,存储单元大小不同,开发者可通过GetCoreMemSize接口获取。
  • 所有通过搬运单元读写GM的数据都缺省被缓存在L2Cache,以此加快访问速度,提高访问效率。核外L2Cache以Cache Line为单位加载数据,根据硬件规格不同,Cache Line大小不同(128/256/512Byte等)。

典型的数据流

典型的指令流

多条指令从系统内存通过总线接口进入到ICache(Instruction Cache)中,后续的指令执行过程,根据指令的类型,有两种可能:

图7 指令分类处理机制
同一个指令序列中的指令是按照进入指令序列的顺序执行的,不同指令序列之间可以并行执行,通过多个指令序列的并行执行可以提升整体执行效率。对于并行执行过程中可能出现的数据依赖,通过事件同步模块插入同步指令来控制流水线的同步,提供PipeBarrier、SetFlag/WaitFlag两种API,保证序列内部以及序列之间按照逻辑关系执行。
  • PipeBarrier本身是一条指令,用于在序列内部约束执行顺序(虽然指令是顺序执行,但并不意味着后一条指令开始执行时前一条指令执行结束)。PipeBarrier指令可以保证前序指令中所有数据读写全部完成,后序指令才开始执行。
  • SetFlag/WaitFlag为两条指令,在SetFlag/WaitFlag的指令中,可以指定一对指令序列的关系,表示两个序列之间完成一组“锁”机制,其作用方式为:
    • SetFlag:当前序指令的所有读写操作都完成之后,当前指令开始执行,并将硬件中的对应标志位设置为1。
    • WaitFlag:当执行到该指令时,如果发现对应标志位为0,该序列的后续指令将一直被阻塞;如果发现对应标志位为1,则将对应标志位设置为0,同时后续指令开始执行。

Ascend C提供同步控制API,开发者可以使用这类API来自行完成同步控制。需要注意的是,通常情况下,开发者基于编程模型中介绍的编程模型和范式进行编程时不需要关注同步,编程模型帮助开发者完成了同步控制;使用编程模型和范式是我们推荐的编程方式,自行同步控制可能会带来一定的编程复杂度。

但是我们仍然希望开发者可以理解同步的基本原理,便于后续更好的理解设计并行计算程序;同时少数情况需要开发者手动插入同步,您可以通过什么时候需要开发者手动插入同步来了解具体内容。