- CGRA的结构
1.1 整体结构
CGRA(Coarse-Grained Reconfigurable Arrays)一般由多个IS(Issue Slots)和RF(Register Files)组成,这里的IS在很多文章中也常用ALU,FU,PE,RC等术语指代,其实质上是进行数据运算的计算单元。
1.1.1 紧耦合(Tight Coupling)
一个紧耦合CGRA的整体结构如图1所示,其处理器与可编程阵列融为一体,故被称为紧耦合(Tight Coupling)。图中白色小方块代表输入端口,黑色小方块代表输出端口。
利用MUX来控制是否选通其他部分传递过来的信号,以此达到可重构的目的。通过图1和图2所示的结构及连接方式,可以看出各个IS之间可以不通过RF来直接互相传递数据,这样可以省略掉对RF进行读写所需的周期,同时还能够有效减少功耗。观察图1可以发现,当CGRA仅有第1行的IS、shared RF和Memory时,其结构与VLIW(Very Long Instruction Word)处理器基本相同,因此CGRA在某种程度上可以看作是VLIW处理器在2D维度上的扩展。
另一种紧耦合的CGRA结构如图2所示,可以看出当一个ID模块与多个FU模块相连时,CGRA此时相当于一个SIMD处理器;当多个ID与多个FU相连时,CGRA相当于一个VLIW处理器。从以上的角度不难推测出CGRA适合执行计算密集型的算法。
各种CGRA根据需要选择不同连接方式,例如ADRES、MorphoSys采用了a和b结合的连接方式,这种连接方式的好处是数据传输距离较短,功耗小,但同时也意味着一个IS模块不能直接对所有的IS传递数据。对比之下,采用c中以总线的方式实现CGRA中各个IS模块之间的数据传输有更高的灵活性,但也对应更高的功耗和面积。
对于寄存器组(RF)而言,很多CGRA的编译器将其视为可以在多个周期内保持数据的内部连接(interconnect)。这样在布线时,编译器可以将对角线上的IS模块通过RF相连,增加了设计空间。对于循环过程中的数据,有时可能会产生某数据a需要在x+1个时钟周期后被下一轮循环所利用,但在x个时钟周期后就被更新的情况,这时就需要将原来的数据单独存放,以供下一个循环使用。然而,由于两次循环中都是对a数据操作,因此对a的更新是向同一个地址对应的寄存器中写入新的数据,那么就意味着如果想要将原来的数据单独存放就需要额外的部分来确定将该数据放在哪个地址中。而循环寄存器(rotating register)的方式能够确保在向同一个地址写数据时,原来的数据不被覆盖,同时这种方法相较于设计额外部分电路来存放原数据有着更低的功耗且消耗较少资源。因此RF一般采用循环寄存器,这样能够确保那些需要持续的时间大于一个循环周期的数据不丢失。
相比之下,FPGA是由以LUT和MUX为基础构成的门级可编程逻辑块构成的,具有很好的可编程性,可以灵活更改设计,同时设计时间也大大缩短。由于FPGA是静态编程的,相比于CPU而言没有取指令、分析指令、访问存储器等部分的动态功耗。但可编程的内部连接(interconnect)消耗了60%的芯片面积和功耗,同时由于FPGA有经过多个逻辑单元的很长的组合逻辑路径,导致其关键路径(critical path)很长,极大的限制了其时钟的最大工作频率。
CGRA正是希望能够兼顾高能效和灵活性,为设计更好满足要求的AI加速器提供可能。前文提到,从处理器的角度看,CGRA在某种程度上可以看作是VLIW处理器在2D维度上的扩展。这里我们切换角度,从FPGA的角度看,CGRA可看作是支持静态和动态重构的粗粒度的FPGA。由于CGRA内部的IS(ALU)模块已经构建完成,其延时和性能要显著好于在门级上进行互连形成计算逻辑的FPGA,同时CGRA的内部连接也要比FPGA更简单,因此CGRA更适合word-wise的可重构计算。图10给出了三者在灵活性、性能、能效比之间的关系。