1. NoC的路由
在NoC交换信息时,需要确定从源节点到目标节点所经过的路径,这时就需要路由算法来确定该路径。路由算法分为静态路由算法和动态路由算法两种。
静态路由算法对于两节点之间的路径是固定的,结构简单,便于硬件实现,也便于保持传输数据的顺序,所以在NoC系统中被广泛的使用。但是静态路由算法在路径发生拥塞时,无法进行调整传输路径,降低数据传输效率。
动态路由算法又被称为自适应路由算法,可以根据网络流量和链路负载的变化调整路径,动态选择路径进行通信,避免了高数据传输密度下的网络拥塞。但这种算法结构复杂,不便于实现,同时在低拥塞时电路开销大,而且会出现死锁(循环等待)问题。
1.1 确定性XY路由算法
确定性XY路由算法是最简单的路由算法,该算法的路径取决于源节点和目标节点的地址,是一种静态的路由算法。以2D Mesh结构为例,数据首先在X方向传输,当数据到达目的节点的同一列时,沿Y方向传输,最后到达目的节点。
1.2 odd_even路由算法
odd_even路由算法是一种适用于mesh结构的部分自适应路由算法,对信号发生转弯的位置进行约束来防止死锁的产生。如果节点所在的Y坐标为奇数,该列称为奇数列;如果该列的Y坐标为偶数,该列称为偶数列。用E/S/W/N分别代表东南西北,NW表示从北到西的转弯。为了避免死锁发生,这种算法约束了一些转弯。例如:
- 奇数列转弯目的禁止向西
- 偶数列起始方向禁止向东
- 禁止180度转向
1.3 DyAD路由算法
CMU的Hu等提出了将Odd_even算法和确定性路由算法相结合的DyAD算法,可以根据网络的负载不同而采取不同的路由方式。在网络处于低负载情况下采用确定性路由算法,而当网络处于高负载时,采用odd_even自适应路由算法。路由器的每个输入端都在监控各自的信道占用率。当信道占用率超过拥塞阈值,拥塞标志位变为1,否则为0。如果标志位为1,路由器的工作模式变为odd_even路由模式。这种算法在网络低负载情况下拥有较好的时延和吞吐性能,并且在网络拥塞情况下具有较高的吞吐量。
1.4 DyXY路由算法
DyXY路由算法是一种全自适应算法,通过监视其相邻节点的拥塞状况来选择路由路径的下一跳。路由器每个端口的即时队列长度作为压力值,然后用压力值来表征相邻节点的拥塞状况。算法规定数据采用最短路径进行传输,如果存在多条最短路径,则选择拥塞压力最小的一条路径。
每个路由器时刻更新所保存的相邻节点的即时压力值,在确定源节点和目的节点之后,数据沿压力值最小的一条路径传输。这也是自适应算法最基本的思路,由于节点数据实时更新,所以可能会出现死锁或活锁的情况。
1.5 Weight-based Table routing
这是一种更复杂的路由方法,其中每个可能的路径或链接都分配有一个权重值。路由决策基于这些权重值,数据包倾向于选择权重最高(或最低)的路径。权重可以根据许多因素进行分配,例如路径长度、拥塞状况或能耗。这种方法可以提供比XY routing更好的性能,但设计和实现更复杂,且可能需要更多的硬件资源。
1.6 NoC失效的一些情况
死锁(Deadlock): 死锁是指在多任务系统中,两个或多个任务相互等待对方释放资源,导致任务无法继续进行的现象。可以通过控制流量来解决。
活锁:是指一个数据包在其目的节点周围环绕传输,但无法到达目的节点。可以通过采用最短路径的方法解决。
饥饿(Starvation): 在NoC系统中,饥饿是指某些任务或数据包由于其他高优先级的任务或数据包不断占用资源,导致无法获得足够的资源来完成它们的操作。可以通过合理的资源分配策略解决。
拥塞(Congestion): 当数据包在NoC中的流量超过网络的处理能力,就可能会发生拥塞。这可能会导致数据包的延迟增加,甚至可能导致数据丢失。
路由问题(Routing Issues): 不正确或低效的路由策略可能会导致数据包在到达目的地之前需要经过更多的跳数,从而增加了传输延迟并降低了网络性能。
在实际应用中,还需要根据特定的NoC结构来选择适合的路由算法。
2. NoC的交换
NoC的交换技术是动态分配传输线路和接口资源的方式,主要包括电路交换和包交换两种方式。
2.1 电路交换
电路交换是指在发送数据前,需要先在源节点与目的节点之间建立物理链路,然后进行数据传输,数据可以利用物理信道的整个带宽进行传送,而其它设备将无法使用这些物理链路,直到数据传输结束后链路才被释放。
优点:由于路径确定,并且独占物理通道,具有较高的数据传输效率和通信质量。
缺点:无法适应网络的实际变化情况,缺乏灵活性,链路利用率低,建立和释放连接浪费时间,不适合突发数据传输。电路交换方式适合于数据传输频繁,或者通信模式相对静态的场合。
2.2 包交换
包交换模式是将数据封装成包,每个数据由包头和数据部分组合而成。根据包头的信息,通过路选择策略,一级一级的可以将数据转发到目的地。
优点:不需要建立和释放链路花费附加时间;在数据传输过程中可以动态分配带宽,逻辑上属于同一连接的数据包可能通过不同的路径进行传输,信道利用率高,吞吐量高;而且链路故障具有容错能力,适合突发数据的传输。
缺点:在交换结点中存储整个数据包需要很大的缓存器,这会增加的面积成本;另外假如路由策略的选择不当,可能出现不同的数据包同时征用链路,会造成拥塞和死锁。
目前主要有三种包交换技术:存储转发(store and forward,SAF)、虚直通(virtual cut through,VCT)和虫孔(Wormhole)交换技术。
2.2.1 存储转发交换技术SAF
SAF交换技术是最简单的包交换方式,需要足够的缓存空间存储整个数据包,当且仅当路由器收到整个数据包后才能将其转发出去,增大了数据包的延迟。SAF需要较大的缓存空间,需要更大的数据带宽,并且延时较大。改进的办法是不需要等待数据包完整收到就将其转发出去。
2.2.2 虚直通交换技术VCT
VCT交换技术与SAF技术不同之处在于,VCT交换时,数据包头部一旦到达即可被转发,无需等待数据包完全到达。一旦做出路由决策并且输出通道是空闲的,路由器就可以马上转发随后的数据部分。当网络不存在延迟时,VCT交换技术效率很高,可以及时转发,但当网络拥塞时,路由器需要缓存整个数据包,缓存空间要占用很大的片上系统面积。
2.2.3 虫孔交换技术
虫孔交换中,数据被分为若干流控单元flits。第一个流控单元成为Head flits,带有数据包的目的地址等控制性信息,最后一个称为Tail flits。当路由器收到Head flits时,路由器根据其中的目标地址计算输出端口,端口空闲则将数据按流控单元依次转发出去,数据传输结束则释放端口。当Head flits被阻塞时,后面的数据也依次被阻塞,分别缓存在相邻的几个路由器中。相比之前的两种策略,虫孔交换技术的路由器志向需要几个flits的缓存空间,不需要缓存整个数据包的缓存空间。但分段存储数据更容易造成链路阻塞,更容易出现死锁。
综上,不同的NoC路由算法和交换技术各有优劣,我们需要根据特定的NoC结构,综合考虑多种因素选择合适的交换方式以提高传输质量,降低传输延迟。
3. 数据包packets格式:message -> packets -> flit -> phits
message是一组连续的比特流,想从源router传送到目的地router。将一个message分为若干packets,每个packets是routing路由和sequencing排序的基本单位。packet分为具有固定格式的flit组,包含header、body、tail。
- message:从程序员的角度来看,message是一个信息单元,通信的目的是要完整传递这个message。 大小仅受用户内存空间的限制。
- packet:是最小的通信单元,控制状态被分配给一个数据包。包含路由信息(例如,目标地址)和其标头中的排序信息。 它的大小是数百或数千字节或单词的数量级。 它由header flit和data flit迁移组成。数据包可能被分成小段。
- Flit:是bandwidth 和storage allocation的基本单位。flit没有任何路由或序列信息,必须沿着整个所在的packet顺序传播。根据 NoC 链路宽度,packets被分解为一个或多个flits。
- Head flit, body flit, tail flit, head/tail flit.
- Head flit allocates channel state for a packet,and tail flit deallocates it,tail标记数据包的结尾。
- header flit里有destination adderss和sequence number。
- Phit: (physical transfer digits) 是在一个时钟周期内通过通道传输的单位。
4. Router architecture
NoC中的路由器是一种专门为芯片级通信而设计的高度优化组件。它们基于特定的路由算法,使用多个输入/输出端口和缓冲区来实现数据传输和路由选择。路由器的设计目标是提供高性能、低延迟和可靠的通信,在大规模集成电路中支持高度并行的处理单元间的通信需求。
4.1 Router的内部结构
一个典型的基于“Message Passing” Systems的NoC路由器Router的结构如图所示,他由InputUnit(输入单元)、OutputUnit(输出单元)、Routing Computation(路由计算器)、Switch Allocator(开关分配器)、Virtual Channel Allocator(虚拟通道分配器)、Crossbar(横梁交叉开关矩阵)组成。
4.1.1 Input Unit(输入单元)
输入单元主要负责接收来自其他节点的数据。这里面可能包括多个虚拟通道(Virtual Channels),每一个VC都有独立的缓存队列。输入单元由输入缓冲器(input buffer)和相关的链路控制逻辑组成。输入缓冲器由 SRAM 单元或寄存器构建。缓冲槽被组织成若干个队列,每个队列是一个VC。
4.1.1.1 VC 虚拟通道
VC(Virtual Channel,虚拟通道),是用于在同一物理连接中复用传输的技术,它可以有效地减少网络阻塞,提高带宽利用率。
- 一个VC里存了一组flit吗?还是一个flit的一部分?
答:一个虚拟通道(Virtual Channel, VC)可以存储一个或多个完整的flit(flow control digit)。
- 增加虚拟通道的数量会有以下一些可能的影响
增加硬件复杂性和成本:每个虚拟通道都需要其自身的缓冲区和状态机来处理存储和转发数据包。因此,增加虚拟通道的数量将会增加设计的复杂性和硬件成本。
提高并行性和带宽:更多的虚拟通道意味着可以同时处理更多的数据包,从而提高系统的并行性和带宽。
改善网络性能:更多的虚拟通道可以提供更多的路由选择,从而改善网络的性能,特别是在网络拥塞的情况下。
可能会增加功耗:由于每个虚拟通道都需要处理和转发数据包,增加虚拟通道的数量可能会增加系统的功耗。
延迟可能会有所增加:虚拟通道分配器在决定哪个数据包使用哪个虚拟通道时可能需要更多的时间,这可能会增加数据包的传输延迟。
4.1.2 Output Unit(输出单元)
每个路由器的Output Unit都会维护一个credit计数器或寄存器,用于记录每个目标路由器Input Unit的剩余credit。当一个数据包从Output Unit发送并被目标路由器的Input Unit成功接收和处理后,目标路由器会返回一个credit给源路由器,源路由器的Output Unit会相应地更新credit寄存器,增加对应目标路由器Input Unit的credit计数。输出单元会根据虚拟通道的调度策略,如循环调度或优先级调度,来决定下一个从哪个虚拟通道中取出数据。输出单元通过多个寄存器跟踪下游 VC 的状态。
“input_vc”寄存器是下游VC被分配到的输入VC,VC进到从这个地方后出去到后续的Router。
当 1 位“idle”寄存器的值为“真”时,下游 VC 收到最后分配的数据包的尾部迁移,现在可以重新分配给其他数据包。
“credits”寄存器记录credits数额
4.1.3 Routing Computation(路由计算器)
路由计算器根据预先定义的路由算法(如XY路由或者自适应路由等)来决定每一个数据包的下一个路由路径。这个过程通常依赖于数据包的目的地址和当前的网络状况。计算是根据head flit携带的目的地位置进行的,它为数据包产生输出端口和输出VC
4.1.4 Switch Allocator(开关分配器)
开关分配器用于决定在下一个时钟周期中,哪个输入单元的数据包将被分配到哪个输出单元。它需要协调可能的冲突,例如,当多个输入单元想要发送数据到同一个输出单元的时候。他控制着Crossbar。
4.1.5 Virtual Channel Allocator(虚拟通道分配器)
虚拟通道分配器用于管理输入单元中虚拟通道的使用。当一个数据包从一个输入单元的虚拟通道准备转移到另一个输出单元的虚拟通道时,需要虚拟通道分配器进行协调和分配。开关分配器(Switch Allocator)在决定给某个输出端口分配哪个输入端口的数据包时,就需要考虑这个输出端口剩余的信用(Credit)。只有当输出端口有足够的信用来接收新的数据包,开关分配器才会分配数据包到这个输出端口。Routing Computation 完成后,head flit 请求输出 VC。VC 分配器收集来自所有输入 VC 的请求,然后将输出 VC 分配给请求输入 VC。它保证一个输出VC最多分配给一个输入VC,并且每个输入VC最多被授予一个输出VC。
4.1.6 Crossbar(横梁交叉开关矩阵)
交叉开关一般用多个多路复用器来实现。这些多路复用器的控制信号由开关分配器生成。交叉开关矩阵是路由器的核心,它连接了所有的输入单元和输出单元,在每一个时钟周期中,根据Switch Allocator的决定,会建立或断开特定的输入单元到输出单元的连接。