在大多数普通用户眼里,CPU 也许就是一块金属盖子的电路板而已。可是如果去掉顶盖,深入正中那片小小的集成电路,我们会发现这里有着人类科技史上,最伟大的奇迹。几十亿个晶体管层层叠叠,密密麻麻挤在一起,占据着这个仅有一点几个平方厘米的狭小世界。
晶体管们在“上帝之手”的安排下,组成了各个功能模块。而这些功能模块之间,则是宽阔无比的超高速公路。这条超高速公路如此重要,以至于它的距离、速度和塞车与否,会大大影响这个小小世界的效率。这些模块就是CPU内部的功能模块,例如内存控制器、L3/L2 Cache、PCU、PCIe root complex等等,而这条高速公路,就是我们今天的主角,片内总线了。
虽然 CPU 里的硅片只有一片,其实其中层层叠叠的是不同功能的电路模块,那么不同模块间怎么通讯呢?
概述
什么是片内总线?
是的,处理器内的不同模块就是通过“片内总线”进行通讯的,处理器实际上内部有很多组件,比如内存控制器、L2/L3 Cache(二级缓存、三级缓存)、PCU、PCIe root complex(PCIe 根复合体)等都在一片处理器中,比如下图的英特尔芯片扫描图,不同的染色即代表不同的功能区(模块)。
▲ 第七代酷睿 Kaby Lake 核心
▲ 第八代酷睿 Coffee Lake 核心
▲ 第九代酷睿 Coffee Lake 核心
为什么需要片内总线?
片内总线连接 Die 内部的各个模块,是模块之间通讯的必须途径。它的设计高效与否,会大大影响处理器的性能。如果把各个模块看做一个个节点,那么它们之间相互连接关系一般可以有以下几种:
而处理器片内总线连接就经历了从 Star Bus --> Ring Bus --> Mesh Bus 的过程。
Star Bus(星型总线)
早期CPU内部模块数目较少,结构单一,星型连结不失是一个简单高效的办法。
处理器核心被放置在中心位置,各个模块都和它连接,而彼此并不直接交互,必须要通过核心进行中转。这种设计简单高效,被使用了相当长的时间。
这种设计的缺陷随着多核处理器的退出而逐渐凸显,多出来的核心放置在哪呢?一种新的星形的变种被利用起来,它类似一种双星结构,中间的节点似乎进行了有丝分裂,一分为二,各自掌管着自己的势力范围。同时为了高效,每个核心又连接其他核心的节点,但是这种设计随着核心数量的进一步增加变得复杂而逐渐退出历史舞台。
Ring Bus(环形总线)
星形的结构在英特尔的服务器产线最先被抛弃,因为无法放置更多的核心,而变种的星形结构也因为低效、复杂被迫放弃,所以一种新的总线结构孕育而出。
在 Nehalem-EP 、Nehalem-EX 这个划时代的产品中,很多新技术被引入进来,英特尔也由此确定了领先的地位。而环形总线就是其中重要的一个创新。
▲ 环形总线
从上图可以看到,Ring Bus 实际上是两个环状结构,一个顺时针环和一个逆时针环。各个模块一视同仁的通过 Ring Stop (环形节点)挂接在 Ring Bus (环形总线)上,如此设计带来很多好处:
- 双环设计可以保证任何两个 Ring Stop 之间距离不超过 Ring Stop 总数的一半,延迟较低;
- 各个模块之间交互方便,不再需要经过 Core 中转。这样一些高级加速技术,如 DCA(Direct Cache Access), Crystal Beach 等等应运而生;
- 高速的 Ring Bus 保证了性能的极大提高。Core to Core latency 只有 60ns 左右,而带宽则高达数百G(记得 Nehalem 是 192GB/s);
- 方便灵活,增加一个 Core,只要在 Ring 上面加个新的环形节点就好,不用像以前一样考虑复杂的互联问题。
真是个绝妙的设计!然而,摩尔定律是无情的,计划能使用好久的设计往往很快就过时了,这点在计算机界几乎变成了普遍规律。
环形总线的缺点也很快随着内核的快速增加而暴露出来。由于每加一个核心,环形总线就变长一些,因此延迟就增加一点点,很快环形总线性能就随着核心的迅速增多而严重下降,多于 12 个核心后会严重拖累系统的整体延迟。和星型连接一样,一种新变种产生了:
在核心很多的至强 HCC(High Core Count)版本中,又加入了一个环形总线。两个环形总线各接12个核心,将延迟控制在可控的范围内。两个环形总线直接用两个双向 Pipe Line 连接,保证通讯顺畅。与此同时,由于 Ring 0 中的模块访问 Ring 1 中的模块延迟明显高于访问自身的模块,也就是所谓的亲缘度不同,所以两个环分属于不同的 NUMA(Non-Uniform Memory Access Architecture,非一致性内存访问)node,也就导致在超多核心的服务器主板 BIOS 的设计变得更加复杂。
那么如果核心的数量 > 12 并且 < 24 呢?那环形总线怎么应用呢?实际上,还有一种“一个半”的奇葩环状结构。
左边是核心数量较少的至强 LCC(Low Core Count)SKU,只有单环;
右边是核心数量稍多的至强 MCC (Middle Core Count) SKU,则是一个半环;
Mesh Bus(无线网格总线)
因为材料和技术的限制,核心的频率不能做到无限拉高,因此各厂迭代的方向都趋向于堆砌核心的数量,并且对于工作站、服务器产线来说,核心多远远比核心强带来的价值高得多。
24个核心的双环结构已经极大增加了不同环内模块的通讯延迟,如果多则几百个核心的服务器处理器继续使用环状结构则带来的问题更加严重,那么更多的核心怎么办呢?继续堆砌环的数量已经没有意义了,因为多环间的连接也更加复杂,通讯的时延也更加严重,这些困难促使英特尔寻找新的方向。
英特尔在 Skylake 和 KNL(英特尔第二代 MIC 架构 Xeon Phi 融合处理器 Knights Landing 的缩写,是英特尔首款专门针对高度并行工作负载而设计的可独立自启动的主处理器,并首次实现了内存与高速互连技术的集成。)中引入了新的片内总线:Mesh。它是一种2D的Mesh网络:
Mesh 网络近几年越来越火热,它的灵活性吸引越来越多的产品加入对它的支持,一般最常听到的 Mesh 就是 WiFi 产品的无线网格网络组网。
Mesh Bus有很多优点:
- 灵活性强:新的模块或者节点在 Mesh 中增加十分方便,它带来的延迟不是像环形总线一样线性增加,而是非线性的。从而可以容纳更多的内核;
- 设计弹性高:不需要环形总线 1.5 ring 和 2 ring 的委曲求全;
- 双向 Mesh 网络减小了两个 Node 之间的延迟。过去两个 Node 之间通讯,最坏要绕过半个 ring。而 mesh 整体 node 之间距离大大缩减;
- 外部延迟大大缩短;
RAM 延迟缩短:
左图的环形总线,假定从环0访问环1里的内存控制器,走过的路径为绿色线标记的线路,而在作为对比的无线网格总线走过的路径相比之下缩短了很多。
PCIe (I/O)延迟缩短:
与内存延迟相同,在 PCIe 侧也是一样,每个 PCIe 控制器都有两个不同的 mesh 驻点,老的 Boardwell 相比,其中一个环组上的 PCIe 控制器只有一个驻点。
那么 Mesh 结构有没有什么缺点呢?其实也是有的,网格化设计带来的复杂性更高,因此对于设计、生产、制造的难度也相应增加了,并且 Die 的大小也带来了负面影响。
总结
最后请大家思考一下,为什么不干脆用全互联 Full Connected 网络来连接 Die 中的各个节点呢?
附录
参考链接
- 破茧化蝶,从Ring Bus到Mesh网络,CPU片内总线的进化之路 - 知乎
- 酷睿i9-9900K/i7-9700K同步评测:八核的时代来了 - 超能网
- Things are getting Meshy: Next-Generation Intel Skylake-SP CPUs Mesh Architecture - STH
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2022-08-20 12:30 PM