
1.3.3 控制单元
在达·芬奇架构下,控制单元为整个计算过程提供了控制指令,相当于AI Core的司令部,负责整个AI Core的运行,起到了至关重要的作用。控制单元的主要组成部分(如图1-20所示的虚线框部分)为系统控制模块、指令缓存模块、标量控制模块、矩阵指令队列模块、向量指令队列模块、存储转换指令队列模块和事件同步模块。

图1-20 AI Core的控制单元
在指令执行过程中,可以提前预取后续指令,并一次将多条指令读入缓存,以提升指令的执行效率。多条指令从系统内存通过MBI进入AI Core的指令缓存模块中,并等待后续硬件解码或计算。指令被解码后便会被导入标量控制模块的标量指令处理队列,实现地址解码与运算控制。这些指令包括矩阵计算指令、向量计算指令及存储转换指令等。所有指令都作为普通标量指令被逐条、顺次处理。标量指令处理队列将这些指令的地址和参数解码配置好后,分别发射到对应的指令执行队列中,而标量指令会驻留在标量指令处理队列中等待后续执行。指令执行队列由矩阵指令队列、向量指令队列和存储转换指令队列组成。矩阵计算指令进入矩阵指令队列,向量计算指令进入向量指令队列,存储转换指令进入存储转换指令队列,同一个指令执行队列中的指令按照进入队列的顺序执行,不同指令执行队列之间可以并行执行。通过多个指令执行队列的并行执行可以提升整体执行效率。
如果指令执行队列中的指令到达队列头部,就进入真正的指令执行环节,并被分发到相应的执行单元中,如矩阵计算指令被发射到矩阵计算单元,存储转换指令被发射到存储转换单元。不同的执行单元可以并行地按照指令进行计算或处理数据。同一个指令队列中指令执行的流程被称为指令流水线。
对于指令流水线之间可能出现的数据依赖,达·芬奇架构的解决方案是通过设置事件同步模块统一、自动协调各个流水线的进程。事件同步模块时刻控制每条流水线的执行状态,并分析不同流水线的依赖关系,从而解决数据依赖和同步的问题。例如矩阵指令队列的当前指令需要依赖向量计算单元的结果,在执行过程中,事件同步模块会暂停矩阵指令队列的执行流程,要求其等待向量计算单元的结果。当向量计算单元完成计算并输出结果后,事件同步模块通知矩阵计算队列需要的数据已经准备好,可以继续执行。在事件同步模块准许放行之后,矩阵指令队列才会发射当前指令。
图1-21展示了4条指令流水线的执行流程。标量指令处理队列先执行标量指令0、标量指令1和标量指令2。由于向量计算队列中指令0和存储转换队列中指令0与标量指令2存在数据依赖性,需要等到标量指令2完成后才能发射并启动。受到指令发射窗口资源限制的影响,一次只能发射两条指令,因此只能在时刻4时发射并启动矩阵计算指令0和标量指令3,这时4条指令队列可以并行执行。直到标量指令处理队列中的全局同步标量指令7生效后,由事件同步模块对矩阵流水线、向量流水线和存储转换流水线进行同步控制,并等待矩阵计算指令0、向量计算指令1和存储转换指令1都执行完成后,得到执行结果,事件同步模块控制作用完成,标量流水线继续执行标量指令8。

图1-21 4条指令流水线的执行流程
对于同一条指令流水线内部指令之间的依赖关系,达·芬奇架构是通过事件同步模块自动实现同步的。在遇到同一条流水线内需要处理关系时,事件同步模块阻止同一指令执行队列中后续指令的执行,直到能够满足某些条件之后才恢复执行。在达·芬奇架构中,无论是流水线内部的同步还是流水线之间的同步,都是通过事件同步模块进行控制的。
在控制单元中还存在一个系统控制模块。在AI Core运行之前,需要外部的任务调度器,也就是一个独立CPU来控制和初始化AI Core的各种配置接口,如指令信息、参数信息及任务块信息等。这里的任务块是指AI Core中最小的计算任务粒度。在配置完成后,系统控制模块会控制任务块的执行进程;在任务块执行完成后,系统控制模块会进行中断处理和状态申报。如果在执行过程中出现了错误,系统控制模块会把执行的错误状态报告给任务调度器,进而将当前AI Core的状态信息反馈给整个昇腾AI处理器芯片系统。