都2021年了,還把x86和ARM歸為CISC和RISC?
CISC 和 RISC 是 David Patterson 和 David Ditzel 在 1981 年正式提出的。四十年過去了,二者的發展有哪些融合與變遷?IT 新聞界資深人士 Joel Hruska 撰長文對該領域的發展史及其將面臨的挑戰做了詳細闡述,以下是文章原文。
隨著基于 ARM 的 M1 被推出,關于 x86 和 ARM 的比較和討論也越來越多。這些討論通常還涉及 CISC 和 RISC,因為「x86 與 ARM」和「CISC 與 RISC」之間的非常緊密。
但這種關聯造成了一種誤解:「x86 與 ARM 可以被對應歸類為 CISC 與 RISC,其中 x86 是 CISC,ARM 是 RISC」,三十年前的確是這樣,但現在已經不是了。
人們經常將 x86 CPU 與其他公司制造的處理器進行比較,但近二十年來 x86 都沒有一個真正的架構競爭對手。
發展歷程
RISC 是 David Patterson 和 David Ditzel 在他們 1981 年的開創性論文《The Case for a Reduced Instruction Set Computer》中創造的術語。他們根據 20 世紀 70 年代后期領域內的發展趨勢以及當時 CPU 面臨的擴展問題,正式提出了 RISC 這種半導體設計方法。此外,他們還提出了另一個術語「CISC(復雜指令集)」,來描述許多已經存在但不遵循 RISC 原則的 CPU 架構。
隨著限制 CPU 性能的瓶頸發生改變,人們意識到需要一種新的 CPU 設計方法。原始 8086 就是遵循 CISC 設計原則的一個例子,它旨在通過將復雜性轉移到硬件中,來緩解內存成本高的問題。這種方法強調代碼密度和對一個變量依次執行多個操作的某些指令。作為一種設計理念,CISC 試圖最小化 CPU 執行給定任務所必需的指令數來提高性能,其指令集架構通常會提供一些專用指令。
20 世紀 70 年代后期,CISC CPU 存在很多缺點。它們通常必須跨多個芯片才能實現,因為當時的超大規模集成電路(VLSI)技術無法將所有必要的組件封裝到一起。實現支持大量極少用指令的復雜指令集架構需要消耗 die space,并且可實現的最大時鐘速度也有限。與此同時,內存成本持續降低,代碼尺寸變得不那么重要了。
Patterson 和 Ditzel 認為當時 CISC CPU 仍在嘗試解決代碼膨脹問題,他們意識到絕大多數 CISC 指令都沒有被用到。因此他們提出了一種完全不同的處理器設計方法——一個小得多的指令集 RISC,其中的指令長度固定,并且所有指令都能在單個時鐘周期內完成。盡管 RISC CPU 每條指令執行的工作量比 CISC 的對應指令少了一些,但芯片設計人員通過簡化處理器來彌補了這一點。
這種簡化允許把晶體管的預算用來實現其他功能,例如用于一些額外的寄存器。1981 年人們設想未來可用的功能包括片上緩存、更大更快的晶體管,甚至是 pipelining 技術。RISC CPU 的目標是盡可能加快指令執行速度,提高 IPC(即每個時鐘周期內執行的指令數,用于度量 CPU 的效率)。Patterson 和 Ditzel 認為,通過以這種方式重新分配資源,RISC 的性能最終將優于 CISC。
不久這種猜想就被證實。MIPS 于 1985 年推出的 R2000 在某些情況下能夠維持接近 1 的 IPC。早期的 RISC CPU,例如 SPARC 和 HP 的 PA-RISC 系列,都創造了性能記錄。在 20 世紀 80 年代末和 90 年代初,人們常說:「x86 等基于 CISC 的架構已經過時了,也許對于家庭計算來說足夠了,但如果您想使用真正的 CPU,請購買 RISC 芯片」。以數據中心、工作站和高性能計算 (HPC) 為例:

