当前位置: 华文星空 > 知识

多核 CPU 和多个 CPU 有何区别?

2013-08-31知识

某种程度来说,其实是一样的,都是SMP(对称多处理器,Symmetric MultiProcessing),对于操作系统来说,每个核心都是作为单独的CPU对待的。所以在某个地方省事了,就必须在另外一个地方费劲。

不同的核心运行多个线程,总有需要交换数据的时候,根源为不同的核心需要访问同一个内存地址的数据——而核心Core0要访问这个地址的数据时,可能已经被核心Core2加载到缓存中并进行了修改。虽然理论上可以让Core2把缓存数据同步到内存后,Core0再从内存读取数据,但内存访问的速度比CPU速度慢很多,一般是直接访问Core2的缓存。

因此,不管是单个CPU多核心,还是多个单核心CPU,或者多个多核心CPU,都必须有这样的数据通道:

  1. 每个核心都可以访问全部内存
  2. 每个核心都可以访问其它核心的缓存
  3. 针对现代CPU集成了PCI-E控制器,大部分IO设备都可以使用DMA方式传输数据,可以把每个PCI-E控制器看待为若干个特殊的核心。

以Intel最新的至强可扩展第二代(Cascade Lake)架构为例,单个多核心CPU的架构是这样的[1]:

10个核心,以及PCI-E控制器、内存控制器通过网状总线互联。因为Cascade Lake支持多路CPU,因此还有一个UPI总线控制器。

现在基本没有单核心CPU了,两个多核心CPU互联是这样的[1]:

可以想象出来,第一个CPU的某个核心(假设是Core 0-1)要访问第二个CPU的另一个核心(假设是Core 1-3)的缓存,途径为:

Core 0-1->Mesh总线->UPI控制器->UPI总线->UPI控制器->Mesh总线->Core 1-3

Core 0-1访问第二个CPU的某个内存地址:

Core 0-1->Mesh总线->UPI控制器->UPI总线->UPI控制器->Mesh总线->内存控制器

很显然这个流程比单CPU内的多核心互访麻烦多了,延迟也会更高。此外,CPU需要增加UPI控制器;主板需要增加第二个CPU插槽以及必须的供电模块、散热模块;增加第二个CPU的内存插槽;两个插槽之间布线联通UPI控制器(单个UPI x20控制器需要使用80根线,2x UPI x20就是160根)。体会一下同样是CSL用的单路主板和双路主板的差异:

用于双路Xeon可扩展的主板:超微X11DAi-N
用于单路Xeon-W的主板:超微X11SRA
双路CPU用的LGA 3647和单路CPU用的LGA 2066封装对

而且2x UPI x20的带宽也比Mesh互联的带宽低不少(Mesh互联的带宽不好算,也没找到资料,但Mesh互联的前身Ring总线互联的带宽是96GB/s,2x UPI x20带宽根据工作频率大概在76.8~83.2 GB/s,但和Ring相比,各种新闻稿都说Mesh平均延迟大幅降低,带宽大幅提升)。

所以,CPU核心是省事了些,但是CPU封装以及主板则是费劲多了,而且通常来说这个性能可能更差一些。当然,两个CPU会有其它方面的优势,例如整个平台的内存可以大一倍,多一倍的PCI-E通道可以连接更多的PCI-E设备,总核心数量相同的前提下,单个CPU功耗相近的时候每个核心可分配到的功耗更高,每个核心可以运行在更高的频率。

在生产方面,CPU只要一次设计好了,生产两个10核心和生产一个20核心的生产流程、原材料成本几乎是没有差别的,也许20核心因为使用更大的晶圆面积良品率低一点,但封装两个CPU也会带来更高的成本。而单路主板的设计、生产、成本都低的多,换句话说整个平台成本更低更具价格竞争力。

多说一句,AMD的8核锐龙、线程撕裂者、EPYC则是把这两种方式的优势组合起来,只生产4核心的CCX,每两个CCX组合成一个Zeppelin模块。然后线程撕裂者和EPYC则是多个Zeppelin模块在CPU的基板上通过Infinity Fabric总线互联。CCX的良率更高,配套主板的生产成本也低不少,只是封装的成本会有所提高。当然,这样多个Zeppelin模块在基板上互联和多个CPU互联相似,存在不同CCX上的核心互访延迟高带宽低的缺点,运行线程间需要频繁交换数据的多线程应用时效率比Intel的Core X/至强要低。

[1]:Cascade Lake - Microarchitectures - Intel - WikiChip