某種程度來說,其實是一樣的,都是SMP(對稱多處理器,Symmetric MultiProcessing),對於操作系統來說,每個核心都是作為單獨的CPU對待的。所以在某個地方省事了,就必須在另外一個地方費勁。
不同的核心運行多個線程,總有需要交換數據的時候,根源為不同的核心需要訪問同一個內存地址的數據——而核心Core0要訪問這個地址的數據時,可能已經被核心Core2加載到緩存中並進行了修改。雖然理論上可以讓Core2把緩存數據同步到內存後,Core0再從內存讀取數據,但內存訪問的速度比CPU速度慢很多,一般是直接訪問Core2的緩存。
因此,不管是單個CPU多核心,還是多個單核心CPU,或者多個多核心CPU,都必須有這樣的數據通道:
每個核心都可以訪問全部內存
每個核心都可以訪問其它核心的緩存
針對現代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/至強要低。