注:此處「英特爾架構」僅指 x86 CPU,而不是 8080 等芯片,后者在早期的計算機市場上很受歡迎。此外,英特爾在 2000 年擁有許多屬于「RISC」類的超級計算機,并且 x86 機器在市場上還占據較大的份額。
上圖分析了 80 年代 - 00 年代 CPU 的市場狀況。截止到 1990 年,在個人計算機市場,x86 占據了相當大的市場份額,非 x86 CPU 僅占約 20%;但在數據中心方面,x86 幾乎沒有份額,在 HPC 中也沒有。當時蘋果正準備設計下一代 CPU,1991 年蘋果、IBM、Motorola 組成的 AIM 聯盟推出了微處理器架構 PowerPC,他們相信按照 RISC 原則構建的高性能 CPU 將是計算機的未來。
CISC 與 RISC 并肩發展的歷史至 20 世紀 90 年代初為止。英特爾的 x86 架構在 PC、數據中心和 HPC 等計算行業繼續占據主導地位的事實是無可爭議的,有爭議的是:英特爾和 AMD 的 CPU 架構是否真的是采用 RISC 設計原則實現的
觀點分歧
在 CPU 開發領域,一些概念和屬性是長期存在分歧的。例如 Paul DeMone 曾在《RISC vs. CISC Still Matters》一文中寫道:
隨著使用固定長度控制字來操縱亂序執行數據路徑的現代 x86 處理器的出現,RISC 和 CISC 之間的混淆變得越來越嚴重。「RISC 和 CISC 正在融合」是一個在根本上就存在缺陷的觀點,可以追溯到 1992 年 i486 的發布。其根源在于人們對指令集架構和物理處理器實現細節之間的差異普遍無知。
相比之下,Jon Stokes 在《RISC vs. CISC: the Post-RISC Era》中說:
顯然到目前為止,「RISC」和「CISC」這兩種縮寫術語掩蓋了一個事實,即兩種設計理念都不僅僅處理指令集的簡單性或復雜性...... 從 RISC 和 CISC 的發展史以及兩種方法試圖解決的問題看,這兩個術語都很荒謬…… 關于「RISC 與 CISC」的辯論早已結束,現在必須要進行一個更細致入微、更有趣的討論,即基于硬件和軟件、ISA 和實現等方面進行討論。
然而,這些文章都過時了。Stokes 的文章寫于 1999 年,DeMone 的文章寫于 2000 年。這里引用他們的文章是為了說明 RISC 與 CISC 和現代計算的關聯早已有 20 多年的歷史。
關于實現與 ISA的兩種觀點
上文提到的引述反映了關于「CISC 與 RISC」的兩種不同觀點。DeMone 的觀點與今天 ARM 和蘋果的觀點基本一致,這種觀點被稱為「以 ISA 為中心(ISA-centric position)」。
在過去幾十年里,Stokes 的觀點是 PC 領域的主流觀點,被稱為「以實現為中心(implementation-centric position)」。我使用「實現(implementation)」這個詞是因為它可以在上下文中指代 CPU 的微架構或用于制造物理芯片的制程節點。
上述兩種位置都以「中心(centric)」的形式描述,兩種觀點之間是存在交集的。即使觀點不一,但都遵循一些共同的趨勢。
在以 ISA 為中心的觀點中,RISC 指令集的某些先天特征使其比 x86 更高效,包括使用固定長度指令和加載 / 存儲設計。雖然 CISC 和 RISC 之間的一些原始差異不再有意義,但以 ISA 為中心的觀點認為,就 x86 和 ARM 之間的性能和能效而言,仍然具有一些關鍵差異。
以 ISA 為中心的觀點認為,英特爾、AMD 和 x86 勝過 MIPS、SPARC 和 POWER/PowerPC,原因有以下三個:英特爾卓越的工藝制造、英特爾的優勢使所謂的「CISC tax」逐漸減少、二進制兼容性提升了 x86 的價值。
以實現為中心的觀點則著眼于自 RISC、CISC 等術語出現以來現代 CPU 的發展方式,并認為這兩種術語已完全過時。
例如,現在 x86 和高端 ARM CPU 都使用亂序執行來提高 CPU 的性能。而使用芯片即時重排序指令以提高執行效率的做法與 RISC 的原始設計理念完全不一致,Patterson 和 Ditzel 主張采用能夠以更高時鐘速度運行的不太復雜的 CPU。現代 ARM CPU 還有一些特性,例如 SIMD 執行單元和分支預測,在 1981 年也都不存在。RISC 最初的目標是讓所有指令都能在一個周期內執行,大多數 ARM 指令都符合這個規則,但是 ARMv8 ISA 和 ARMv9 ISA 包含執行時間超過一個時鐘周期的指令。現代 x86 CPU 也是如此。
以實現為中心的觀點認為:制程節點改進和微架構增強的結合使 x86 在很久以前就可以縮小與 RISC CPU 的差距,并且 ISA 級別的差異在非常低的功率范圍內無關緊要。英特爾和 AMD 等都普遍支持這種觀點,2014 年我曾撰寫一篇題為《The final ISA showdown: Is ARM, x86, or MIPS intrinsically more power efficient?》的相關文章。
2014 年文章鏈接:https://www.extremetech.com/extreme/188396-the-final-isa-showdown-is-arm-x86-or-mips-intrinsically-more-power-efficient
但這種觀點是完全正確的嗎?
RISC 和 CISC 的開發融合了嗎?
以實現為中心的觀點認為,CISC 和 RISC CPU 已經交互發展了幾十年,從 1990 年代中期為 x86 CPU 采用「類 RISC」解碼方法開始。
常見的解釋是這樣的:在 1990 年代初期,英特爾和其他 x86 CPU 制造商意識到未來提高 CPU 性能需要的不僅僅是更大的緩存和更快的時鐘。多家公司決定投資 x86 CPU 微架構,以動態重排序他們自己的指令流來提高性能。在該過程中,原生 x86 指令被送入 x86 解碼器,并在執行前轉換為「類 RISC」微操作。
二十多年來業界的觀點一直是如此,但最近這種觀點遭到了挑戰。2020 年 Erik Engheim 寫道:「x86 芯片中根本沒有 RISC 的內部結構,這只是一種營銷策略。」他還提到了 DeMone 的故事和 P6 微架構背后的首席架構師 Bob Colwell 的一句話。
P6 微架構是第一個實現亂序執行和原生 x86 到微操作解碼引擎的英特爾微架構。P6 隨奔騰 Pro 發布,后來又演變出奔騰 II、奔騰 3 及更高版本。它是現代 x86 CPU 的鼻祖。因此,P6 微架構的首席架構師 Bob Colwell 有資格解釋上文所述的挑戰,他說:
英特爾的 x86 在「引擎的外表」下并沒有 RISC 引擎。它們通過依賴于將 x86 指令映射到機器操作或復雜指令的機器操作序列的解碼 / 執行的方案來實現 x86 指令集架構,然后這些操作通過微架構找到自己的方式,遵守有關數據依賴的各種規則,最終確定時序。
完成這個過程的「微操作」有 100 多比特,攜帶各種復雜特異的信息,不能由編譯器直接生成,且不一定是單周期。但最重要的是,它們只是一種微架構技巧,而 RISC/CISC 是關于指令集架構的。微操作的想法不是受 RISC 啟發的、「類 RISC」的,或者說與 RISC 完全無關。而是我們的設計團隊找到了一種方法,打破了非常復雜的指令集的復雜性,也擺脫了競爭型微處理器中存在的限制。
英特爾并不是首個將 x86 前端解碼器與所謂的 RISC 風格后端結合起來的 x86 CPU 制造商,被 AMD 收購的 NexGen 同樣如此。NexGen 5×86 CPU 于 1994 年 3 月首次亮相,而奔騰 Pro 直到 1995 年 11 月才推出。以下是 NexGen 對其 CPU 的描述:Nx586 處理器是 NexGen 創新以及 RISC86 微架構專利的首次實現。后來該公司給出了更多實現細節:RISC86 方法動態地將 x86 指令轉化為 RISC86 指令。如下圖所示,Nx586 利用了 RISC 性能原理的優勢。出于 RISC86 環境的限制,每個執行單元都要更小更緊湊。
也許人們依然覺得這只是市場營銷的說辭,那么讓我們再來看下 1996 年的 AMD K5。K5 通常被描述為與 AMD 從其 32 位 RISC 微控制器 Am29000 借來的執行后端結和的 x86 前端。在查看它的具體框架圖之前,我們首先把它與最初的英特爾奔騰比較一下。奔騰可以說是 CISC x86 進化的頂峰,因為它在 x86 CPU 中同時實現了 pipeline 和超標量設計(superscaling),但沒有將 x86 指令轉換為微操作,也缺乏亂序執行引擎。

