介绍同步控制之前需要先回顾一下图1。
AI Core内部的异步并行计算过程:Scalar计算单元读取指令序列,并把向量计算、矩阵计算、数据搬运指令发射给对应单元的指令队列,向量计算单元、矩阵计算单元、数据搬运单元异步的并行执行接收到的指令。该过程可以参考图1中蓝色箭头所示的指令流。
不同的指令间有可能存在依赖关系,为了保证不同指令队列间的指令按照正确的逻辑关系执行,Scalar计算单元也会给对应单元下发同步指令。各单元之间的同步过程可以参考图1中的绿色箭头所示的同步信号流。
AI Core内部数据处理的基本过程:DMA搬入单元把数据搬运到Local Memory,Vector/Cube计算单元完成数据计算,并把计算结果写回Local Memory,DMA搬出单元把处理好的数据搬运回Global Memory。该过程可以参考图1中的红色箭头所示的数据流。
从上图可以了解到AI Core内部的执行单元是异步并行的,在读写Local Memory内存时,可能存在依赖,需要进行同步控制。
下图示例描述了一个常见的Vector计算数据流:先通过DMA执行单元将数据从Global Memory搬入到Local Memory,进行计算,然后再通过DMA执行单元将计算结果从Local Memory搬出到Global Memory。
四个执行单元Scalar、Vector、DMA(VECIN)、DMA(VECOUT)并行执行,若访问同一片Local Memory,需要同步机制来控制他们的访问时序:保证先搬入Local Memory后再计算,计算完成后再搬出。
Ascend C提供ISASI(体系结构相关、该类接口不能保证跨版本兼容)同步控制接口,开发者可以使用这类API来自行完成同步控制。需要注意的是,通常情况下,开发者基于编程模型中介绍的编程模型和范式进行编程时不需要关注同步,编程模型帮助开发者完成了同步控制;使用编程模型和范式是我们推荐的编程方式,自行同步控制可能会带来一定的编程复杂度,不建议开发者使用。
AI Core内部并行的指令流水类型和解释如下所示,硬件流水的详细介绍请参考基本架构章节。
对上述并行流水的同步控制分为两种: