多级立方体网络怎么学?从交叉开关到逐级寻径彻底搞懂
2026/9/17 18:27:14 网站建设 项目流程

第一次翻开《计算机系统结构》教材,看到“多级立方体网络”那一页的人,十有八九会愣住:满页的开关、交叉线、端口编号,还有一堆 Cube、Omega、STARAN 的术语往外蹦。最要命的是教材往往只给一张图加一小段“级间连接按立方体函数排列”,然后就开始讲控制方式了。图的每一根线都认识,但整体在干什么,完全没概念。

这篇文章就是把“多级立方体网络”这块硬骨头拆开嚼碎:它到底解决什么问题、为什么叫立方体、每一级开关在干什么、数据是怎么一步一步走到目的地的。目标读者是正在学计算机系统结构的学生、准备考研复试的人,以及工作中突然需要补互连网络基础的同学。全程不堆公式,尽量用大白话和能动手验证的推演方式讲清楚。

1. 先忘掉公式:为什么互连网络不能全用交叉开关

1.1 从办公室电话转接说起

多级互连网络解决的本质问题,一句话:让任意一个输入端能连到任意一个输出端。你可以想象一个办公室里有很多台电话,分机之间要能互相通话。最朴素的办法是给每两台电话之间单独拉一根线——几台电话还能忍,几十台电话线就乱成一团麻了。

另一个极端是设一个总机台,所有分机的线都接到总机上,需要谁跟谁通话时,由总机操作员把两端用跳线连起来。这就是交叉开关网络(Crossbar)。它很直接:M 个输入和 N 个输出交叉成网格,每个交叉点就是一个开关。想连谁就连谁,绝对无阻塞。

交叉开关的缺陷也一目了然:交叉点数量是M×N。在系统结构课程里,一个典型的处理机-存储器互连场景动辄十几个甚至几十个节点。32×32 的交叉网络就需要 1024 个交叉点,每个交叉点还不是一根导线那么简单——它要有通断控制、缓冲、仲裁逻辑。面积、功耗、延迟全上去了。

1.2 交叉开关的成本墙

把交叉开关的成本量化一下,你就能理解为什么工程师们宁可绕远路也要设计多级结构。假设做一个 N×N 的交叉开关网络:

  • 交叉点的数量是 N²;
  • 控制线的数量至少也是 N² 量级;
  • 每个交叉点内部需要驱动电路,负载电容随 N 增大而增加,延迟跟着涨。

N=8 时 64 个交叉点,听起来还行。N=64 时 4096 个交叉点,PCB 布线的复杂度已经让人头皮发麻。要是系统规模到 1024 个节点,百万级交叉点,谁做谁破产。

多级互连网络的思路是:用多个小规模的开关(通常是 2×2)逐级连接,代替一个巨大的交叉开关。N 个输入需要 log₂N 级,每级 N/2 个 2×2 开关,总开关数是 (N/2)·log₂N。算一下账:N=64 时,交叉开关要 4096 个交叉点,多级立方体网络只需要 32×6=192 个 2×2 开关。代价是网络可能阻塞——多个数据同时传输时可能抢同一条链路,但大多数场景下这个取舍非常划算。

1.3 单级网络的另一个问题:数据绕路

有同学可能会问:既然 2×2 开关这么便宜,那我把 N/2 个 2×2 开关排成一排,让数据反复通过它们,不也能实现任何输入到任何输出的连接吗?一次连不通就多绕几圈。

这就是单级互连网络的思想:硬件只有一级,数据要经过多“拍”才能从输入传到输出。比如单级立方体网络,数据从输入端口进去,经过一次交换,再从输出端出来,如果需要的话再绕回到输入端,继续下一轮交换。

单级网络的问题在于:每一次数据都要绕回输入端,控制逻辑要在“当前在第几轮、该做哪个 Cube 操作”之间反复切换。数据走 n 轮,时延是 n 倍。如果十路数据同时在网络里绕,或者说有多路数据要排队等同一个输入端,调度就非常复杂。多级网络正是把单级网络“绕 n 次”的动作摊开成 n 级硬件,每一级负责一个位的变化,数据一路从头走到尾,不用回头。

2. 最小积木:二功能开关和它背后的立方体函数

2.1 二功能开关:只有两个动作的“换道闸”

多级立方体网络的基本单元是一个 2×2 开关,教材里叫二功能开关。它有两个输入 A、B,两个输出 C、D,内部只有两种工作状态:

  • 直通(Straight):A→C,B→D,数据“不换道”;
  • 交换(Exchange):A→D,B→C,数据“交叉换道”。

就这么简单。一个开关只有两个自由度,比十字路口的红绿灯还简单。但无数个这样的开关组合起来,却能完成任意输入端到任意输出端的连接。为什么?因为每一个开关在路径上提供了一次“可选的方向改变”。

初学时容易把“直通”当成什么都不做,这是理解上的一个误区。直通不是不做事,它表示这一级不改变当前数据的某些位;交换则表示这一级把两个配对端点互换。每一级都参与路径构造,只是参与方式是“变”还是“不变”。

2.2 立方体函数 Cube_i:按二进制位配对

接下来是这个知识点的真正核心,也是大多数教材一句话带过导致读者卡壳的地方。

把 N 个端口用二进制编号,从 0 到 N-1。立方体函数 Cube_i 的作用是:把编号第 i 位(从低位算起,i=0,1,2,...)不同的两个端口配对连接起来。

用 N=8 举例,端口编号是 3 位二进制:

  • Cube₀:第 0 位取反。配对为 (0,1)、(2,3)、(4,5)、(6,7)。每一个配对里的两个数,二进制只有最后一位不同。
  • Cube₁:第 1 位取反。配对为 (0,2)、(1,3)、(4,6)、(5,7)。比如 0(000)和 2(010),差的是中间那一位。
  • Cube₂:第 2 位取反。配对为 (0,4)、(1,5)、(2,6)、(3,7)。比如 0(000)和 4(100),差的是最高位。

看明白这个规律了吗?Cube_i 连接的都是“在某个二进制位上互为镜像”的两个端口。这就是“立方体”这个名字的数学来源:一个 n 维超立方体的顶点可以用 n 位二进制编号,相邻顶点之间恰好只有一位不同,每条边就代表一个 Cube_i 操作。

2.3 为什么叫“立方体”:三维直觉

把维度降到 3,画一个正立方体,8 个顶点分别标上 000、001、010、011、100、101、110、111。你会发现:

  • 顶点 000 和 001 之间的边,是第 0 位不同的边——Cube₀;
  • 顶点 000 和 010 之间的边,是第 1 位不同的边——Cube₁;
  • 顶点 000 和 100 之间的边,是第 2 位不同的边——Cube₂。

一个普通的三维立方体只有这 3 个方向,但每条边的两端恰好是一对 Cube 配对。N=8 的互连网络恰恰有 8 个端口,正好对应一个三维立方体的 8 个顶点;每级开关处理一个“方向”的配对,3 级就处理完 3 个二进制位。这就是“多级立方体网络”命名的由来,不是什么玄学,就是按二进制位做维度划分。

推广到 n 维:2ⁿ 个顶点,每个顶点有 n 维坐标,任意两个顶点之间至多差 n 位。从一个顶点走到另一个顶点,最多改变 n 次坐标。对应到网络上,就是最多经过 n 级开关,就能把任意输入连到任意输出。

3. 从单级到多级:三级电话网是怎么“展开”的

3.1 单级网络要重复使用 n 次

有了 2×2 开关和 Cube 函数的配对规则,可以搭一个只有一级的网络:输入端口按 Cube₀ 规则配对,接到 N/2 个开关上。这一级开关能实现什么呢?每个开关可以直通或交换,因此整个网络只能做到“相邻端口互换”——所有配对都在 Cube₀ 的配对内部完成。

想实现跨更远距离的连接怎么办?把数据送回来,把配对规则换成 Cube₁,再来一轮。这就是单级网络的循环使用:同一个硬件,反复配置成 Cube₀、Cube₁、Cube₂……直到数据到达目标端口。相当于一个人要走很远的路,但只有一辆自行车,只能一条路一条路地骑,骑完一段折回来换方向再骑一段。

3.2 多级网络:用空间换时间

多级立方体网络的思路是:不把数据绕回来,而是把 Cube₀、Cube₁、Cube₂ 对应的开关级物理上串起来。第一级处理第 0 位的变换,第二级处理第 1 位,第三级处理第 2 位。数据一路往前走,每经过一级就朝目的地靠近一个维度。

这就是“用空间换时间”:增加硬件级数,但数据不用折返,延迟从 n 次往返降为一次穿越。更重要的是,不同输入的数据可以同时在各级之间流动,形成流水线式的并行传输。这在 SIMD 阵列处理机和多处理机系统中非常关键——互连网络不只是“连得通”,还要能“同时连很多对”。

3.3 8×8 多级立方体网络长什么样

把上面的思路落成一个具体的 8×8 网络:

  • 第 0 级:4 个 2×2 开关,输入对按 Cube₀ 配对,即 (0,1)、(2,3)、(4,5)、(6,7)。
  • 第 1 级:4 个 2×2 开关,输入对按 Cube₁ 配对,即 (0,2)、(1,3)、(4,6)、(5,7)。
  • 第 2 级:4 个 2×2 开关,输入对按 Cube₂ 配对,即 (0,4)、(1,5)、(2,6)、(3,7)。

级与级之间由固定连线连接,这些连线的作用就是把上一级开关的输出端口“重新配对”成下一级需要的输入对。可以这样理解:第 i 级和下一级之间的连线,本质上就是按 Cube_{i+1} 的配对规则重新排列。所以整张图的构造顺序是:先写端口编号 → 按 Cube₀ 画第一级开关 → 按 Cube₁ 配对画第二级开关输入 → 再按 Cube₂ 配对画第三级开关输入。

很多同学觉得图上那些线乱,是因为没有按“配对规则”去读图。你只要盯住一对具体的输入端口,比如 0 和 1,跟着它们在每一级的连线走,会发现它俩在 Cube₀ 这一级确实进同一个开关;出来后被级间连线拆开,分别和 2、3 重新配对进 Cube₁ 的开关。每一级都在重新分组,分组的依据永远是“某一位二进制是否不同”。

4. 数据怎么走:逐级寻径算法的本质

4.1 看出“差几位”,就知道要交换几次

理解多级立方体网络的工作方式,关键是掌握一个核心操作:给定源端口 s 和目的端口 d,计算二者二进制编码的异或结果,有几位是 1,就说明路径上需要做几次交换。

举个例子,源端口 s=1(001),目的端口 d=6(110):

001 ⊕ 110 = 111

异或结果有 3 个 1,表示 s 和 d 在 3 个二进制位上都不同,所以路径上需要 3 次交换——正好对应网络的 3 级。

再来一个例子:s=0(000),d=6(110):

000 ⊕ 110 = 110

异或结果有 2 个 1,只需要 2 次交换。路径会是多少?s 和 d 在第 1 位和第 2 位不同,那么第 1 级做一次 Cube₁ 交换把 0 变成 2,第 2 级做一次 Cube₂ 交换把 2 变成 6,最终到达目的地。第 0 级一直直通即可。

这个“异或差值”法则是整篇内容里最值得记住的技巧。考试时画出路径、判断某级开关该直通还是交换,全靠它。

4.2 每一级开关只负责“一个比特”

为什么第 0 级不能直接处理第 2 位的差异?因为在 8×8 网络里,第 0 级开关的输入配对是 (0,1)、(2,3)、(4,5)、(6,7)。0 和 2 根本不进同一个开关,第 0 级想交换也够不着。

这是多级网络与全连接交叉开关的一个本质区别:每一级开关只能访问“某个特定二进制位”对应的那两个端点。Cube₀ 级只能交换相邻编号端口,Cube₁ 级只能交换隔一个编号的端口,Cube₂ 级只能交换隔四个编号的端口。逐级传递任务,每一级解决一个位,这就是“多级”的含义。

再往深一层:级间连线到底在干什么?它在把上一级处理完的结果,重新分发到下一级合适的开关输入端。第 0 级处理完 bit₀ 后,输出端口集合里的元素还是“邻居配对”的;如果不经过重排,第 1 级开关只能看到相邻对,永远无法处理 bit₁。级间连线做了一次“按位重排”,把需要配对的端口送到同一个开关去,下一级才有机会处理新的位。可以说,开关是“执行者”,级间连线是“调度员”

4.3 控制方式:级控、部分级控、单元控

知道开关该怎么动作,还要解决“由谁来决定动作”的问题。教材里最常见的分类是三种控制方式:

控制方式控制粒度特点实现代价
级控制同一级所有开关共用一个控制信号控制最简单,但每级只能全直通或全交换,灵活性差控制线数量最少,log₂N 根
部分级控制同一级内分成若干组,每组独立控制灵活性居中,是级控和单元控的折中控制线数量取决于分组方式
单元级控制每个 2×2 开关独立控制最灵活,能同时实现多种不同的交换需求控制线数量为 (N/2)·log₂N 根

