
随着处理器演变为具有数百个核心的复杂“片上系统”(SoC),如何让它们高效通信的挑战变得至关重要。片上网络(NoC)已成为通信的骨干,是数据在芯片上的高速公路系统。然而,与任何高速公路一样,NoC也容易出现严重的交通拥堵,从局部阻塞到被称为死锁的系统级僵局,后者可能完全中止计算。本文通过引入虚拟通道这一极其优雅的架构概念来解决这个根本问题。我们将首先深入探讨其核心原理和机制,探索虚拟通道如何解决队头阻塞和死锁等关键问题。随后,我们将审视这项技术的深远影响,探索其在提升性能、确保公平性以及开拓硬件安全和神经形态计算新前沿方面的应用。
想象一座不是由混凝土和钢铁,而是由硅构成的繁华都市。这就是现代多核处理器,一个“片上系统”(SoC),它容纳了数十亿个晶体管,组织成数百甚至数千个独立的处理核心。就像城市的居民一样,这些核心需要通信——共享数据、协调任务、协同工作。使其通信成为可能的道路、高速公路和交叉路口构成了片上网络(NoC)。我们的任务是理解那些维持这座硅基城市平稳运行的隐藏交通规则,并发现那个防止其陷入混乱的、极其优雅的概念:虚拟通道。
我们如何将信息——一个数据包——从一个核心发送到另一个可能在芯片上相隔几个“街区”的核心?一种简单但缓慢的方法是存储转发交换。这就像通过邮政系统发送包裹:每个邮局(在NoC中是路由器)必须接收到整个包裹后,才能开始将其转发到下一个邮局。如果包裹很大,这种走走停停的过程会引入显著的延迟。
一种更聪明的方法是虫孔路由。想象一列长长的火车离开车站。火车头(报头片元)不会等到最后一节车厢到达下一站后才出发前往再下一站。相反,它会一马当先,在网络交换机中开辟出一条路径。后续的车厢(报文体片元)紧随其后,以流水线方式穿过各个路由器。整个报文像一条虫一样在网络中延伸,同时占据多个路由器。这创建了一个从源到目的地的连续、高速的数据管道,与存储转发相比,极大地降低了延迟。
这种虫孔技术是现代NoC的基础。它快速而高效。但就像任何繁忙的高速公路系统一样,当交通变得拥挤时,我们就会遇到问题。两种特别棘手的拥堵形式可能使整个网络陷入瘫痪。
这些片上网络的设计者面临着两种基本的交通噩梦:局部拥堵和系统级冻结。
想象一下,你在一条单车道上接近一个交通信号灯。你想直行,而且你的前方道路是通畅的。但是你前面的车想左转,却被对向车流堵住了。你被困住了,不是因为你的路被堵了,而是因为你被困在别人后面。这种令人沮丧且低效的情况被称为队头(HoL)阻塞。
在NoC路由器内部,完全相同的情况也会发生。一个路由器的输入端口可能只有一个缓冲区——一个用于所有传入报文的先入先出(FIFO)队列。如果位于此队列头部的报文因为其期望的输出端口正忙而被阻塞,它会阻止同一队列中所有排在其后的报文前进,即使这些报文的目的端口完全空闲。
你可能会认为解决方案就是简单地建一个更大的缓冲区。但这就像把单车道修得更长一样;它只是让更多的车堵在同一个地方。这并不能解决不公平的单列排队这一根本问题。 队头阻塞是资源耦合的弊病,需要更精巧的治疗方法。
比临时拥堵更险恶的是死锁。想象一个四向交叉路口,四辆车同时到达,每辆车都想进入其右侧车辆所占据的空间。每辆车都在等待下一辆车移动,但那辆车也在等待。谁也无法前进。交叉路口陷入了僵局。
这完美地类比了NoC中的死锁。在虫孔路由中,一个报文在请求下一个通道资源的同时,会一直占有着它当前的通道资源。当一组报文形成循环依赖时,就会发生死锁:报文A持有通道 并请求通道 ,而通道 被报文B持有;报文B请求通道 ,而通道 被报文C持有;依此类推,直到某个报文Z请求被报文A持有的通道 。
这就形成了一个任何报文都无法逃脱的“致命拥抱”。谁也无法释放当前持有的通道,因为它们还没有获得下一个通道。结果是灾难性的:一部分网络完全冻结,数据停止流动。这种情况在具有环绕链路的网络(如torus网络)中很容易发生,因为路由路径可以自然形成环路。例如,四个报文可以排列成一个正方形,每个都试图移动到其邻居占据的角落,从而形成一个完美的、无法打破的依赖循环。
我们如何既解决队头阻塞的局部拥堵,又解决死锁的全局冻结?事实证明,一个极其优雅的概念可以同时解决这两个问题:虚拟通道(VC)。
虚拟通道并非一组新的物理线路。相反,它是一个纯粹的逻辑概念。其关键思想是,将每个输入端口的单个大缓冲区划分为几个较小的、独立的FIFO队列。这些就是虚拟通道。每个VC都有自己的状态和自己的流控制。 虽然这些VC共享同一条物理线路来传输数据,但它们是独立管理的。
让我们回到那个不公平的交叉路口。解决队头阻塞的方法是在引道上划出多条车道:一条用于左转车辆,一条用于直行车辆。现在,一条车道上被阻塞的左转车不再妨碍另一条车道上的车辆。
这正是VC解决队头阻塞的方式。当一个报文到达路由器时,它被放入几个VC中的一个。如果 队头的报文被阻塞,路由器的内部交换仲裁器可以自由地查看 的队头。如果该报文的目的地是一个空闲的输出端口,它就可以被调度传输,从而有效地绕过另一个VC中停滞的报文。 从架构上讲,这相当于在传入流量可能相互阻塞之前,根据其预定目的地将它们分流到不同的队列中。 单列长队被打破,高速公路得以保持畅通。
当然,天下没有免费的午餐。实现VC需要更复杂的路由器逻辑,以及至关重要的、更多的总缓冲存储器。如果一个物理通道需要深度为 的缓冲区,那么实现 个虚拟通道就需要总深度为 的缓冲区。 这是一个经典的工程权衡:我们花费更多的芯片面积用于存储器,以换取网络性能的显著提升。
虚拟通道真正的天才之处在于它们如何征服死锁。如果说VC就像在道路上划线,那它们如何防止四向僵局呢?它们通过启用一套新的交通规则来做到这一点。
再次考虑容易发生死锁的torus网络。一个简单的通道环路就是一个等待发生的循环。但是,如果我们给每条物理链路上设置两个虚拟通道 和 呢?我们现在可以施加一条规则。让我们指定其中一条环绕链路为“日界线”。规则是:所有报文都在 中传输。要跨越日界线,报文必须切换到 。并且一旦进入 ,它绝不能再切换回 。
这条简单的规则巧妙地打破了死锁循环。报文再也不能在同一“类别”的资源中环绕整个环路。当使用单个VC时呈循环状的依赖图,现在变成了一条有序路径。报文的旅程是在VC的逻辑空间中的一次单向旅行,使得循环等待成为不可能。这种日界线方案,最少仅需两个VC,是使维度顺序路由在torus网络上无死锁的标准技术。
这个思想可以推广为一种适用于任何网络的强大策略,称为逃逸通道。我们可以将VC分为两组:一大组“自适应”VC,报文可以自由使用灵活、高性能的路由,这些路由可能包含死锁循环;以及一小组独立的“逃逸”VC。逃逸VC被限制使用一种简单的、确定性的、可证明无死锁的路由算法(如维度顺序路由)。
报文可以愉快地在快速的自适应VC上飞驰。但如果它被卡住太久,它就有机会“降级”到逃逸VC网络。由于逃逸网络保证是无死锁的,报文就能保证取得进展并最终到达目的地。这提供了一个安全网,确保了整个网络的全局活性。 由Duato定理确立的这种方法的美妙之处在于其效率。对于torus网络,一个无死锁的逃逸网络仅需两个VC。我们只需要为所有高性能的自适应路由再增加一个VC。总共只需三个虚拟通道,我们就能兼得两全:自适应路由的速度和无死锁系统的保证安全性。
为了让这套复杂的编排工作起来,路由器必须有一种方法来知道何时发送数据是安全的。这通过基于信用的流控制来管理。可以把它看作一个许可系统。发送方路由器为每个下游VC维护一个“信用”计数器,该计数器对应于那里空闲缓冲区槽位的数量。要发送一小块数据(一个片元),路由器必须有一个信用。它“花费”这个信用以发送片元。当下游路由器转发一个片元,从而释放一个缓冲区槽位时,它会向发送方发回一个信用令牌。这个简单的握手协议是基础,它确保缓冲区永远不会溢出。
在真实的芯片中,不同区域可能以不同的时钟速度运行。在这样的“全局异步,局部同步”(GALS)系统中,发回一个信用需要时间——一个我们可以称之为 的往返延迟。如果你的逃逸通道缓冲区容量 太小(例如,小于 ),发送方路由器可能会用尽信用并停顿,即使接收方有空闲空间。这将打破逃逸路径始终能够取得进展的保证。为了真正保证活性,逃逸缓冲区必须足够大以隐藏这种延迟,例如,通过确保 。
此外,要使逃逸通道策略奏效,它必须是一个真正的逃逸通道。如果逃逸VC中的报文必须与自适应VC中的报文以相同的优先级竞争输出端口,它可能会被“饿死”,永远没有机会移动。因此,路由器的内部交换机必须给予逃逸VC更高的、无饿死风险的优先级。
从避免芯片上交通拥堵的简单需求出发,我们揭示了一套丰富而优美的原理。虚拟通道,一个优雅的抽象,作为统一的解决方案,化解了队头阻塞和死锁的双重危险。通过层叠简单的规则——日界线、逃逸路径、信用和优先级——工程师们创造了无形的编排,让数万亿比特的数据每秒钟在我们的处理器上飞舞,构成了数字世界沉默而跳动的心脏。
我们已经了解了虚拟通道的巧妙机制——它们如何将单一物理链路切分成多个逻辑链路。但这就像是只理解了拱门的建造方式,却没有惊叹于它所造就的大教堂和输水道。一个科学原理的真正美妙之处不在于其机制,而在于它所开启的新世界。虚拟通道最初是为解决棘手的网络死锁问题而提出的一个特定修复方案,但它已演变为架构师塑造信息流的基本工具,使得构建当今令人惊叹的复杂片上系统成为可能。现在,让我们来探索这些应用,从驯服多核处理器内部的混乱,到在硅片上构建防火墙,再到为人工大脑提供动力。
在计算的早期,处理器通过共享总线进行通信——一条所有事务都需排队等候的单车道高速公路。这种方式简单且天生有序。总线充当了一个单一的串行化点;如果两个核心试图写入同一内存位置,总线仲裁器会选出一个胜利者,总线上的所有其他核心都会以相同的顺序观察到这个决定。这种全局排序是构建简单的“监听”缓存一致性协议的基石。
但单一总线不具备扩展性。随着我们在芯片上塞入越来越多的核心,总线变成了交通瓶颈。解决方案是片上网络(NoC),一个由路由器和链路组成的网格,允许多个并发通信,就像一个城市的道路网络一样。这解决了带宽问题,但引入了一种新的混乱:重排序。从附近核心发送的消息可能会被一个从遥远核心更早发出但找到了不那么拥堵路径的消息所超越。
这种重排序对缓存一致性来说可能是灾难性的。想象一下,核心 发送一条消息来声明对某个内存位置的所有权,微秒之后,核心 发出请求。在NoC中, 的请求可能先到达内存控制器,打破了操作的逻辑顺序,并可能损坏数据。监听总线那种简单、优雅的世界已不复存在。
虚拟通道是我们恢复秩序的工具。通过为不同类别的相干性消息创建独立的VC——例如,一个VC用于请求,另一个用于失效,第三个用于数据响应——我们可以在每个路由器上管理它们的交互。可以设计协议来优先处理某些消息类型,或确保一个请求在另一个被处理之前得到完全服务,从而防止重排序造成的竞争。VC使我们能够在这种混乱之上强加一种逻辑顺序,让数百个核心即便没有总线那样的全局有序“紧身衣”,也能维持一个一致、统一的内存视图。
一旦我们有了一个能正确工作的系统,我们就可以让它工作得快。在任何现代芯片上,并非所有数据都具有相同的紧迫性。视频游戏的像素可以承受轻微延迟,但工厂机器人的控制信号则不能。这就是服务质量(QoS)的范畴。
虚拟通道是提供QoS的主要机制。通过对VC进行分组,我们可以在相同的物理线路上创建独立的“虚拟网络”。我们可以将一个虚拟网络专用于延迟关键(LC)流量,另一个用于尽力而为(BE)流量。然后,在每个路由器上,我们给予LC网络严格的优先级。结果如何?LC报文在网络中飞速穿行,仿佛BE流量根本不存在,永远不会被积压的非重要数据所阻塞。
在这里我们发现了一种最为优雅的综合。最快的路由算法通常是自适应的——它们可以动态地绕过拥堵区域来路由报文。但正是这种自适应性可能在网络依赖关系中产生循环,再次引出死锁的幽灵。我们是否被迫在性能和正确性之间做出选择?
虚拟通道让我们能够两者兼得。我们可以将我们的主要虚拟网络(用于LC和BE流量)配置为使用高性能的自适应路由。然后,我们再创建一个完全独立的虚拟网络:“逃逸网络”。该网络使用一种简单的、可证明无死锁的算法,如维度顺序路由。如果一个报文在其高性能网络中陷入了潜在的交通拥堵,路由器可以将其分流到永远流动的逃逸网络中以打破循环。这是策略的完美分层:我们获得了自适应的速度和更简单系统的保证正确性,所有这些都运行在相同的物理线路上。
分离流量是一回事;公平地共享资源是另一回事。假设一个链路被10个不同的“高优先级”应用和14个“低优先级”应用使用。我们不希望低优先级的任务完全饿死。我们如何以可控的方式分配带宽?
VC的划分给了架构师一个直接控制此事的旋钮。从长远来看,一个流量类别所获得的带宽份额,与其被分配的VC数量成正比。如果一个路由器的输出端口有8个VC,并且在它们之间进行公平仲裁,那么被分配了 个VC的流量类别平均将获得该链路容量的 。
这使得方法比简单的优先级划分更为精细。设计者可以使用量化指标,如Jain公平指数,来分析特定的VC分配如何影响每个独立流的吞吐量。他们可以调整系统以实现特定的策略目标,确保所有应用都能获得取得进展所需的资源。它将资源管理从粗粒度的、非高即低优先级的事务,转变为一门精细的量化分配艺术。
虚拟通道的力量远远超出了处理器架构的传统范畴,在硬件安全和脑启发计算等领域发挥着关键作用。
在共享云计算和复杂片上系统的时代,安全至关重要。最微妙的威胁之一是“时间侧信道”。一个攻击者的程序,与受害者的安全进程在同一芯片上运行,可能仅通过测量受害者造成的网络拥塞如何影响其自身性能,就能推断出秘密信息。
我们如何才能在芯片网络内部构建一道完美的防火墙来防止此类泄露?虚拟通道是解决方案的基石。首先,我们通过为安全域和非安全域分配各自专用的VC来提供空间隔离。这可以防止攻击者独占所有缓冲区空间。但这还不够;它们仍然可以争夺线路的使用时间。最后一步是提供*时间隔离。这通过将VC与非工作保守调度器(如时分复用(TDM))配对来实现。TDM调度器为每个VC分配一个固定的、重复的时间片。关键在于,如果安全域的VC没有数据要发送,它的时间片就会空闲——它不会*被分配给攻击者的域。结果是一个完美的分割。一个域的报文所经历的延迟变得完全独立于另一个域产生的流量。这种VC和调度的使用,在最基础的硬件层面上构建了一道防泄漏的屏障。
另一个激动人心的前沿是神经形态计算,其目标是构建像大脑一样计算的机器。这些系统,如Intel的Loihi和Manchester的SpiNNaker,将信息表示为在数百万个人工神经元之间发送的“脉冲”——微小的数据包。
在这样的系统中,片上网络就是人工神经系统,其可靠性至关重要。但不同的架构体现了不同的理念。SpiNNaker机器使用的网络在严重拥塞时可能会丢弃报文,依赖于更高级别的软件来处理潜在的信息丢失。相比之下,Intel的Loihi架构则被设计为无损通信。它使用一个带有虚拟通道和基于信用的流控制的网络。当路由器的缓冲区开始填满时,它不是丢弃传入的脉冲,而是暂停向上游路由器发放信用。这会产生一股“背压”波,传播回源头神经元,导致它们暂时减慢放电速率,直到拥塞清除。这确保了没有任何脉冲会因为交通拥堵而丢失。虚拟通道在这一设计中至关重要,用于管理复杂的流控制交互并防止死锁。这与生物系统优雅地适应过载形成了有趣的平行,并且与IBM的TrueNorth等其他方法形成鲜明对比,后者通过在程序运行前为每一个脉冲预先计算一个无冲突的、确定性的调度,从而完全避免了这个问题。
从一个打破死锁的巧妙技巧开始,虚拟通道已成为一把万能钥匙,为我们最先进的计算系统解锁了正确性、性能、公平性和安全性。它们证明了工程学最深刻的原则之一:通过在物理基底之上创建正确的逻辑抽象,我们获得了管理巨大复杂性的能力,并在微小的一粒沙上构建新世界。