2. 芯片互联架构基础:片上网络(NoC)的基本概念、拓扑结构、路由算法简介
好,咱们开始聊芯片互联。说实话,很多做芯片设计的同行,一开始都容易忽略互联这一块。大家总觉得,把计算单元做好、把存储安排好,剩下的连线嘛,走通就行了。嗯,我当年也是这么想的,直到第一次做多核芯片,发现数据在片内堵得死死的,CPU核闲着等数据——那感觉,就像高速公路上收费站全开在一条道上。
所以,今天咱们聊聊片上网络,也就是NoC。它不是什么高深莫测的东西,说白了,就是给芯片内部修一套“交通系统”。
2.1 为什么需要片上网络?
传统芯片里,各个模块之间用点对点连线或者共享总线。你想想看,两个模块通信,拉一根线;三个模块,拉三根线;十个模块……线就乱成一锅粥了。而且总线有个致命问题:同一时刻只能有一对设备在通信。多核处理器里,十几个核同时要访问内存,总线就变成了瓶颈。
我个人习惯把NoC看作芯片内部的“互联网”。每个计算单元相当于一台电脑,路由器和链路相当于网络基础设施。数据被切成一个个小包,在片内传输。这样,多个通信可以同时进行,互不干扰。
核心思想: NoC将芯片内部的通信从“电路交换”变成了“分组交换”。每个数据包独立寻址,通过路由器逐跳转发到目的地。
2.2 拓扑结构:芯片的“路网规划”
拓扑结构,就是路由器怎么连、计算单元怎么摆。不同的拓扑,性能、功耗、布线复杂度都不一样。我挑三个最常见的聊聊。
2.2.1 Mesh(网格)拓扑
这是最经典的NoC拓扑。想象一个二维网格,每个节点(路由器)连接一个计算单元,上下左右各连一个邻居。就像围棋棋盘,每个交叉点就是一个路由器。
优点: 结构规整,布线简单,扩展性好。加一个核,就在网格边缘加一行或一列。
缺点: 从左上角到右下角,要走很多跳。而且边缘节点的带宽利用率低,中间的节点容易拥堵。
我的经验: 我在一个AI加速器项目里用过Mesh。当时觉得规整好布线,结果跑ResNet-50时,中间几个路由器负载飙到90%,边缘的几乎闲置。后来加了自适应路由才缓解。所以Mesh虽然简单,但负载均衡得提前算好。
2.2.2 Torus(环面/环形网格)拓扑
Torus是Mesh的“升级版”。它在Mesh的基础上,把每一行、每一列的首尾也连起来。也就是说,最左边和最右边的节点也是邻居,最上边和最下边也是邻居。这样,整个网络就变成了一个“甜甜圈”的形状。
优点: 节点之间的平均跳数更少,网络直径(最远距离)比Mesh小一半。而且所有节点的地位更平等,不容易出现Mesh那种“中心拥堵、边缘闲置”的情况。
缺点: 布线复杂了,因为要绕回环。而且环上的链路如果断了,整个环就瘫痪了。
注意: Torus的绕回连线在物理实现上很麻烦。尤其是当芯片尺寸很大时,从最右边绕回最左边的那根线,可能要跨过整个die,延迟和功耗都不小。我曾经见过一个团队为了省事,把绕回线做成“虚拟环”——用长线绕,结果时序收敛不了,最后不得不改回Mesh。
2.2.3 Ring(环形)拓扑
Ring是最简单的拓扑。所有节点排成一个圈,每个节点只连左右两个邻居。数据包沿着一个方向(单向环)或两个方向(双向环)绕圈传输。
优点: 布线极其简单,路由器设计也简单。适合节点数很少的场景(比如4-8个核)。
缺点: 扩展性差。节点一多,平均跳数线性增长。而且一旦某个节点或链路故障,整个环就断了。
你想想看,Ring就像老式的令牌环网。数据包在环上转一圈,每个节点看一眼是不是给自己的。效率嘛……嗯,只能说够用。
2.3 路由算法:数据包的“导航系统”
拓扑决定了路怎么修,路由算法决定了数据包走哪条路。好的路由算法,能让网络负载均衡、延迟低、不丢包。
2.3.1 维序路由(Dimension-Order Routing, DOR)
维序路由,也叫“XY路由”(在二维Mesh里)。规则很简单:先沿X方向(水平)走到目标列,再沿Y方向(垂直)走到目标行。不能走回头路,不能绕弯子。
举个例子:从(1,2)到(4,5),先向右走到列4,再向上走到行5。路径是固定的,没有选择。
优点: 无死锁。因为路径是确定的,不会出现循环等待。实现简单,硬件开销小。
缺点: 不够灵活。如果某条链路拥堵,它不会绕路。而且某些流量模式下,负载会严重不均。
避坑指南: 我曾经在一个项目里只用维序路由,结果跑矩阵乘法时,所有数据都往对角线方向挤,中间几个路由器直接“爆表”。后来加了自适应路由才解决。所以维序路由虽然简单,但一定要评估你的流量模式。
2.3.2 自适应路由(Adaptive Routing)
自适应路由,就是让数据包根据当前网络的拥堵情况,动态选择路径。比如,如果直走的路堵了,就绕一下。
常见的自适应策略有两种:
- 局部自适应: 每个路由器只看自己的邻居,判断哪条链路空闲,就往哪走。实现简单,但视野有限。
- 全局自适应: 路由器之间交换拥堵信息,每个数据包根据全局状态选路。效果好,但开销大。
优点: 负载均衡好,能应对突发流量。网络利用率高。
缺点: 可能产生死锁(需要额外的死锁避免机制)。硬件实现复杂,需要额外的逻辑和缓冲区。
我的建议: 实际项目中,我一般用“混合路由”。基础路径用维序路由保证无死锁,同时允许在局部拥堵时做有限的自适应绕路。这样既保证了可靠性,又提升了性能。说白了,就是“稳中求变”。
2.4 知识体系总览
下面这张图,把咱们今天聊的内容串起来了。你可以看到,NoC的核心就是拓扑+路由,两者共同决定了芯片互联的性能和成本。
2.5 小结
今天咱们聊了NoC的三个核心要素:
- 为什么需要NoC: 总线不够用,点对点连线太乱。NoC用分组交换的思路,让多个通信并行进行。
- 三种拓扑: Mesh规整但中心拥堵,Torus均衡但布线麻烦,Ring简单但扩展差。选哪个,得看你的芯片规模和流量模式。
- 两种路由: 维序路由简单无死锁,自适应路由灵活但复杂。实际项目中,我建议用混合方案。
嗯,这些就是NoC的基础。下一节咱们会深入聊路由器的微架构设计,看看数据包在路由器内部是怎么一步步被转发出去的。到时候我会拿一个实际项目的路由器设计出来讲讲,保证比今天的内容更“硬核”。