用打电话来类比:级控制就像整栋楼的电话总机约定“这一分钟所有人只做同一件事”;单元级控制则是每个交换台自己决定接哪条线。灵活性越高,控制线越多,但能支持的传输模式就越丰富。

多级立方体网络在单元级控制下具备自路由特性:数据的目的地址编码就是天然的路由信息,每一级开关读取其中一个二进制位就可以决定直通或交换,不需要外部集中控制器给每个开关下发单独的路由表。这一点和后来更流行的 Omega 网络、Delta 网络一脉相承——它们都继承了“逐级按目的地址某一位选路”的思想。

5. 这网的脾气:阻塞性、置换能力与 STARAN 实践

5.1 为什么它是阻塞网络

多级立方体网络用少量开关换来了低成本和规则化结构,但付出的代价是它不一定无阻塞

想象一下:输入端口 0 要向输出端口 1 发送数据,同时输入端口 2 要向输出端口 3 发送数据。如果两条路径在某个中间节点或某条级间连线上发生重叠,其中一个数据就必须等待或丢弃,这种现象就叫阻塞。

交叉开关网络为什么无阻塞?因为每对输入输出之间有一条独占路径,不存在共享链路。多级立方体网络则不同,多个输入可能汇聚到同一个中间开关或同一条级间线,冲突就成了必然。处理阻塞的常见手段有:传输前先做路径仲裁、加入缓冲队列、失败后重试,或者把一次通信限制为单组数据流。STARAN 这类实际系统的做法就是通过控制方式限制作业规模,换得可预测的延迟。

5.2 它能实现哪些置换

教材中常说的“置换”是一组多对多的输入输出映射,所有输入同时连到所有输出,且不冲突。多级立方体网络在级控制方式下能做到的置换非常有限:因为每级只有两种状态,N=8 时 3 级一共只有 2³=8 种状态组合,显然不可能覆盖全部 8! = 40320 种排列。

单元级控制下灵活得多,N=8 时有 12 个开关,每个开关 2 种状态,理论上 2¹²=4096 种开关配置。去掉链路冲突和非法路径,能实现的合法置换仍只占全部排列的一部分。因此考试里常考这样一个判断题:“多级立方体网络可以实现任意置换”——错误。它只能实现一部分置换,而且是阻塞网络。

如果你需要任意置换和无阻塞,要么回到交叉开关,要么增加网络级数或采用具有重排能力的网络(如 Benes 网络,它是多级网络的一种扩展,能实现任意置换但硬件更多)。系统结构教材安排这么多网络类型,落点就是让你理解“性能与代价的权衡”。

5.3 STARAN 网络与常见考点

多级立方体网络的经典工程代表是 STARAN 相联处理机中使用的 STARAN 网络。它支持两种工作模式:

  • 交换模式:所有级都执行同一个 Cube 函数,等效于完成一次整体重排;
  • 置换模式:每一级独立决定交换或直通,实现更复杂的置换。

STARAN 用 4×4 开关模块作为基本构件,而不是裸的 2×2 开关,这样可以在硬件上兼顾灵活性和复杂度。教材把它作为多级立方体网络的案例,主要为了说明这个理论结构真的在真实机器上用过,不是纸面模型。

考研和期末考题里关于多级立方体网络的高频考法总结一下:

  • 画一个 N=8 或 N=16 的多级立方体网络拓扑;
  • 给定源端口和目标端口,标出每一级开关应该直通还是交换;
  • 区分级控制、部分级控制、单元级控制的控制线数量;
  • 判断网络是否无阻塞、能否实现任意置换;
  • STARAN 网络与 Omega 网络的区别:STARAN 属于多级立方体网络,Omega 网络用均匀洗牌互连,但两者在功能上等价——不同教材把它们归入同一族互连网络,只是画法和控制信号的位序不同。

6. 动手验证:三张表彻底搞定多级立方体网络

6.1 第一张表:Cube 函数配对表

不借助仿真工具,一支笔一张纸就能验证前面所有结论。先画一张 N=8 的配对表:

端口编号(二进制)Cube₀ 配对Cube₁ 配对Cube₂ 配对
0(000)(0,1)(0,2)(0,4)
1(001)(0,1)(1,3)(1,5)
2(010)(2,3)(0,2)(2,6)
3(011)(2,3)(1,3)(3,7)
4(100)(4,5)(4,6)(0,4)
5(101)(4,5)(5,7)(1,5)
6(110)(6,7)(4,6)(2,6)
7(111)(6,7)(5,7)(3,7)

