都2021年了,還把x86和ARM歸為CISC和RISC?

机器之心發表於2021-10-28

William Faulker:「過去永遠不會死,它甚至還沒有過去。」


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 都沒有一個真正的架構競爭對手。

都2021年了,還把x86和ARM歸為CISC和RISC?

發展歷程

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) 為例:

都2021年了,還把x86和ARM歸為CISC和RISC?

注:此處「英特爾架構」僅指 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 指令轉換為微操作,也缺乏亂序執行引擎。

都2021年了,還把x86和ARM歸為CISC和RISC?

AMD K5 框架圖如下圖所示:

都2021年了,還把x86和ARM歸為CISC和RISC?

如果你曾經研究過微處理器原理圖,你可能會發現 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 之間差異的起點,而不是今天如何比較的準確依據。

原文連結:https://www.extremetech.com/computing/323245-risc-vs-cisc-why-its-the-wrong-lens-to-compare-modern-x86-arm-cpus

相關文章