近半年來不斷有基于ARM的MacBook Pro筆記本電腦的消息。傳言指出,蘋果將推出一系列升級的系統(tǒng),比如基于“M2”的CPU,即去年首次亮相的M1的放大版。據(jù)報道,M2可能有八個高性能內(nèi)核和兩個高效內(nèi)核,高于現(xiàn)有M1的4+4配置。
隨著基于ARM的M1的推出,出現(xiàn)了大量的x86與ARM的比較,以及對新架構(gòu)進行比較和對比的討論。在這些討論中,你會經(jīng)??吹紺ISC和RISC。ARM與x86的比較和CISC與RISC的比較之間的聯(lián)系非常強烈。
這種聯(lián)系會導(dǎo)致錯誤的聯(lián)想,認(rèn)為x86與ARM可以被整齊地對應(yīng)為CISC與RISC,x86是CISC,ARM是RISC。三十年前,確實是這樣的,今天的情況卻不是這樣了。關(guān)于如何將x86 CPU與其他公司制造的處理器進行比較是個老生常談的話題,因為x86在近20年里沒有一個有意義的對手。ARM可能會突出地將自己定位為一家RISC CPU公司,但今天這些術(shù)語對x86和ARM CPU狀態(tài)的掩蓋和澄清一樣多。
行業(yè)共識
RISC是David Patterson和David Ditzel在他們1981年的論文“The Case for a Reduced Instruction Set Computer”中創(chuàng)造的一個術(shù)語。二人根據(jù)1970年代末觀察到的趨勢和當(dāng)時的CPU遇到的擴展問題,提出了一種新的半導(dǎo)體設(shè)計方法。他們提出了“CISC”一詞(復(fù)雜指令集計算機)來描述許多已經(jīng)存在的、不遵循RISC原則的各種CPU架構(gòu)。
由于限制CPU性能的瓶頸發(fā)生了變化,這種對CPU設(shè)計的新方法的需求也隨之而來。所謂的CISC設(shè)計,包括最初的8086,是通過將復(fù)雜性轉(zhuǎn)移到硬件中來處理內(nèi)存的高成本問題。他們強調(diào)代碼密度,一些指令在一個變量上依次執(zhí)行多個操作。作為一種設(shè)計理念,CISC試圖通過最大限度地減少CPU在執(zhí)行特定任務(wù)時必須執(zhí)行的指令數(shù)量來提高性能。CISC指令集架構(gòu)通常提供廣泛的特定指令。
到20世紀(jì)70年代末,CISC CPU有一些缺點。由于當(dāng)時的VLSI(超大規(guī)模集成)技術(shù)無法將所有必要的組件裝入一個單一的封裝中,它們通常必須在多個芯片上實現(xiàn)。實施復(fù)雜的指令集架構(gòu),支持大量很少使用的指令,消耗了芯片空間,降低了可實現(xiàn)的最大時鐘速度。同時,內(nèi)存的成本在穩(wěn)步下降,使得對代碼大小的強調(diào)變得不再重要。
Patterson和Ditzel認(rèn)為,CISC CPU仍然在試圖解決從未完全實現(xiàn)的代碼膨脹問題。他們提出了一個根本不同的處理器設(shè)計方法。意識到絕大多數(shù)CISC指令沒有被使用(可以認(rèn)為這是帕累托原則或80/20規(guī)則的應(yīng)用),作者提出了一套更小的固定長度的指令,所有這些指令將在一個時鐘周期內(nèi)完成。雖然這將導(dǎo)致RISC CPU每條指令的執(zhí)行量比CISC對應(yīng)的指令少,但芯片設(shè)計者將通過簡化他們的處理器來彌補這一缺陷。
這種簡化將允許晶體管預(yù)算用于其他功能,如額外的寄存器。1981年考慮的未來功能包括“片上緩存、更大更快的晶體管,甚至是pipelining”。RISC CPU的目標(biāo)是盡可能快地執(zhí)行接近一個IPC(每時鐘周期的指令,衡量CPU效率的一個標(biāo)準(zhǔn))。以這種方式重新分配資源,其最終結(jié)果將超過任何可比的CISC設(shè)計。
沒過多久,這些設(shè)計原則就證明了它的價值。MIPS公司在1985年推出的R2000,在某些情況下能夠維持接近1的IPC。早期的RISC CPU系列如SPARC和惠普的PA-RISC系列也創(chuàng)造了性能記錄。在20世紀(jì)80年代末和90年代初,經(jīng)常聽到有人說,像x86這樣基于CISC的架構(gòu)已經(jīng)成為過去,也許對家庭計算來說已經(jīng)足夠好了,但如果你想用真正的CPU工作,你要買一個RISC芯片。數(shù)據(jù)中心、工作站和HPC是RISC CPU最成功的地方,如下圖所示。
這張英特爾的圖片很有用,但需要一點背景。“英特爾架構(gòu)”似乎只指x86 CPU,而不是像8080這樣的芯片,后者在早期計算機市場上很受歡迎。同樣,英特爾在2000年有一些“RISC”類別的超級計算機。具體來說,是x86機器獲得了市場份額。
考慮一下這張圖片對1990年CPU市場狀況的描述。到1990年,x86將非x86的CPU限制在個人電腦市場的20%,但在數(shù)據(jù)中心幾乎沒有x86的份額,在HPC也沒有。當(dāng)蘋果想在下一代CPU設(shè)計上下注時,它在1991年選擇了PowerPC,因為它相信按照RISC原則構(gòu)建的高性能CPU是計算的未來。
關(guān)于CISC與RISC的共同歷史的協(xié)議在20世紀(jì)90年代初就停止了。英特爾的x86架構(gòu)后來主導(dǎo)了個人電腦、數(shù)據(jù)中心和HPC領(lǐng)域,這一點是無可爭議的。有爭議的是,英特爾和AMD是否通過采用RISC設(shè)計的某些原則實現(xiàn)了這一目標(biāo),還是他們聲稱那樣做是謊言。
不同的聲音像RISC和CISC這樣的術(shù)語之所以不好理解,其中一個原因是對某些CPU發(fā)展的意義和性質(zhì)存在著長期的分歧。
首先,這是來自RealWorldTech的Paul DeMone在“RISC vs. CISC Still Matters”中所說的:
隨著現(xiàn)代x86處理器的實現(xiàn),采用固定長度的控制字來操作無序執(zhí)行數(shù)據(jù)路徑,混淆RISC和CISC之間的明確區(qū)別的運動進入了高潮……“RISC和CISC正在融合”的觀點是一個根本上有缺陷的概念,可以追溯到1992年i486的發(fā)布,其根源是對指令集架構(gòu)和物理處理器實現(xiàn)細(xì)節(jié)之間的區(qū)別的普遍無知。
相比之下,Jon“Hannibal”Stokes在“RISC vs. CISC: the Post-RISC Era”中寫道:
現(xiàn)在,應(yīng)該很明顯,RISC和CISC這兩個縮寫詞掩蓋了這樣一個事實,即這兩種設(shè)計理念所處理的不僅僅是指令集的簡單性或復(fù)雜性……根據(jù)對RISC和CISC的歷史發(fā)展的了解,以及他們各自試圖解決的問題,現(xiàn)在應(yīng)該很明顯,這兩個術(shù)語會變成無稽之談……無論如何RISC和CISC的爭論早已結(jié)束,現(xiàn)在必須進行更細(xì)微、更有趣的討論,將每個平臺,硬件和軟件、ISA和實現(xiàn)放在其自身的優(yōu)點上。
這些文章都不是新的。Stokes的文章寫于1999年,DeMone的文章寫于2000年。我引用了他們的話來證明RISC和CISC的區(qū)別是否與現(xiàn)代計算有關(guān),這個問題實際上已經(jīng)有20多年的歷史了。Jon Stokes非常專業(yè),很顯然不會掉進DeMone所說的“無知”陷阱。
實施與ISA
談?wù)揅ISC與RISC有兩種不同觀點。一種觀點與ARM或蘋果今天的觀點大致相似。這被稱為以ISA為中心的立場。
另一種觀點是過去幾十年來在PC媒體中普遍占主導(dǎo)地位的觀點。我們稱其為以實施為中心的立場。我使用“實施(Implementation)”這個詞是因為它在上下文中既可以指CPU的微架構(gòu),也可以指用于制造物理芯片的工藝節(jié)點。這兩個因素都與我們的討論有關(guān)。
根據(jù)以ISA為中心的立場,RISC指令集有一些先天的特點,使這些架構(gòu)比它們的x86表親更有效率,包括使用固定長度的指令和加載/存儲設(shè)計。雖然CISC和RISC之間的一些原始差異不再有意義,但以ISA為中心的觀點認(rèn)為,就x86和ARM之間的性能和功率效率而言,剩余的差異仍然是決定性的,提供了一個蘋果對蘋果的比較。
這種以ISA為中心的觀點認(rèn)為,英特爾、AMD和x86勝過MIPS、SPARC和POWER/PowerPC有三個原因。英特爾卓越的工藝制造,隨著時間的推移,英特爾卓越的制造使所謂的“CISC稅”逐漸減少,以及二進制兼容性使x86隨著其安裝基礎(chǔ)的增長而更有價值,無論它是否是最好的ISA。
以實施為中心的觀點認(rèn)為,自從RISC和CISC這樣的術(shù)語被發(fā)明以來,現(xiàn)代CPU已經(jīng)發(fā)生了變化,并認(rèn)為我們正在使用一對完全過時的類別。
這里有一個例子。今天,x86和高端ARM CPU都使用失序執(zhí)行來提高CPU性能。使用硅片在中重新排序指令以提高執(zhí)行效率,這與RISC最初的設(shè)計理念完全相悖。有人主張采用能夠以更高的時鐘速度運行的不太復(fù)雜的CPU。現(xiàn)代ARM CPU的其他共同特征,如SIMD執(zhí)行單元和分支預(yù)測,在1981年也不存在。RISC的最初目標(biāo)是讓所有指令在一個周期內(nèi)執(zhí)行,大多數(shù)ARM指令符合這一規(guī)則,但ARMv8和ARMv9 ISA包含需要一個以上時鐘周期才能執(zhí)行的指令?,F(xiàn)代x86 CPU也是如此。
以實施為中心的觀點認(rèn)為,工藝節(jié)點的改進和微架構(gòu)的增強相結(jié)合,使x86很早就縮小了與RISC CPU的差距,在非常低的功率范圍內(nèi),ISA級別的差異是不相關(guān)的。這是2014年一項關(guān)于ISA效率的研究所支持的觀點,這也是英特爾和AMD普遍支持的觀點。
但這是對的嗎?
RISC和CISC的發(fā)展是否趨同?
以實施為中心的觀點是,幾十年來,CISC和RISC CPU一直在向?qū)Ψ窖葸M,從1990年代中期x86 CPU采用新的“類RISC”解碼方法開始。
常見的解釋是這樣的。在20世紀(jì)90年代初,英特爾和其他x86 CPU制造商意識到,在未來提高CPU性能需要的不僅僅是更大的緩存或更快的時鐘。多家公司決定投資于x86 CPU微架構(gòu),這些微架構(gòu)將在飛行中重新排列自己的指令流以提高性能。作為該過程的一部分,本地x86指令被送入x86解碼器,并在執(zhí)行前被翻譯成“類RISC”的微操作。
這已經(jīng)是二十多年來的傳統(tǒng)智慧,但最近它又受到了挑戰(zhàn)。早在2020年,Erik Engheim在Medium上發(fā)表的一篇文章中寫道:“x86芯片中沒有RISC內(nèi)部結(jié)構(gòu)。這只是一種營銷策略。”他同時指出了DeMone的故事和P6微架構(gòu)背后的首席架構(gòu)師Bob Colwell的一段話。
P6微架構(gòu)是英特爾第一個實現(xiàn)失序執(zhí)行和原生x86-micro-op解碼引擎的微架構(gòu)。P6是作為奔騰Pro出貨的,它演變成了奔騰II、奔騰3,以及更多。它是現(xiàn)代x86 CPU的祖先。
英特爾的x86處理器在“引擎”下沒有一個RISC引擎。他們通過解碼/執(zhí)行方案實現(xiàn)x86指令集架構(gòu),該方案依賴于將x86指令映射為機器操作,或復(fù)雜指令的機器操作序列,然后這些操作在微架構(gòu)中找到自己的方式,遵守關(guān)于數(shù)據(jù)依賴性的各種規(guī)則,并最終確定時間順序。
完成這一壯舉的“微操作”有100多比特,攜帶各種奇怪的信息,不能由編譯器直接生成,不一定是單周期。但最重要的是,它們是一種微架構(gòu)的假象……微操作的想法不是“受RISC啟發(fā)”,“類RISC”,或與RISC完全有關(guān)。這是設(shè)計團隊找到了一種方法來打破一個非常復(fù)雜的指令集的復(fù)雜性,使其脫離了競爭性微處理器中的微架構(gòu)機會和限制。
到此應(yīng)該可以結(jié)案了吧,對嗎?
并非如此。
英特爾并不是第一個將x86前端解碼器與聲稱是“RISC風(fēng)格”的后端相結(jié)合的x86 CPU制造商。后來被AMD收購的NexGen公司就是這樣。NexGen 5×86 CPU于1994年3月首次亮相,而Pentium Pro直到1995年11月才推出。以下是NexGen對其CPU的描述。“Nx586處理器是NexGen的創(chuàng)新和專利RISC86微架構(gòu)的第一個實現(xiàn)。”后來,該公司又給出了一些細(xì)節(jié)。“創(chuàng)新的RISC86方法動態(tài)地將x86指令轉(zhuǎn)換為RISC86指令。如下圖所示,Nx586利用了RISC的性能原理。由于RISC86的環(huán)境,每個執(zhí)行單元更小,更緊湊。”
仍然可以說這是營銷言論,僅此而已,所以讓我們提前到1996年和AMD的K5。K5通常被描述為與AMD從其32位RISC微控制器Am29000借來的執(zhí)行后端結(jié)和的x86前端。在我們查看它的框圖之前,我想把它與最初的英特爾奔騰進行比較。奔騰可以說是CISC x86進化的頂峰,因為它在x86 CPU中同時實現(xiàn)了流水線和超大規(guī)模,但沒有將x86指令轉(zhuǎn)化為微操作,也缺乏失序執(zhí)行引擎。
如果花時間看微處理器框圖,K5應(yīng)該看起來很熟悉,而奔騰則不一樣。AMD在Nx586推出后收購了NexGen。K5是AMD的自主設(shè)計,但K6最初是NexGen的產(chǎn)品。從這一點來看,CPU開始看起來更像我們今天熟悉的芯片。而根據(jù)設(shè)計這些芯片的工程師們的說法,這些相似之處不只停留在表面。
AMD公司的David Christie早在1996年就在IEEE Micro上發(fā)表了一篇關(guān)于K5的文章,談到了它如何將RISC和CISC混合在一起。
我們開發(fā)了一個松散地基于29000指令集的微型ISA。一些額外的控制字段將微指令的大小擴大到59位。其中一些簡化了超標(biāo)量控制邏輯并提高了其速度。其他的則提供了x86特有的功能,這些功能對于用微指令序列合成來說性能太關(guān)鍵了。但是,這些微指令仍然堅持基本的RISC原則:簡單的寄存器到寄存器的操作,對寄存器指定符和其他字段進行固定位置編碼,每次操作不超過一個內(nèi)存引用。由于這個原因,我們稱它們?yōu)镽ISC操作,或簡稱為ROP(發(fā)音為R-ops)。它們簡單、通用的性質(zhì)給了我們很大的靈活性來實現(xiàn)更復(fù)雜的x86操作,有助于保持執(zhí)行邏輯相對簡單。
然而,RISC微架構(gòu)最重要的方面是,x86指令集的復(fù)雜性在解碼器處停止,對失序執(zhí)行核心基本透明。這種方法除了投機性失序RISC執(zhí)行所需的控制復(fù)雜性外,幾乎不需要額外的控制復(fù)雜性來實現(xiàn)投機性失序x86執(zhí)行。一個任務(wù)切換的ROP序列看起來并不比一串簡單指令的復(fù)雜。執(zhí)行核心的復(fù)雜性實際上是與架構(gòu)的復(fù)雜性隔離開來的,而不是被它所復(fù)合。
Christie并沒有混淆ISA和CPU物理實現(xiàn)的細(xì)節(jié)之間的區(qū)別。他認(rèn)為,物理實現(xiàn)本身在重要的方面是“類似于RISC”。
K5重新使用了AMD為其Am29000系列RISC CPU開發(fā)的部分執(zhí)行后端,它實現(xiàn)的內(nèi)部指令集比本地x86 ISA更像RISC。NexGen和AMD在此期間提到的RISC風(fēng)格的技術(shù)參考了數(shù)據(jù)緩存、流水線和超標(biāo)量架構(gòu)等概念。這些概念沒有一個是嚴(yán)格意義上的RISC,但它們都首先在RISC CPU中亮相,而且在K5還是新的時候,它們是與RISC CPU相關(guān)的優(yōu)勢。將這些功能作為“類RISC”來推銷是有意義的,這與那個時代的OEM廠商將他們的PC描述為“IBM兼容”是有意義的。
這些功能在多大程度上是RISC,以及x86 CPU是否能解碼RISC風(fēng)格的指令,取決于你選擇的問題框架標(biāo)準(zhǔn)。這個爭論比奔騰Pro更大,即使P6是與失序執(zhí)行引擎等技術(shù)的發(fā)展最相關(guān)的微架構(gòu)。不同公司的不同工程師有他們自己的觀點。
x86 CPU在現(xiàn)代有多大的局限性?
現(xiàn)在是時候把這個討論拉到現(xiàn)代,并考慮這種RISC與CISC的比較對今天實際出貨的ARM和x86 CPU有什么影響。當(dāng)我們將AMD和英特爾的CPU與蘋果的M1和未來的M2進行比較時,我們真正要問的問題是,是否存在歷史上的x86瓶頸,使x86無法與蘋果和高通等公司的未來ARM芯片進行有效競爭?
根據(jù)AMD和英特爾的說法。根據(jù)ARM的說法:不。是的。由于所有相關(guān)公司都有明顯的利益沖突,可以參考Agner Fog的回答。
Agner Fog是一位丹麥進化人類學(xué)家和計算機科學(xué)家,因其在x86架構(gòu)方面的大量資源而聞名。如果你想了解各種英特爾和AMD CPU的底層行為,他的微架構(gòu)手冊幾乎是必讀的。
ISA并不是無關(guān)緊要的。x86 ISA是非常復(fù)雜的,因為長期以來,小的增量變化和補丁給ISA增加了更多的功能,而這個ISA確實沒有空間容納這些新功能……
復(fù)雜的x86 ISA使解碼成為瓶頸。一條x86指令可以有從1到15個字節(jié)的任何長度,而計算長度是相當(dāng)復(fù)雜的。而且你需要知道一條指令的長度,然后才能開始解碼下一條指令。如果你想在每個時鐘周期解碼4條或6條指令,這當(dāng)然是個問題!英特爾和AMD現(xiàn)在都在不斷增加更大的微操作緩存來克服這個瓶頸。ARM有固定大小的指令,所以這個瓶頸不存在,也不需要微操作緩存。
x86的另一個問題是,它需要一個長的流水線來處理復(fù)雜問題。分支錯誤預(yù)測的懲罰等于管道的長度。因此,他們正在增加越來越復(fù)雜的分支預(yù)測機制,包括大型分支歷史表和分支目標(biāo)緩沖器。當(dāng)然,所有這些都需要更多的硅空間和更多的功率消耗。
盡管有這些負(fù)擔(dān),X86 ISA還是相當(dāng)成功。這是因為它可以為每條指令做更多的工作。例如,具有32位指令的RISC ISA不能在一條指令中加載一個內(nèi)存操作數(shù),如果它需要32位的內(nèi)存地址。
Agner在他的微架構(gòu)手冊中還寫道,最近AMD和英特爾CPU設(shè)計的趨勢又回到了CISC原則,以更好地利用有限的代碼緩存,增加流水線帶寬,并通過在流水線上保留更少的微操作來降低功耗。這些改進代表了微架構(gòu)的偏移,改善了x86的整體性能和功率效率。
在這里,我們終于來到了問題的核心。現(xiàn)代AMD和英特爾CPU為x86兼容性付出了多大的代價?
Agner在上面提到的解碼瓶頸、分支預(yù)測和流水線的復(fù)雜性是ARM認(rèn)為x86所承擔(dān)的“CISC稅”的一部分。過去,英特爾和AMD曾告訴我們解碼功率在芯片總功耗中只占一位數(shù)。但是,如果CPU為了彌補解碼帶寬的不足而燒掉微操作緩存或復(fù)雜的分支預(yù)測器的功率,這就沒有什么意義了。微操作緩存的功耗和分支預(yù)測的功耗都是由CPU的微架構(gòu)和其制造工藝節(jié)點決定的。RISC與CISC并不能充分體現(xiàn)這三個變量之間關(guān)系的復(fù)雜性。
我們還需要幾年時間才能知道蘋果的M1和高通公司未來的CPU是否代表了市場的巨大變化,或者AMD和英特爾將迎接的下一個挑戰(zhàn)。維持x86兼容性是否是現(xiàn)代CPU的負(fù)擔(dān),既是一個新問題,也是一個非常古老的問題。新,是因為在M1推出之前,沒有任何有意義的比較。舊,因為這個話題曾經(jīng)有相當(dāng)多的討論,那時還有非x86的CPU在個人電腦中使用。
AMD繼續(xù)以每年1.15-1.2倍的速度改進Zen。我們知道英特爾的Alder Lake也將使用低功耗的x86 CPU內(nèi)核來改善空閑功耗。這兩家x86制造商都在繼續(xù)發(fā)展他們的性能方法。我們需要時間來觀察這些內(nèi)核以及它們的后繼者是如何與未來的蘋果產(chǎn)品相抗衡的,x86并沒有退出這場戰(zhàn)斗。
為什么RISC與CISC是比較x86、ARM CPU的錯誤方式?
當(dāng)Patterson和Ditzel創(chuàng)造了RISC和CISC時,他們打算澄清CPU設(shè)計的兩種不同策略。40年過去了,這兩個術(shù)語在澄清的同時也模糊了許多。RISC和CISC并非毫無意義,但這兩個術(shù)語的含義和適用性已經(jīng)變得高度相關(guān)。
[參考文章]
RISC vs. CISC Is the Wrong Lens for Comparing Modern x86, ARM CPUs — Joel Hruska