这张表的规律就是:Cube_i 连接的两个端口二进制编号只有第 i 位不同。先自己填完这张表,再做下面的路径推演,正确率会明显提升。

6.2 第二张表:源端口到目的端口的路径推演

选一个源端口 s=1,目的端口 d=6,做路径推演。

第一步,异或:

s=001,d=110 001 ⊕ 110 = 111

三个位都是 1,所以三级都要交换。

  • 第 0 级:门控位是 bit₀ = 1,交换,1 变成 0;
  • 第 1 级:门控位是 bit₁ = 1,交换,0 变成 2;
  • 第 2 级:门控位是 bit₂ = 1,交换,2 变成 6。

输出端口 6,成功。

再看一个需要直通的例子:s=0,d=2。

000 ⊕ 010 = 010

只有 bit₁ 是 1,所以第 0 级直通,第 1 级交换(0→2),第 2 级直通。

用这个方法可以验证任意输入输出对,整个过程不依赖画图,纯算就能得到每级开关的状态。考试时先用异或算出交换位置,再去图上核对,基本不会错。

6.3 第三张表:各级开关状态表

把整张网络要完成的多个传输任务放在一起,可以做成一张状态表:

输入端口输出端口第 0 级第 1 级第 2 级
06直通交换交换
14交换直通交换
23交换直通直通
37直通交换交换

注意看第三行和第四行:输入 0→6 和 3→7 都要在第 1 级、第 2 级做交换,如果它们的路径在某个开关处汇聚到同一个输出口,就会冲突。这张表不仅能帮你理解寻径,还能帮你直观感受阻塞:多组传输任务同时配置时,一旦发现某个开关的“交换方向”互相打架,就说明该网络当前状态下无法同时完成这些任务。

6.4 怎么用教材和仿真工具加深理解

光看文章不做练习,过三天就会忘。我的建议是:

  1. 先照上面的办法,手推 10 组不同的输入输出对,把每级开关状态写清楚;
  2. 在纸上完整画一个 8×8 多级立方体网络,不要抄书,先画 Cube 配对表确定开关输入,再连线;
  3. 如果手边有课程配套的仿真实验工具(比如 STAR COP2018 这类计算机组成原理与系统结构教学软件),进去找到互连网络、多级立方体网络的实验模块,把开关状态配上去跑一下,看数据是否按预期到达。

仿真工具最大的价值不是帮你偷懒,而是让你把“推送一个数据从输入到输出”这件事的每一个中间状态可视化。跑通三个例子之后,再回来看教材里那幅图,你就能看出哪根线是 Cube₀、哪根是 Cube₁、哪根是 Cube₂,而不是一团的交叉线了。

7. 几个容易踩的坑和对应的理解纠偏

第一次学这个知识点,几乎所有人都会在下面几个地方卡住,提前说出来能省不少时间。

第一个坑:把级间连线和开关的交换功能混为一谈。级间连线是固定的,不随控制信号变化;开关内部的直通/交换才是“动态”的。连线负责的是重组端口配对,开关负责的是在该配对内部做选择。分清这两者,读图的一大半困难就消失了。

第二个坑:以为单元级控制就能实现任意置换。单元级控制只是让每个开关独立决策,但拓扑结构限制了可置换的范围,阻塞依然存在。能不能实现某种置换,要看整张网络上是否存在一条互不冲突的完整路径组合,而不是看控制方式多灵活。

第三个坑:只记公式不理解异或的本质。很多人背“异或结果有几位是 1 就交换几次”,但不知道为什么要异或。其实异或在超立方体里就是“两个顶点的海明距离”,每一位上的 1 都代表该维度上的坐标需要翻转。理解了这一点,寻径算法就是顺理成章的事,不用背。

第四个坑:忽视端口编号的二进制表示。网络拓扑的一切规律都以二进制编号为基础,编号写不对,Cube 函数、级间连接、寻径全部会错。我见过很多人画图时把端口标成十进制阿拉伯数字,算到一半就开始乱,根源就在这里。无论如何先把所有端口的二进制写在草稿纸最显眼的位置。

回到最初的问题:多级立方体网络到底怎么理解?我的体会是,不要试图一下子背下整张图。先理解 2×2 二功能开关的两种状态,再理解 Cube_i 函数“按二进制位取反配对”的本质,然后把它想象成 n 维立方体上从一个顶点走到另一个顶点、每一步只翻转一个坐标的过程。有了这三层铺垫,后面那些多级连接方式、寻径方式、控制方式都不用死记,全部是自然而然的推论了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询