AMD K5 框架圖如下圖所示:

如果你曾經研究過微處理器原理圖,你可能會發現 K5 和微處理器有許多相似之處,但奔騰卻相反。AMD 在 Nx586 上市后收購了 NexGen。K5 是 AMD 自主設計的,而 K6 最初是 NexGen 的產品。也是從那時開始,CPU 變得像今天我們熟悉的樣子。設計這些芯片的工程師曾表示:這些相似之處不僅僅是表面上的。
早在 1996 年,AMD 的 David Christie 就在 IEEE Micro 上發表了一篇關于 K5 的文章,闡述了 K5 是如何將 RISC 和 CISC 結合在一起的,這里引用一段該文章的內容:
我們開發了一個松散地基于 29000 指令集的微型 ISA。一些額外的控制字段將微指令的大小擴展到 59 位。其中一些簡化并加速了超標量控制邏輯,其他的用于提供特定于 x86 的功能,這些功能對于性能非常重要,因此不能用微指令序列來合成。但是這些微指令仍然遵循基本的 RISC 原則:簡單的寄存器到寄存器操作,對寄存器指定符和其他字段進行固定位置編碼,并且每個操作不多于一個內存引用。因此我們稱它們為 RISC 操作,或簡稱為 ROPs。這種簡單、通用的特性為實現更復雜的 x86 操作提供了靈活性,從而有利于保持執行邏輯相對簡單。
RISC 微架構最關鍵的一點是 x86 指令集的復雜性止于解碼器,并且在很大程度上對亂序執行內核是透明的。這種方法只需要很少的額外控制復雜度,而不需要亂序的 RISC 執行來實現亂序的 x86 執行。任務切換的 ROP 序列看起來并不比簡單指令串的 ROP 序列復雜。執行內核的復雜性被有效地從架構的復雜性中分離出來,而不是復合起來的。
Christie 并沒有混淆 ISA 與 CPU 物理實現細節之間的區別。他認為物理實現本身在一些重要的方面是 RISC 式的。K5 重用了 AMD 為其 Am29000 系列 RISC CPU 開發的執行后端部分,它實現了一個比原生 x86 ISA 更類似于 RISC 的內部指令集。在此期間,NexGen 和 AMD 引用的 RISC 式技術參考了數據緩存、pipeline 和超標量架構等參考概念。
這些想法都不是嚴格的 RISC,但它們都是首先在 RISC CPU 中首次亮相的,將這些功能作為「類 RISC」進行營銷是有道理的。
這些功能與 RISC 的相關程度以及 x86 CPU 是否解碼 RISC 樣式指令,取決于選擇的框架標準。這一爭論比奔騰 Pro 還大,即使 P6 是與亂序執行引擎等技術發展最相關的微架構。不同公司的工程師都有自己的看法。
現代 x86 CPU 的壓力
那么這種「RISC 與 CISC」比較對今天的 ARM 和 x86 CPU 有什么實際影響呢?當我們將 AMD 和英特爾 CPU 與蘋果的 M1 和未來的 M2 進行比較時,我們真正要問的問題是:x86 是否存在一些瓶頸,使得其無法與蘋果以及高通等公司未來的 ARM 芯片有效競爭?
AMD 和英特爾給出的答案是否定的,而 ARM 給出的答案是肯定的。行業內的公司之間具有明顯的利益沖突,因此我詢問了丹麥計算機科學家 Agner Fog,他以其在 x86 架構和微架構方面的研究而聞名。以下是他的看法
ISA 并非無關緊要。x86 ISA 非常復雜,因為長期以來人們一直在進行小的更改和補丁,以向 ISA 中添加更多功能,而 ISA 確實已沒有空間容納此類新功能。
復雜的 x86 ISA 使解碼成為瓶頸。x86 指令的長度在 1 到 15 個字節之間,計算長度非常復雜。在開始解碼下一條指令之前需要知道指令的長度。如果您想每個時鐘周期解碼 4 或 6 條指令,這肯定是個問題!英特爾和 AMD 現在都在不斷增加微操作緩存來克服這個瓶頸。而 ARM 有固定大小的指令,所以這個瓶頸不存在,也不需要微操作緩存。
x86 的另一個問題是它需要很長的管道來處理復雜性。分支誤預測懲罰等于 pipeline 的長度。因此,他們正在添加越來越復雜的分支預測機制,其中包含大型分支歷史信息表和分支目標緩沖區。當然,所有這些都需要更多的芯片空間和更多的功耗。
盡管有這些負擔,x86 ISA 還是相當成功的。這是因為它可以為每條指令做更多的工作。
Agner 還在他的微架構手冊中寫道:AMD 和英特爾 CPU 設計的最新趨勢已經回歸到 CISC 原則,以更好地利用有限的代碼緩存,增加管道帶寬,并通過在 pipeline 中維持較少的微操作數量來降低功耗。這些改進代表了提高 x86 整體性能和功耗效率的微架構變遷。
那么就存在一個重要的問題:現代 AMD 和英特爾 CPU 為 x86 兼容性付出了多大的代價?
Agner 提到的解碼瓶頸、分支預測和 pipeline 復雜性是 ARM 認為 x86 產生的「CISC tax」的一部分。過去,英特爾和 AMD 告訴我們解碼功耗只是芯片總功耗的極小一部分。但是,如果 CPU 正在為微操作緩存或復雜的分支預測器消耗能量以彌補解碼帶寬的不足,那么意義就不一樣了。微操作緩存功耗和分支預測功耗均由 CPU 的微架構及其制造制程節點決定。「RISC 與 CISC」并沒有充分體現這三個變量之間關系的復雜性。
也許我們還需要幾年的時間才能知道蘋果的 M1 和高通未來的 CPU 是否代表了市場翻天覆地的變化,AMD 和英特爾是否將面臨下一個挑戰。保持 x86 兼容性是否是現代 CPU 的負擔,這既是一個新問題,也是一個非常古老的問題。之所以說它是一個新問題是因為在 M1 推出之前,無法進行有意義的比較;說它是一個舊問題是因為當初 x86 CPU 誕生時,一些個人計算機延續使用非 x86 CPU 就讓這個主題引起過相當多的討論。
AMD 仍在以每年 1.15 至 1.2 倍的速度改進 Zen,英特爾的 Alder Lake 也將使用低功耗 x86 CPU 內核來改進功耗,兩家 x86 制造商都在不斷改進他們的方法。需要一些時間來觀察這些內核及其后繼者如何與未來的蘋果產品競爭,但 x86 一直未脫離這場競爭。
回到最初那個問題:為什么用 RISC 與 CISC 比較 x86 和 ARM CPU 是錯誤的?
當 Patterson 和 Ditzel 創造 RISC 和 CISC 時,他們打算闡明 CPU 設計的兩種不同策略。四十年過去了,這些術語既模糊又清晰。RISC 和 CISC 并非毫無意義,但這兩個術語的含義和適用性已變得高度語境化。
使用 RISC 與 CISC 來比較現代 x86 和 ARM CPU,其問題在于:它需要 3 個對 x86 和 ARM 比較重要的特定屬性——制程節點、微架構和 ISA——將 3 個屬性結婚在一起,然后才能聲明 ARM 在 ISA 的基礎上更勝一籌。「以 ISA 為中心」與「以實現為中心」是一種更好的理解方式,但前提是人們需要記得兩者之間的關系。具體來說:
以 ISA 為中心的觀點認為制造幾何(manufacturing geometry)和微架構非常重要,并且促成了 x86 在 PC、服務器和 HPC 市場曾經的主導地位。這種觀點認為,當制造能力和安裝基礎的優勢被控制或取消時,RISC(以及 ARM CPU)通常會優于 x86 CPU。
以實現為中心的觀點認為 ISA 確實很重要,但從發展歷程的角度看,微架構和制程幾何(process geometry)更重要。當前,英特爾正在努力縮小一些業內差距,AMD 在努力改進 Ryzen(尤其是在移動領域)。但從發展歷程上看,這兩家 x86 制造商都表現出具備與 RISC CPU 制造商有效競爭的能力。
考慮到 CPU 設計周期的現實情況,我們還需要幾年的時間才能真正得出哪個觀點更好的答案。今天的半導體市場與 20 年前的市場之間有一個區別:與英特爾在 1990 年代末和 2000 年代初所面臨的大多數 RISC 制造商相比,臺積電是一個更強大的代工競爭對手。英特爾的 7nm 團隊不得不承受巨大的壓力。
RISC 與 CISC 是理解兩種不同類型 CPU 之間差異的起點,而不是今天如何比較的準確依據。