【x86 興衰史】AMD 真能翻身壓倒英特爾嗎?從應用優劣來探討可能性

現在我們把焦點轉向 Zen 2。有鑑於坊間已經充斥太多對 Zen 2 的「深度分析」(尤其是微架構核心層面的介紹),筆者打算用偏向應用面的角度,介紹 AMD 真正的優勢和看不到的劣勢。

當 AMD 可用更小晶片對抗英特爾產品

2019 年 12 月 9 日「美國批踢踢」Reddit 有一則討論引起熱議:台積電替 AMD 代工生產的 7 奈米製程 8 核心 CCD,單一晶粒面積只有 74 平方公釐,以完整 8 核心都可正常運作的標準來算,良率高達 93.5%,一片 12 吋晶圓可取得 749 個 8 核心晶片,足以用來生產 374 顆 16 核心的 Ryzen 9、187 顆 32 核心的 EPYC、或著 93 顆 64 核心 EPYC,但英特爾(Intel)的 14 奈米製程 28 核心 Xeon,在相同的晶圓缺陷率,只有 46% 無缺陷晶粒,一片 12 吋晶圓只能產出 24 顆,更慘的是,英特爾即使有 2 顆 28 核心,核心數還抵不過 AMD 一顆 64 核心。

(Source:AMD

我們並不知道台積電賣給 AMD 的 7 奈米製程晶圓一片多少錢,但先進製程的成本節節高升這檔事,倒是沒有什麼懷疑的空間,縮減單一晶片面積這件事,完全勢在必行。這也讓人不得不好奇,預定 2020 下半年採用「電晶體密度增加 20%,功耗減少 10%」EUV 光刻技術 7 奈米+ 製程的 Zen 3,晶粒面積是否還有繼續縮小的可能,或核心微架構能否顯著擴張。

總之,先不提筆電和低階桌機,光比一比伺服器和中高階桌機的產品,就算對處理器市場再怎麼外行,光看規格和價格就可輕易看出 AMD 現在的優勢有多大。

Zen 2 的實際優勢並不只有台積電的 7 奈米製程

從 2019 年 7 月至今半年多來,大概是因為有棒打英特爾這隻落水狗的天賜良機,在網路可看到的鄉民評論,多半都聚焦在以下幾點:

  • 台積電先進製程天下無敵。
  • AMD Chiplet 策略高瞻遠矚。
  • AMD 的製造成本輾壓英特爾。
  • 萬惡的英特爾快要擠不出牙膏了。

這裡替各位複習一下,依據 AMD 的 Chiplet 策略,現有晶片只有 4 種,而 EPYC、Threadripper 和未整合繪圖核心的 Ryzen,由前三種「包水餃」包出來,第四種則是專用單晶片 APU,專攻低價電腦與筆電市場(只是原生 8 核心看來也不像規格多低階的產品就是了)。

先不管英特爾和台積電,AMD 這次 Chiplet 策略其實有很多層面的考量,並不是只有降低成本,可歸類如下:

  • 減少風險:I/O 與記憶體控制器的 IP 區塊,難以快速導入最先進製程。
  • 提升彈性:同樣的 7 奈米製程 CCD 和 12 奈米製程 IOD 可同時用在不同的產品線。
  • 增加產能:用更少的晶圓數提供更多可出貨產品,特別當台積電產能被蘋果為首的大客戶搶破頭時。
  • 改善效能:將記憶體控制器獨立於 CPU 核心之外,可精簡 NUMA (Non-uniform memory access)Domain,利於軟體最佳化,這絕對值得花時間解釋。

記憶體控制器和 CPU 脫鉤是簡化系統最佳化手段

CPU 整合記憶體控制器對 AMD 並不陌生,早在 2001 年 10 月的微處理器論壇,AMD 就宣布 K8 將整合雙通道 DDR 記憶體控制器,也暗示原生雙核心設計,基於 HyperTransport 的 NUMA 也讓 AMD 獨領風騷好幾年,直到英特爾的 Nehalem 具備以 QPI 為基礎的 NUMA 為止。

CPU 整合記憶體控制器這件事,其實有利有弊,好處是「靠得越近,速度越快」,壞處則是在多晶片、多處理器環境,會讓主記憶體分散在四處,作業系統需特別花工夫最佳化排程,盡量讓 CPU 核心存取本地端記憶體,避免不必要的遠端存取,這也是 ACPI 規範會有儲存多處理器拓樸資訊的 SRAT (Static Resource Affinity Table) 和記錄 NUMA 節點之間延遲差異的 SLIT ( System Locality Information Table),用來協助作業系統或虛擬機管理者(Hypervisor)「看清全局」,達到最佳行程管理與記憶體配置。但 AMD 的多晶片封裝,卻也讓這件苦差事更複雜。

AMD 在 Zen 2 世代將記憶體控制器與 CPU 脫鉤,轉移至 CCD 共用的 I/O Die,除了分而治之,沿用 12 奈米製程 Zen+ 的現成 IP 區塊,縮短研發時程,降低產品開發的風險,將記憶體控制器集中為一(原本 4 個雙通道變成一個 8 通道),讓 NUMA 看起來更像早期所有 CPU 共用同一塊主記憶體的 SMP,雙處理器環境的實體 NUMA Domain 從 8 個變成 2 個,而處理器核心要存取記憶體控制器的可能距離也從 3 種(同一顆 EPYC 的其他 CCD、另一顆 EPYC 的第一顆 CCD、另一顆 EPYC 的第二顆 CCD)精簡成兩種(同一顆 EPYC 內的 IOD,另一顆 EPYC 的 IOD)。

用這張同時比較現行英特爾 Xeon、第一代 EPYC 和第二代 EPYC,差異性就更清楚了,也不難理解為何作業系統和虛擬機管理者(Hypervisor)不需要太多最佳化手段,就可在英特爾 CPU 有效率執行,特別當 AMD 的架構會讓最低層的快取記憶體(Last-Level Cache,LLC)散布四處,也增加快取資料一致性(Cache Coherence)的負擔,降低整體系統效能。這是 AMD 看似風光的核心數量與製程優勢以外,檯面上看不出的弱點。

這也是為何 AMD 將在 7 奈米+ 製程 Zen 3,將 CCD內原本兩組 4 核心 CCX 獨享的 L3 快取,融合為 8 核心共用的主因(看起來很有可能改為一顆 CCD 就一顆 8 核心 CCX),進一步減少軟體最佳化的複雜度。不過「江湖盛傳」AMD 將在 Zen 3 導入 HBM 當作「L4 快取」,會造成哪些奇怪的影響,就只能到時候再仔細研究了。

多晶片結構帶來更複雜的系統調校工作

但這是否代表 AMD 減少 NUMA Domain 就從此高枕無憂?事情沒這麼簡單,天底下並非所有應用程式都是「NUMA-friendly」,可高度平行化分散在所有運算節點與專用的快取記憶體,如果所有應用程式都一次存取多達 8 通道的 DDR4 主記憶體,固然帶來最高的理論頻寬,卻也會造成更長的存取延遲,做好「頻寬 vs. 延遲」的平衡勢在必行。

也因此,AMD 從第一代 EPYC 開始,在系統 BIOS 提供兩個名稱讓人摸不著頭緒的可調整參數:

  • NUMA Nodes per Socket(NPS):名為每個處理器插座的 NUMA 節點(Node),但實際作用是「分而治之」、定義處理器核心群存取記憶體通道的方式。
  • NPS0:當安裝兩顆 EPYC 時,所有處理器核心如同只有一個 NUMA Domain 的交錯存取所有總計 16 通道的主記憶體,這很明顯沒有效率(強迫存取另一顆 EPYC 的記憶體),所以連 AMD 官方都不建議這樣做。
  • NPS1:EPYC 所有處理器核心像同處同一個 NUMA Domain 同時交錯存取 8 通道主記憶體(ABCDEFGH),最一般的「泛用」組態,整體理論頻寬最高,存取延遲最長。
  • NPS2:記憶體通道拆成 4 條一組(ABCD EFGH),形同兩個 NUMA Domain(一半的核心)交錯存取這兩組。
  • NPS4:記憶體空到拆成 2 條一組(AB DC EF GH),有如 4 個 NUMA Domain(四分之一的核心)交錯存取這 4 組,整體理論頻寬最低,存取延遲最短。
  • ACPI SRAT L3 Cache as NUMA Domain:這命名非常容易讓人一頭霧水,那 L3 Cache 實際上應該正名為 CCX。講白話一點,這功能是將 CCX 加入 NUMA Domain,透過 ACPI SRAT 讓作業系統或虛擬機管理者意識到其存在,讓每個 CCX「專心」存取自己的 L3 快取。以第二代 EPYC 為例,8 顆 CCD 有 16 個 CCX,啟動此功能後,就等於告訴作業系統「我有 16 個 CCX,每個都有自己的 L3 快取,請給我好好排程,盡量讓 CCX 自己吃自己的 L3」。

各位還看不懂的話,就請參考 AMD 如何跟微軟合作,讓 Windows 10 可將彼此有關連的執行緒,盡其所能塞到同一個 CCX,避免分散到其他地方延長記憶體存取延遲。

相信各位已經頭上浮現滿滿問號,我們就來看看 VMware 和 Dell 是怎麼建議的。

  • 假若 EPYC 只有跑少少的虛擬機、部署少少的虛擬 CPU,每個虛擬機和虛擬 CPU 都可以獨自享受豐沛的硬體資源,那 VMware 建議設定就是:
    NPS (NUMA per Socket) = 4
    啟動 L3 Cache as NUMA
    講白一點就是就地分贓,「讓虛擬機綁架專屬的資源」。
  • EPYC 已跑了滿滿的虛擬機或部署滿滿的虛擬 CPU,任何系統資源都不容許一絲一毫浪費,那就會變成:
    NPS (NUMA per Socket) = 1
    關閉 L3 Cache as NUMA
    換言之就是「獨樂樂不如眾樂樂」,大家一起吃大鍋飯。
  • 關於高度平行化的高效能運算或其他已針對 NUMA 最佳化的應用程式,Dell 建議 NPS 設成 4(應該也要開啟 L3 Cache as NUMA),可讓這類應用「同時享受到最高的頻寬與最低的延遲」。

想必各位都覺得很麻煩對不對?像微軟和 VMware 自己寫的文件,也是得從 EPYC 是多晶片封包、一個 CCD 包兩個 CCX、所有 CCD 連接 IOD、記憶體和 I/O 介面的配置、NUMA是什麼等開始從頭教起,否則讀者恐怕根本看不懂這些「有字天書」上面印的是哪來的聖經密碼。

AMD 也針對不同應用環境,從泛用型、虛擬化、資料庫、高效能運算等,提供性能調校手冊,所以說天底下沒有白吃的午餐,AMD 的 CPU 便宜歸便宜,要享受好處之前,該做的功課還是要做,老師教的當然要聽。

核心數量太多也會製造麻煩

很久以前 IBM 公開展示 8 顆英特爾 Nehalem-EX、總計 64 核心 128 執行緒的伺服器,其 Windows 工作管理員顯示 CPU 的壯觀畫面,轟動一時,然而現在只要一顆 AMD EPYC 就功德圓滿了,而且你還可以加倍。但「CPU 核心執行緒超多」這檔事不是沒有後遺症,實際應用層面會帶來很多鮮為人知的麻煩,而微軟這次就很倒楣成為苦主了。

一台 2 顆 EPYC 7742 或 7702 的伺服器,就有總計 128 個處理器核心和 256 條多執行緒,但是 Windows Server 2016 和 2012 R2,因為不支援第二代先進可程式化中斷控制器(x2APIC),理論上就無法吃下超過 255 個邏輯處理器,根據微軟的 EPYC 性能調校文件,舊版 Windows Server 實際上只能對應 2 顆 48 核心的 EPYC 和 192 個邏輯處理器。

而微軟網站描述的 64 核心 EPYC 支援性也讓人感到疑惑:Windows Server 2016 和 2012 R2 都需要關閉 SMT,但 48 核心/96 執行緒就沒有問題,暗示無法支援到 128 執行緒,然後一提到 NUMA,微軟很隱晦的表示「Windows 現階段最多只能在一個 NUMA 節點支援 64 個硬體執行緒,只要 NSP 開到 0 或 1 就破表了」,這真的要實際測試過的人,才能摸清楚真相到底是怎麼一回事,但微軟最想看到的,還是莫過於大家盡快升級到 Windows Server 2019。

唯一可以確定的是,要安裝 2019 年 9 月前的 Windows Server 2019 版,必須先在 BIOS 關閉 SMT 和 x2APIC,灌完作業系統後跑 Windows Update 裝完所有的累積性更新,再重新開機進 BIOS 打開 SMT 和 x2APIC。

核心數量太多的軟體相容性問題並不只發生在微軟,像常見的伺服器作業系統和虛擬機管理員,如 Red Hat Enterprise Linux、Ubuntu Linux、VMware 等,也都需要升級到最新版或安裝某些更新才能確保相容性無虞。

很多業界人士老是喜歡把「生態系統」(Ecosystem)掛在嘴上,當因「英特爾缺貨,所以建議客戶改用 AMD」或「因為我們做英特爾平台打不贏其他廠商,所以另闢他徑改押寶 AMD」,有沒有意識到這些實際應用的邊邊角角,還是只有滿腦子硬體規格好棒棒,就是呈現一家伺服器廠商專業程度的關鍵時刻。

從英特爾無縫接軌到 AMD 並非易事

只是購買新的 AMD 伺服器重新建置服務還不打緊,最麻煩的還是「要如何將部署在英特爾伺服器的軟體及服務轉移到 AMD 平台」,還有「不停機動態遷移」這天大的挑戰。

這裡就不得不談談「x86 指令集長期缺乏業界標準」這件遺禍至今的陳年往事了。以虛擬化為例,自從英特爾的 VT-x (Vanderpool) 和 AMD 的 AMD-V (Pacifica)開始,雙方根本就是各搞各的,結果就是只要處理器廠商持續擴張指令集(像快要沒人搞懂到底有多少版本的 AVX-512),連「同一間處理器廠商的不同世代 CPU 之間要搬來搬去都很麻煩」。

英特爾按著 AMD 頭在地上摩擦的 Haswell 與 Broadwell 微架構世代,在虛擬化技術更走火入魔,進一步追求控制不同虛擬機器、執行緒或應用程式占用 L3 快取空間與記憶體頻寬的精細調控機制(在 Broadwell 被稱之為 Resouce Director Technology),企圖實現「L3 快取記憶體層級的 QoS」。

AMD 也「有為者亦若是」的在 Zen 2 加入類似的相關快取記憶體管理指令,有時候還真的滿同情這些作業系統和虛擬機管理者廠商,什麼東西都要開發兩個版本。

像 VMware 的 vMotion 需要採用 EVC(Enhanced vMotion Caompatility)蓋掉「非基本指令集」,搬完後還要重新啟動虛擬機器,才會判斷新伺服器的 CPU 有哪些功能可在電源開啟後使用,才能存取所有新的處理器功能,更不用講不同廠商 CPU 之間的動態搬移,VMware 也明講了「不支援從英特爾平台動態轉移到 AMD 平台,反之亦然,只能使用會導致停機的冷轉移」,其他體系的虛擬機,如 Red Hat Virtualizaton 和 KVM,對此大哉問也都是大同小異的回應。

HPE 的「將虛擬機器從英特爾型伺服器平台移轉到 AMD 型伺服器平台」白皮書,推薦的方式是請顧客掏錢購買 Carbonite 遠端快照複寫軟體,但也不能做到不停機,只能「Almost Zero Downtime」。光憑這點,很多完全不允許停機的服務,就不可能從英特爾轉移到 AMD 了,無緣享受多到用不完的核心數和執行緒。

所以有時候這世界也是有一點公平、滿「一分錢一分貨」的,特別在企業 IT 領域更是如此,硬體價格便宜是一回事,但往往會發生「即使再便宜也無法使用」的慘劇。為何 AMD 的產品這麼好,卻無法開出更高售價?很多看不見的隱藏成本,才是真正關鍵,也是滿腦子只有 BOM Cost 和硬體規格的廠商,永遠無法理解的大道理。

想藉由 AMD EPYC 大展拳腳的伺服器廠商,又有幾間寫了像樣的「系統移轉注意須知」呢?所以雙方真的主客易位,戰局真的改觀了嗎?我們下篇繼續。

(首圖來源:AMD

原文出處: 【x86 興衰史】AMD 真能翻身壓倒英特爾嗎?從應用優劣來探討可能性