互连网络原理与实践(Principles and Practices of Interconnection Networks)
第 1 章 互连网络导论
数字系统在现代社会中无处不在。数字计算机被用于从物理系统仿真、大型数据库管理到文档编制等各种任务。数字通信系统传递着电话呼叫、视频信号和互联网数据。音频和视频娱乐内容也越来越多地以数字形式传输和处理。最后,从汽车到家用电器,几乎所有产品都由数字方式控制。
数字系统由三个基本构件组成:逻辑、存储器和通信。逻辑对数据进行变换和组合------例如执行算术运算或做出判断。存储器保存数据以备日后检索,即在时间上搬移数据。通信则将数据从一个位置搬移到另一个位置。本书讨论的正是数字系统中的通信部分。具体而言,本书探讨用于在数字系统的各子系统之间传输数据的互连网络。
当今大多数数字系统的性能受限于其通信或互连能力,而不是逻辑或存储器。在高端系统中,大部分功耗用于驱动导线,时钟周期的大部分时间也消耗在线延迟上,而不是门延迟上。随着技术进步,存储器和处理器变得更小、更快、更便宜。然而,光速保持不变。制约系统组件之间互连的引脚密度和布线密度,其提升速度慢于组件本身。此外,组件之间的通信频率也远远落后于现代处理器的时钟频率。这些因素共同使互连成为未来数字系统成败的关键。
随着设计者努力更高效地利用稀缺的互连带宽,互连网络正在成为一种近乎通用的解决方案,用于解决现代数字系统的系统级通信问题。互连网络最初是为多计算机(multicomputer)苛刻的通信需求而开发的,如今正开始取代总线,成为标准的系统级互连方式。它们也在取代专用系统中的定制布线,因为设计者们发现,对数据包进行路由比对导线进行布线既更快又更经济。
1.1 关于互连网络的三个问题
在深入讨论之前,我们先回答几个关于互连网络的基本问题:什么是互连网络?在哪里能找到它们?为什么它们重要?
什么是互连网络? 如图 1.1 所示,互连网络是一种可编程的系统,用于在终端之间传输数据。图中有六个终端 T1 至 T6 连接到网络上。当终端 T3 希望与终端 T5 通信某些数据时,它将包含该数据的消息发送到网络中,由网络把消息递送给 T5。网络之所以是"可编程"的,是因为它在不同时间点建立不同的连接。图中的网络可能在一个周期内把消息从 T3 递送到 T5,然后在下一个周期使用同样的资源把消息从 T3 递送到 T1。网络是一个系统,因为它由许多组件构成:缓冲器、通道、交换开关和控制逻辑,它们协同工作以递送数据。
图 1.1 互连网络的功能视图。终端(标记为 T1 至 T6)通过通道连接到网络。通道两端的箭头表示它是双向的,既支持数据流入互连网络,也支持数据流出互连网络。
符合这一定义的网络存在于许多尺度上。片上网络可以在单个处理器内部的存储阵列、寄存器和运算单元之间递送数据。板级和系统级网络把处理器与存储器相连,或把输入端口与输出端口相连。最后,局域网和广域网把企业内或全球范围内彼此独立的系统连接在一起。本书把注意力限定在较小的尺度上:从芯片级到系统级。已有许多优秀教材论述更大尺度的网络。然而,系统级及以下的问题------那里通道很短而数据速率很高------与大尺度网络有本质的不同,需要不同的解决方案。
在哪里能找到互连网络? 几乎所有大到拥有两个以上待连接组件的数字系统中都有它们的身影。互连网络最常见的应用是计算机系统和通信交换机。在计算机系统中,它们把处理器连接到存储器,把输入/输出(I/O)设备连接到 I/O 控制器。在通信交换机和网络路由器中,它们把输入端口连接到输出端口。在控制系统中,它们还把传感器和执行器连接到处理器。凡是在系统的两个组件之间传输比特的地方,都很可能找到互连网络。
就在 20 世纪 80 年代末,这些应用大多还由一种非常简单的互连网络来服务:多分支总线(multi-drop bus)。如果本书写于那个年代,它很可能是一本关于总线设计的书。我们在第 22 章专门讨论总线,因为它们在许多应用中仍然重要。然而今天,所有高性能互连都由点对点互连网络而非总线来完成,而且每年都有更多历史上基于总线的系统转向网络。这一趋势源于性能的非均匀缩放。对互连性能的需求正随处理器性能(以每年 50% 的速率)和网络带宽一同增长。而导线却并没有变得更快:光速和 24 号铜线的衰减并不会因半导体技术的进步而改善。结果是,总线已无法跟上带宽需求,而点对点互连网络------既比总线工作得更快,又能提供并发性------正在迅速取而代之。
为什么互连网络重要? 因为它们是许多系统性能的限制因素。在计算机系统中,处理器与存储器之间的互连网络在很大程度上决定了存储器延迟和存储器带宽这两个关键性能指标。¹ 在通信交换机中,互连网络(在此语境下有时称为交换结构,fabric)的性能在很大程度上决定了交换机的容量(数据速率和端口数量)。由于互连需求的增长速度超过了底层导线的能力,互连已成为大多数系统中的关键瓶颈。
互连网络之所以是比专用布线更有吸引力的替代方案,是因为它们允许多个低占空因数的信号共享稀缺的布线资源。在图 1.1 中,假设每个终端每 100 个周期需要与其他每个终端通信一个字。我们可以为每对终端之间提供一条专用的字宽通道,总共需要 30 条单向通道。然而,每条通道将有 99% 的时间处于空闲。如果换一种做法,把 6 个终端连接成一个环,就只需要 6 条通道(T1 连 T2,T2 连 T3,依此类推,最后 T6 连回 T1)。使用环形网络后,通道数量减少到原来的五分之一,而通道占空因数从 1% 提高到 12.5%。
¹ 如果考虑到现代存储器芯片的大部分访问时间其实是通信延迟,这一点就尤为明显。
1.2 互连网络的用途
要理解互连网络设计所面临的要求,考察它们在数字系统中的使用方式是很有益的。本节考察互连网络的三种常见用途,并看看这些应用如何驱动网络需求。具体而言,对每种应用,我们将考察它如何决定下列网络参数:
- 终端数量
- 每个终端的峰值带宽
- 每个终端的平均带宽
- 所需的延迟
- 消息长度或消息长度的分布
- 预期的流量模式
- 所需的服务质量
- 互连网络所需的可靠性与可用性
我们已经看到,网络中的终端(或端口)数量对应于必须连接到网络的组件数量。除了知道终端数量,设计者还需要知道终端将如何与网络交互。
每个终端会从网络要求一定的带宽,通常以比特每秒(bit/s)表示。除非另有说明,我们假设终端带宽是对称的------即终端的输入带宽与输出带宽相等。峰值带宽 是终端在短时间内向网络请求的最大数据速率,而平均带宽是终端所需的平均数据速率。正如下一节关于处理器---存储器互连的设计所示,在试图最小化互连网络实现成本时,同时了解峰值带宽和平均带宽非常重要。
除了网络必须接受和递送消息的速率之外,网络还要规定递送单条消息所需的时间,即消息延迟 。理想的网络同时支持高带宽和低延迟,但这两个参数之间往往存在折衷。例如,支持高带宽的网络倾向于让网络资源保持繁忙,这常常引起对资源的竞争(contention)。当两条或更多消息想要使用网络中的同一共享资源时就会发生竞争。除了一条消息之外,其余消息都必须等待该资源空闲,从而增加了消息的延迟。反之,如果通过降低带宽需求来减少资源利用率,延迟也会降低。
消息长度(以比特计的消息长度)是另一个重要的设计考虑因素。如果消息很短,网络中的开销对性能的影响会比开销可以分摊到较长消息上的情况更大。在许多系统中,存在若干种可能的消息长度。
每个终端发出的消息在所有可能的目的终端之间如何分布,定义了网络的流量模式(traffic pattern)。例如,每个终端可能以相等概率向所有其他终端发送消息,这就是随机流量模式。如果相反,终端倾向于只向附近的其他终端发送消息,底层网络就可以利用这种空间局部性来降低成本。而在另一些网络中,重要的是规格对任意流量模式都成立。
有些网络还要求服务质量(quality of service,QoS)。粗略地说,QoS 涉及在某种服务策略下公平地分配资源。例如,当多条消息竞争网络中的同一资源时,这种竞争可以用多种方式解决:可以按照消息等待该资源的时长,以先到先服务的顺序为之服务;另一种做法是优先服务在网络中停留时间最长的消息。在这些以及其他分配策略之间如何选择,取决于网络所要求提供的服务。
最后,互连网络所要求的可靠性 (reliability)和可用性 (availability)也会影响设计决策。可靠性衡量网络正确完成消息递送任务的频繁程度。在大多数情况下,消息需要 100% 无丢失地递送。实现 100% 可靠的网络可以通过添加专用硬件来检测和纠正错误、通过更高层的软件协议,或两者混合使用。正如下一节关于分组交换结构的内容所示,网络也有可能丢弃一小部分消息。网络的可用性是它可用且正常运行的时间比例。在互联网路由器中,通常规定 99.999% 的可用性------每年总停机时间不到五分钟。
提供这一水平可用性的挑战在于:用于实现网络的组件往往每分钟会失效好几次。因此,网络必须设计成能在持续运行的同时检测这些故障并迅速恢复。
1.2.1 处理器---存储器互连
图 1.2 展示了用互连网络连接处理器与存储器的两种方式。图 1.2(a) 是一种"舞厅"(dance-hall)体系结构²,其中 P 个处理器通过互连网络连接到 M 个存储体。大多数现代机器采用图 1.2(b) 所示的集成节点(integrated-node)配置,其中处理器和存储器组合在一个集成节点中。在这种安排下,每个处理器都可以通过通信开关 C 访问其本地存储器,而无须使用网络。
² 这种安排之所以称为舞厅体系结构,是因为处理器排在网络一侧、存储体排在另一侧的布局,很像旧时舞厅里男士和女士分列两旁的样子。
图 1.2 用互连网络连接处理器与存储器。(a) 舞厅体系结构,处理器(P)端口与存储器(M)端口分离。(b) 集成节点体系结构,处理器与存储器端口合并,并可本地访问一个存储体。
表 1.1 处理器---存储器互连网络的参数。
参数 取值 处理器端口 1--2,048 存储器端口 0--4,096 峰值带宽 8 Gbytes/s 平均带宽 400 Mbytes/s 消息延迟 100 ns 消息长度 64 或 576 比特 流量模式 任意 服务质量 无 可靠性 无消息丢失 可用性 0.999 至 0.99999
两种配置对网络提出的要求列于表 1.1。处理器端口的数量可以多达数千个,例如满配置的 Cray T3E 有 2,176 个处理器端口;也可以小到单个处理器的 1 个。如今 64 至 128 个处理器的配置在高端服务器中很常见,并且这一数字还在随时间增长。对于集成节点配置,这些处理器端口中的每一个同时也是存储器端口。而对于舞厅配置,存储器端口的数量通常远大于处理器端口的数量。例如,某高端向量处理机有 32 个处理器端口向 4,096 个存储体发出请求。这样大的比例可以最大化存储器带宽,并降低体冲突(bank conflict)的概率------体冲突指两个处理器同时要求访问同一个存储体的情况。
现代微处理器每秒执行约 10⁹ 条指令,每条指令可能需要从存储器取两个 64 位字(一个用于指令本身,一个用于数据)。如果其中一次访问在缓存中未命中,通常要从存储器取回一个 8 字的块。如果真的需要每个周期从存储器取 2 个字,这就需要 16 Gbytes/s 的带宽。幸运的是,全部指令中只有约三分之一会引用存储器中的数据,而且缓存工作得很好,可以减少真正需要访问存储体的引用次数。在典型的缓存未命中率下,平均带宽要低一个数量级以上------约 400 Mbytes/s。³ 然而,为了避免因串行化而增加存储器延迟,大多数处理器仍然需要能够以"每条指令一个字"的峰值速率从存储器系统取数。如果我们过度限制这一峰值带宽,突如其来的存储器请求突发会迅速堵塞处理器的网络端口。把这种高带宽的请求突发挤过较低带宽的网络端口的过程------类似于堵塞的水槽慢慢排水------称为串行化(serialization),它会增加消息延迟。为避免请求突发期间发生串行化,我们需要 8 Gbytes/s 的峰值带宽。
处理器性能对存储器延迟非常敏感,因此对承载存储器请求与应答的互连网络的延迟也很敏感。在表 1.1 中,我们列出 100 ns 的延迟要求,因为这不带网络的典型存储器系统的基本延迟。如果我们的网络额外增加 100 ns 的延迟,有效存储器延迟就翻了一倍。
当 load 和 store 指令在处理器缓存中未命中时(并且在集成节点配置中不是寻址到本地存储器),它们会被转换成读请求和写请求分组,经网络转发到相应的存储体。每个读请求分组包含要读取的存储器地址,每个写请求分组包含存储器地址以及要写入的一个字或一条缓存行。相应的存储体收到请求分组后,执行所请求的操作,并发送相应的读应答或写应答分组。⁴
³ 不过,这一平均需求对应用非常敏感。有些应用的局部性很差,导致缓存未命中率很高,需要 2 Gbytes/s 甚至更高的存储器带宽。
⁴ 在互连网络上运行缓存一致性协议的机器还需要若干额外的分组类型。不过基本约束是相同的。
请注意,我们已开始区分网络中的消息 (message)和分组(packet)。消息是网络的客户------这里是处理器和存储器------交给网络的传输单位。在网络接口处,一条消息可以产生一个或多个分组。这种区分使底层网络得以简化:大消息可以拆成若干较小的分组,不等长的消息也可以拆成定长分组。由于这个处理器---存储器互连中产生的消息相对较小,我们假设消息与分组一一对应。
读请求和写应答分组不含任何数据,但保存一个地址。这个地址加上网络使用的一些头部和分组类型信息,可以轻松放进 64 比特之内。读应答和写请求分组包含同样的 64 比特头部和地址信息,外加一条 512 比特缓存行的内容,因此是 576 比特的分组。这两种分组格式如图 1.3 所示。
图 1.3 处理器---存储器互连所需的两种分组格式。读请求/写应答分组:header + addr(0--63 比特);读应答/写请求分组:header + addr + data(0--575 比特)。
与处理器---存储器互连的典型情况一样,我们不要求任何特定的 QoS。这是因为网络本质上是自我调节(self-throttling)的。也就是说,如果网络变得拥塞,存储器请求将需要更长的时间才能完成。由于处理器未完成(outstanding)的请求数量有限,它们会开始空转,等待应答。因为处理器在空转时不会产生新请求,网络的拥塞就会减轻。这种稳定化行为称为自我调节。大多数 QoS 保证只在网络拥塞时才起作用,而自我调节倾向于避免拥塞,因此 QoS 在处理器---存储器互连中用处不大。
该应用要求一个本质上可靠、无分组丢失的网络。存储器请求和应答分组不能被丢弃。被丢弃的请求分组将导致一次存储器操作永远挂起。轻则使用户程序因超时而崩溃,重则使整个系统瘫痪。可靠性可以叠加在不可靠的网络之上------例如,让每个网络接口保留每个已发送分组的副本,直到收到确认为止,分组被丢弃时重传(见第 21 章)。然而,这种方法对处理器---存储器互连而言往往会带来不可接受的延迟。根据应用的不同,处理器---存储器互连需要的可用性从三个九(99.9%)到五个九(99.999%)不等。
1.2.2 I/O 互连
互连网络在计算机系统中也用于把 I/O 设备(如磁盘驱动器、显示器和网络接口)连接到处理器和/或存储器。图 1.4 展示了一个典型 I/O 网络的例子,用于把一组磁盘驱动器(图的下方)挂接到一组主机适配器上。该网络的工作方式与
处理器---存储器互连完全相同,但粒度和时序不同。这些差异------尤其是更大的延迟容忍度------把网络设计引向截然不同的方向。
图 1.4 一个典型的 I/O 网络把若干主机适配器(HA)连接到更多数量的 I/O 设备------这里是磁盘驱动器。
磁盘操作以 4 Kbytes 或更大的扇区为单位进行传输。由于磁盘的旋转延迟加上磁头重新定位所需的时间,一次扇区访问的延迟可能长达数毫秒。一次磁盘读的执行过程是:由主机适配器发送一个控制分组,指明要读取的磁盘地址(设备和扇区)以及作为读取目标的存储器块。磁盘收到请求后,安排一次磁头移动以读取所请求的扇区。磁盘读完所请求的扇区后,向相应的主机适配器发送一个响应分组,其中包含该扇区的数据并指明目标存储器块。
表 1.2 I/O 互连网络的参数。
参数 取值 设备端口 1--4,096 主机端口 1--64 峰值带宽 200 Mbytes/s 平均带宽 1 Mbytes/s(设备)/ 64 Mbytes/s(主机) 消息延迟 10 μs 消息长度 32 字节或 4 Kbytes 流量模式 任意 可靠性 无消息丢失ᵃ 可用性 0.999 至 0.99999 ᵃ 少量丢失是可以接受的,因为失败的 I/O 操作的错误恢复比失败的存储器引用要平缓得多。
高性能 I/O 互连网络的参数列于表 1.2。该网络最多连接 64 个主机适配器,每个主机适配器下可以挂许多物理设备,例如硬盘。本例中每个主机适配器最多挂 64 个 I/O 设备,共 4,096 个设备。更典型的系统可能把几个主机适配器连接到一百来个设备。
磁盘端口的峰值带宽与平均带宽之比很高。当磁盘连续传输扇区时,它可以以高达 200 Mbytes/s 的速率读出数据,这一数字决定了表中的峰值带宽。更典型的情况是,磁盘在扇区之间必须做一次磁头移动,平均耗时 5 ms(或更多),结果是平均数据速率为每 5 ms 一个 4-Kbyte 扇区,即不到 1 Mbyte/s。由于每个主机端口要处理来自 64 个磁盘端口的汇聚流量,主机端口的峰值与平均带宽之比要低一些。
设备端口上峰值与平均带宽之间的巨大差异,要求网络拓扑具有汇聚 (concentration)功能。设计一个能同时支持所有设备峰值带宽的网络当然是足够的,但这样得到的网络会非常昂贵。另一种做法是只按平均带宽设计网络,但正如处理器---存储器互连例子中所讨论的,这会引入串行化延迟;在峰值/平均带宽比如此之高的情况下,这种串行化延迟会相当大。更高效的做法是把许多设备的请求汇聚到一个"聚合"端口上。该聚合端口的平均带宽与共享它的设备数量成正比。然而,由于各个设备很少向网络请求其峰值带宽,众多设备中同时有两个以上向聚合端口要求峰值带宽的可能性很小。通过汇聚,我们实际上降低了峰值与平均带宽需求之间的比率,从而可以用更低廉的实现避免过大的串行化延迟。
与处理器---存储器网络一样,消息载荷长度是双峰的,但两个峰之间的差距更大。网络承载短(32 字节)消息来请求读操作、确认写操作和执行磁盘控制;而读应答和写请求消息则需要很长(8 Kbyte)的消息。
由于磁盘操作的固有延迟很大(毫秒级),且作为单位传输的数据量也很大(4 Kbyte),网络对延迟不敏感。把延迟增加到 10 μs 只会造成可以忽略的性能下降。这一宽松的延迟指标使得构建高效的 I/O 网络比构建延迟至关重要的处理器---存储器网络要简单得多。
基于集群的并行计算机中用于快速消息传递的处理机间通信网络,在带宽和粒度方面实际上与 I/O 网络非常相似,故不再单独讨论。这类网络常称为系统域网络(system-area network,SAN),它们与 I/O 网络的主要区别在于对消息延迟更敏感,一般要求网络延迟小于几微秒。
在磁盘存储用于保存企业关键数据的应用中,要求极高的可用性。如果存储网络宕机,业务就随之中断。存储系统具有 0.99999(五个九)的可用性------每年停机不超过五分钟------并不罕见。
1.2.3 分组交换结构
互连网络一直在取代总线和交叉开关(crossbar),成为通信网络交换机和路由器的交换结构(switching fabric)。在这类应用中,互连网络充当更大尺度网络(局域网或广域网)中路由器的一个组成部分。图 1.5 展示了这种应用的例子。一组线卡(line card)端接大尺度网络的通道(通常是带宽 2.5 Gbits/s 或 10 Gbits/s 的光纤)。⁵ 线卡处理每个分组或信元,确定其目的地,验证其是否符合服务协议,重写分组的某些字段,并更新统计计数器。然后线卡把每个分组转发给交换结构,交换结构负责把每个分组从源线卡转发到目的线卡。在目的侧,分组被排队并调度到输出网络通道上发送。
图 1.5 一些网络路由器把互连网络用作交换结构,在线卡之间传递分组;线卡负责在网络通道上收发分组。
⁵ 当今一台典型的高端 IP 路由器端接 8 到 40 条 10 Gbits/s 通道,至少有一家厂商已扩展到 512 条通道。随着路由器聚合带宽大约每 18 个月翻一番,这些数字预计还会增长。
表 1.3 分组交换结构的参数。
参数 取值 端口 4--512 峰值带宽 10 Gbits/s 平均带宽 7 Gbits/s 消息延迟 10 μs 分组载荷长度 40--64 Kbytes 流量模式 任意 可靠性 丢失率 < 10⁻¹⁵ 服务质量 需要 可用性 0.999 至 0.99999
表 1.3 列出了用作交换结构的典型互连网络的特性。交换结构的需求与处理器---存储器网络和 I/O 网络的需求之间最大的差别,是其高平均带宽以及对服务质量的需求。
交换结构的分组长度较大,加上对延迟不敏感,简化了网络设计,因为延迟和消息开销不必被高度优化。确切的分组长度取决于路由器使用的协议。对于互联网协议(IP),分组长度从 40 字节到 64 Kbytes 不等,⁶ 大多数分组长 40、100 或 1,500 字节。与前两个例子一样,分组也分为短控制消息和大数据传输两类。
⁶ 实际上 IP 分组最长为 64 Kbytes(含头部);常见的长度分布集中在 40 字节(TCP 确认)、约 100 字节和 1,500 字节(以太网 MTU)三处。
网络交换结构不像处理器---存储器或 I/O 互连那样能自我调节。无论交换结构内部是否拥塞,每个线卡都会持续不断地发送稳定的分组流;与此同时,交换结构还必须为某些类别的分组提供有保证的带宽。为满足这一服务保证,交换结构必须是无干扰(non-interfering)的。也就是说,发往线卡 a 的流量出现超额------也许是由于瞬时过载------不应干扰或"偷走"发往另一线卡 b 的流量的带宽,即使发往 a 的消息和发往 b 的消息在整个结构中共享资源。这种无干扰需求对网络交换结构的底层实现提出了独特的要求。
交换结构有一个有趣的方面可能简化其设计:在某些应用中,丢弃极小一部分分组------比如说每 10¹⁵ 个分组中丢弃一个------是可以接受的。
在因其他原因(从输入光纤上的比特错误------典型误码率在 10⁻¹² 到 10⁻¹⁵ 之间------到线卡队列溢出)已经在执行分组丢弃的场合,这是允许的。在这些情况下,通常由更高层协议处理被丢弃的分组,因此路由器用丢弃相关分组的方式来处理极不可能发生的情况(如内部比特错误)是可以接受的,只要这种丢弃的速率远低于其他原因造成的分组丢弃速率。这与处理器---存储器互连形成对照------在那里,丢失一个分组就可能锁死整台机器。
⁶ 以太网协议把最大分组长度限制在 1,500 字节以内。
1.3 网络基础
为满足特定应用(如上述应用)的性能指标,网络设计者必须在技术约束之内实现网络的拓扑 (topology)、路由 (routing)和流量控制(flow control)。正如前几节所述,互连网络效率的关键在于通信资源是共享的。互连网络不是在每对终端之间建立专用通道,而是用一组由共享通道相连的共享路由器节点来实现。这些节点的连接模式定义了网络的拓扑。消息从源终端到目的终端的递送,要经过共享通道和节点上的若干跳。好的拓扑会利用网络封装技术的特性------例如芯片封装上的引脚数、机柜之间可连接的电缆数------来最大化网络的带宽。
拓扑选定之后,消息到达目的地的路径(节点和通道的序列)可能有很多条。路由 决定消息实际走哪一条。好的路径选择要在平衡网络共享资源负载的同时最小化路径长度(通常以经过的节点数或通道数衡量)。路径长度显然影响消息通过网络的延迟;而资源上的需求或负载衡量该资源被利用的频繁程度。如果一个资源过度利用而另一个资源闲置------称为负载失衡(load imbalance)------网络递送消息的总带宽就会下降。
流量控制决定哪些消息随时间获得对特定网络资源的访问权。随着资源利用率提高,流量控制的影响愈发关键;好的流量控制能以最小延迟转发分组,并在高负载下避免资源闲置。
1.3.1 拓扑
互连网络由一组共享的路由器节点和通道组成,网络的拓扑指这些节点和通道的安排方式。互连网络的拓扑类似于道路地图:通道(如同道路)把分组(如同汽车)从一个路由器节点(交叉路口)运送到另一个。例如,图 1.6 所示的网络由 16 个节点组成,每个节点连接 8 条通道:到每个邻居各 1 条,来自每个邻居各 1 条。这个特定网络具有环面 (torus)拓扑。图中节点用圆圈表示,每一对通道(每个方向一条)用连接两个节点的一条线表示。该拓扑也是一个直接网络(direct network),即拓扑的 16 个节点各关联一个终端。
图 1.6 网络拓扑是节点(用编号 00 至 33 的圆圈表示)及连接节点的通道的安排。图中每条线代表一对通道(每个方向一条)。在这个 4×4 的二维环面(即 4 元 2 立方体,4-ary 2-cube)拓扑中,每个节点连接 8 条通道:到 4 个邻居各 1 条,来自 4 个邻居各 1 条。
好的拓扑利用可用封装技术的特性,以最低成本满足应用的带宽和延迟要求。为最大化带宽,拓扑应当充分利用底层封装技术所提供的对分带宽(bisection bandwidth)------即系统中点处的带宽。
例如,图 1.7 展示了图 1.6 的网络可以如何封装。每 4 个节点一组放置在一块竖直的印制电路板上,再用一块背板电路板把 4 块电路板连接起来,就像把 PCI 卡插到 PC 的主板上一样。对这个系统而言,对分带宽就是能穿越这块背板的最大带宽。假设背板宽度足以容纳 256 个信号,每个信号以 1 Gbit/s 的数据速率工作,则总对分带宽为 256 Gbits/s。
图 1.7 16 节点环面拓扑的一种封装。每 4 个节点封装在一块印制电路板上,4 块电路板连到一块背板。第三列的背板通道画在背板右缘。背板宽度上的信号数(256)决定了这种封装的对分带宽。
回顾图 1.6,恰好有 16 条单向通道穿过拓扑的中点------记住图中每条线代表两条通道(每个方向一条)。要充分利用 256 个信号的对分带宽,每条穿越对分线的通道应为 256/16 = 16 个信号宽。然而,我们还必须考虑每个节点将封装在单个 IC 芯片上的事实。本例中,每个芯片的引脚只够支持 128 个信号。由于拓扑要求每个节点共 8 条通道,每个芯片的引脚约束把通道宽度限制为 128/8 = 16 个信号。幸运的是,引脚限制给出的通道宽度恰好等于充分利用对分带宽所需的信号数。
作为对照,考虑图 1.8 所示的 16 节点环形网络。每个节点连接 4 条通道,因此引脚约束把通道宽度限制为 128/4 = 32 个信号。有 4 条通道穿越对分线,为了充分利用对分带宽,我们希望把这些通道设计成 256/4 = 64 个信号宽,但引脚只允许这个宽度的一半。因此,在相同的技术约束下,环形拓扑只能提供环面拓扑一半的带宽。就带宽而言,环面显然是更优的选择,它在系统中点处为每个节点提供全部 32 Gbits/s 的带宽。
图 1.8 在本例的约束下,16 节点环形网络的延迟低于图 1.6 的 16 节点二维环面。这一低延迟是以较低吞吐率为代价获得的。
然而,高带宽并不是衡量拓扑性能的唯一标准。假设有另一个应用,在相同技术约束下只需要 16 Gbits/s 的带宽,但要求尽可能低的延迟。再假设该应用使用相当长的 4,096 比特分组。要实现低延迟,拓扑必须在"节点间平均距离小"的愿望与"串行化延迟低"之间取得平衡。
节点之间的距离称为跳数 (hop count),以消息平均必须穿越的通道和节点数来衡量。要减小这一距离,就要增大节点度(node degree,进出每个节点的通道数)。然而,由于每个节点受固定引脚数限制,增加通道数会导致通道变窄。把大分组挤过窄通道会引起串行化延迟。为了看清这一折衷如何影响拓扑选择,我们重新审视这两个 16 节点拓扑,但这次关注消息延迟。
首先,为了量化跳数引起的延迟,需要假设一个流量模式。为简单起见,我们采用随机流量:每个节点以相等概率向其他每个节点发送。随机流量下的平均跳数就是节点间的平均距离。对我们的环面拓扑,平均距离为 2;对环网,平均距离为 4。在典型网络中,每跳延迟可能是 20 ns,即环面的总跳数延迟为 40 ns,环网为 80 ns。
然而,环网的宽通道使其串行化延迟低得多。在 32 信号的通道上发送一个 4,096 比特的分组需要 4,096/32 = 128 个通道周期。我们 1 GHz 的信号速率对应 1 ns 的周期,因此串行化延迟为
128 ns。如果网络设计得高效,这一串行化时间只需付出一次,因此分组通过环网的平均延迟为 80 + 128 = 208 ns。对环面做类似计算,串行化延迟为 256 ns,总延迟为 296 ns。尽管环网的平均跳数更大,但物理封装的约束使它对长分组具有更低的延迟。
正如这里所看到的,没有一种拓扑对所有应用都是最优的。不同的约束和要求适合不同的拓扑。第 3 至第 7 章将更详细地讨论拓扑。
1.3.2 路由
网络采用的路由方法决定分组从源终端节点到目的终端节点所走的路径。一条路由或路径是通道的有序集合 P={c1,c2,...,ck}P = \{c_1, c_2, \ldots, c_k\}P={c1,c2,...,ck},其中通道 cic_ici 的输出节点等于通道 ci+1c_{i+1}ci+1 的输入节点,源是通道 c1c_1c1 的输入,目的是通道 ckc_kck 的输出。在有些网络中,每个源到每个目的只有一条路由;而在另一些网络(如图 1.6 的环面网络)中,可能的路径有很多条。当路径很多时,好的路由算法无论面对怎样的流量模式,都能把负载均匀地平衡到各条通道上。继续我们的道路地图类比:拓扑提供地图------道路和交叉路口,路由方法则驾驶汽车,决定在每个路口向哪边转弯。正如在道路上为汽车选路一样,重要的是分散交通------把负载平衡到不同的道路上,而不是让一条路拥塞而与之平行的道路空空如也。
图 1.9 展示了图 1.6 网络中从节点 01 到节点 22 的两条不同路由。图 1.9(a) 中,分组采用维序路由 (dimension-order routing):先在 x 维路由到达节点 21,再在 y 维路由到达目的地节点 22。这条路由是最小路由 (minimal route),因为它是从 01 到 22 的最短路径之一(共有 6 条)。图 1.9(b) 展示了另一条路由,它是非最小(non-minimal)的,走了 5 跳而不是最少的 3 跳。
图 1.9 在图 1.6 的二维环面中从 01 到 22 的两种路由方式。(a) 维序路由先在 x 维移动分组,再在 y 维移动。(b) 非最小路由需要超过最小路径长度的跳数。
维序路由虽然简单且最小,但对某些流量模式会造成严重的负载失衡。例如,考虑在图 1.9(a) 中再加入一条从节点 11 到节点 20 的维序路由。这条路由也使用从节点 11 到节点 21 的通道,使其负载翻倍。通道的负载 是终端节点试图通过它发送的平均带宽量。把负载对终端向网络注入数据的最大速率归一化,这条通道的负载为 2。更好的路由算法在这种情况下可以把归一化通道负载降到 1。由于维序路由把两倍于必要的负载压在这单一通道上,该流量模式下网络的带宽将只有其最大值的一半。更一般地说,所有在每个源---目的对之间选择单一固定路径的路由算法------称为确定性路由算法(deterministic routing algorithm)------都特别容易因负载失衡而带宽低下。这些问题以及其他路由算法设计问题将在第 8 至第 10 章中更详细地讨论。
1.3.3 流量控制
流量控制管理分组沿其路由前进时对资源的分配。大多数互连网络中的关键资源是通道和缓冲器。我们已经看到通道在节点之间运输分组的作用。缓冲器是在节点内部实现的存储(如寄存器或存储器),使分组可以在节点上暂时停留。继续我们的类比:拓扑决定道路地图,路由方法驾驶汽车,流量控制则控制红绿灯------决定汽车何时可以驶过下一段道路(通道),何时必须拐进停车场(缓冲器)让其他汽车先行。
要实现拓扑和路由方法的性能潜力,流量控制策略必须避免可能使通道闲置的资源冲突。例如,它不应让一个本可使用空闲通道的分组被阻塞,仅仅因为它在等待一个缓冲器,而该缓冲器正被另一个阻塞在繁忙通道上的分组占用。这种情形类似于:一辆想直行的车被堵在一辆等待车流间隙左转的车后面。解决方案------无论对流量控制还是对公路交通------是增加一条(左转)车道,解除资源依赖关系,使被阻塞的分组或汽车无须等待即可前进。
好的流量控制策略是公平的,并能避免死锁。不公平的流量控制策略可能使分组无限期等待,就像在没有红绿灯的繁忙街道上试图左转的汽车。死锁(deadlock)是指一圈分组互相等待对方释放资源、因而被无限期阻塞的情形------这与我们道路地图类比中的交通僵局(gridlock)颇为相似。
我们通常用时空图(time-space diagram)来描述流量控制方法,如图 1.10 所示。图中给出了 (a) 存储转发流量控制和 (b) 直通流量控制的时空图。两幅图中,横轴为时间,纵轴为空间。时间以周期表示;空间通过列出分组发送所用的通道来表示。每个分组被分为 5 个定长的微片(flit)。flit(flow control digit,流量控制数字)是流量控制方法识别的最小信息单位。选择较小的定长可以简化路由器设计,而长度不是 flit 整数倍的分组也不会带来大的开销。同一分组的每个 flit(用带标记的方框表示)正通过网络的四条通道发送。某个 flit 在某周期占用通道带宽时,图中就画出相应方框。如图 1.10 所示,流量控制技术的选择会显著影响分组通过网络的延迟。
图 1.10 展示两种流量控制方法的时空图。纵轴表示空间(通道),横轴表示时间(周期)。(a) 存储转发流量控制:一个分组(本例含 5 个 flit)先在一条通道上完整传输完毕,然后才开始在下一条通道上传输。(b) 直通流量控制:分组在各通道上的传输是流水化的,每个 flit 一到达就在下一条通道上传输。
流量控制将在第 12 和第 13 章中更详细地讨论。与流量控制和路由相伴产生的死锁、活锁(livelock)、树饱和(tree saturation)和服务质量问题将在第 14 和第 15 章处理。
1.3.4 路由器体系结构
图 1.11 展示了图 1.6 网络中 16 个节点之一的内部简化视图。四条输入通道各关联一个缓冲器,这些缓冲器保存到达的 flit,直到它们被分配到离开所需的资源。一旦一个 flit 能确保在其路径上的下一个路由器(下游路由器)中获得缓冲空间,它就可以开始竞争对交叉开关的访问。交叉开关可以配置为把路由器的任何输入缓冲器连接到任何输出通道,但受如下约束:每个输入至多连接一个输出,每个输出至多连接一个输入。裁决对交叉开关及路由器其他共享资源的所有潜在请求的任务,落在分配器(allocator)身上。要前进到下一个路由器,输入缓冲器中的一个 flit 必须被分配到:其路由下一节点上的缓冲空间、路由下一条通道上的带宽,并且必须赢得穿越交叉开关的分配。路由器体系结构将在第 16 至第 21 章中详细介绍。
图 1.11 路由器的简化框图。经输入通道到达的 flit 存入与各输入关联的缓冲器。一组分配器为等待的 flit 分配下一节点上的缓冲器和通道带宽。当 flit 获得所需资源后,由交叉开关转发到输出通道。
1.3.5 互连网络的性能
互连网络的性能主要用"延迟---提供流量"(latency vs. offered traffic)曲线来描述,如图 1.12 所示。图中画出分组的平均延迟------从分组的第一比特到达源终端到最后一比特到达目的终端的时间------随提供流量(offered traffic,网络每个源终端产生的平均流量,单位 bits/s)变化的关系。要画出一条具体的延迟---提供流量曲线,还必须指明流量模式(例如随机流量)。
图 1.12 互连网络的延迟---提供流量曲线。提供流量较低时,延迟趋近零负载延迟 T0T_0T0。延迟在饱和吞吐率 λS\lambda_SλS 处趋向无穷大。饱和吞吐率受拓扑上限 2BC/N2B_C/N2BC/N 和路由上限 ΘR\Theta_RΘR 的约束。
虽然延迟---提供流量曲线最准确地刻画了互连网络的最终性能,但它们没有简单的闭式表达式,一般要通过离散事件仿真得到。为了在互连网络设计的早期阶段指导我们对折衷的理解,我们采用一种渐进式的网络性能分析方法,与我们对拓扑、路由、流量控制的探索顺序相一致。
零负载延迟 (zero-load latency)给出分组通过网络平均延迟的下界。零负载假设是指分组从不与其他分组竞争网络资源。在这一假设下,分组的平均延迟等于其串行化延迟加跳数延迟。例如,考虑图 1.6 的环面网络,分组长度 L = 512 比特,通道带宽 b = 16 Gbits/s,随机流量。此时串行化延迟为 L/b = 32 ns。随机流量下最低的跳数延迟出现在最小路由时,平均跳数为 HminH_{min}Hmin = 2。设路由器延迟 trt_rtr = 10 ns,则最小跳数延迟为 HmintrH_{min}t_rHmintr = 20 ns。于是,仅根据网络的拓扑、封装和流量模式,分组通过网络的平均延迟下界为 32 + 20 = 52 ns。
把网络实际采用的路由算法的平均跳数 HavgH_{avg}Havg 纳入考虑,可以得到分组延迟更紧的界,因为 Havg≥HminH_{avg} \ge H_{min}Havg≥Hmin。最后,网络采用的流量控制可能使性能在拓扑和路由给出的界的基础上进一步降低。例如,如果网络采用存储转发流量控制(图 1.10(a)),零负载延迟将是 Havgtr×L/bH_{avg}t_r \times L/bHavgtr×L/b,而不是 Havgtr+L/bH_{avg}t_r + L/bHavgtr+L/b。实际的零负载延迟 T0T_0T0 综合了拓扑的约束以及路由和流量控制的实际性能。这些依次收紧的延迟界在图 1.12 中表现为曲线的水平渐近线。
类似的方法可以给出一组网络吞吐率的上界。每个源向网络提供一定量的流量,而吞吐率 (throughput,或称接受流量)是流量被递送到目的终端的速率(bits/s)。对我们随机流量的例子,一半流量必须穿越网络的对分线。对分线由 16 条通道组成,总带宽 BCB_CBC = 256 Gbits/s。因此,每节点的流量不能超过 2BC/N2B_C/N2BC/N,即 32 Gbits/s。这个界假设流量在对分线上完全均衡。因此,任何具体的路由算法 R 都无法超过这个界;若发生负载失衡,计入路由算法的吞吐率 ΘR\Theta_RΘR 实际上可能更低(ΘR≤2BC/N\Theta_R \le 2B_C/NΘR≤2BC/N)。最后,如果我们的流量控制因资源依赖导致通道闲置,网络的饱和吞吐率 λS\lambda_SλS 可能显著低于 ΘR\Theta_RΘR 的界。这三个吞吐率界在图 1.12 中表现为垂直渐近线。
采用这种渐进式的性能分析方法------依次推导由拓扑、路由、流量控制给出的越来越紧的界------使我们能够考察所考虑的每项设计决策如何影响性能,而无须让不必要的细节使分析复杂化。例如,我们可以看到拓扑选择如何独立于路由和流量控制地影响延迟。相比之下,试图一次性处理全部性能问题,会使任何单一设计选择的效果难以看清。
在建立了渐进式性能模型之后,我们将在第 23 至第 25 章完整地考虑性能问题。这几章讨论性能测量的一些微妙之处,介绍估计性能的解析方法(基于排队论和概率论),讨论测量性能的仿真方法,并给出若干实测例子。
1.4 历史
互连网络有着跨越数十年的丰富历史。网络至少沿三条并行的线索发展:电话交换网络、处理机间通信和处理器---存储器互连。
电话交换网络与电话本身一样历史悠久。早期的电话网络由机电式纵横制(crossbar)交换机或机电式步进制交换机构成。直到 20 世纪 80 年代,大多数市话交换机仍由机电继电器构成,尽管长途(toll)交换机到那时已完全电子化、数字化。电话交换的关键进展包括 1953 年的无阻塞多级 Clos 网络 37 和 1962 年的 Beneš 网络 17。今天许多大型电话交换机仍由 Clos 或类 Clos 网络构建。
最早的处理机间互连网络是连接成二维阵列的相邻处理器寄存器之间的连接。1962 年的 Solomon 机器 172 就是这类处理器阵列的例子。这些早期网络不做路由,因此处理器必须显式地向非邻居中继通信,性能差且编程相当复杂。到 20 世纪 80 年代中期,路由器芯片(如环面路由芯片 56)被开发出来,可以在无须处理器干预的情况下经中间节点转发消息。
多年来,处理机间互连网络经历了一系列拓扑风潮------很大程度上由封装及其他技术约束驱动。早期机器,如 Solomon 172、Illiac 13 和 MPP,基于简单的二维网格或环面网络,因为它们物理上规则。从 20 世纪 70 年代末开始,二进制 n 立方体(即超立方体,hypercube)网络因直径小而流行起来。围绕超立方体网络设计了许多机器,如 Ametek S14、Cosmic Cube 163、nCUBE 计算机 134, 140 和 Intel iPSC 系列 38, 155。20 世纪 80 年代中期,人们证明在现实封装约束下低维网络优于超立方体 2, 46,大多数机器回到了二维或三维网格或环面网络。因此,过去十年建造的大多数机器都回到了这类网络,包括 J-machine 138、Cray T3D 95 和 T3E 162、Intel DELTA 117 和 Alpha 21364 131 等。今天,路由器芯片的引脚带宽相对于消息长度已经很高,这促使人们使用节点度高得多的网络,如蝶形(butterfly)和 Clos 网络。我们可以预期未来十年将向这类网络转变。
处理器---存储器互连网络出现于 20 世纪 60 年代末,当时并行处理器系统引入了对准网络(alignment network),使任何处理器都能访问任何存储体而不增加其他处理器的负担 110。最小的机器为此采用交叉开关,较大的机器则以舞厅式布局采用蝶形(或等价)拓扑的网络。这一主题的变体在整个 80 年代被用于许多共享存储器并行处理机。
互连网络演化的三条线索最近汇合了。自 20 世纪 90 年代初以来,处理器---存储器网络与处理机间互连网络的设计几乎没有差别------事实上,两者使用相同的路由器芯片。电话交换的 Clos 和 Beneš 网络的一个变体也以胖树(fat tree)拓扑 113 的形式出现在多处理机网络中。
我们对历史的讨论聚焦于拓扑,因为它是网络最可见的属性。当然,路由和流量控制方法与拓扑并行演化。早期的路由芯片采用简单的确定性路由,以及电路交换或存储转发分组交换。后来的路由器采用自适应路由,配以精巧的死锁避免方案和虚通道(virtual-channel)流量控制。
1.5 本书的组织
下一章我们首先完整描述一个简单的互连网络------从拓扑一直讲到逻辑门------以便读者在深入细节之前获得对互连网络的"大图景"认识。其余各章覆盖细节,组织为五个主要部分:拓扑、路由、流量控制、路由器体系结构和性能。每个部分分为若干章,每部分的第一章讲述基础,后面的章节讲述更深入的主题。