關(guān)于RISC和CISC處理器的區(qū)別,大多數(shù)人會認(rèn)為是一些特性、指令,或者是晶體管數(shù)量的差異。但實際上兩者之間的差別不能簡單地一概而論。
少量指令并不意味著RISC
首先,我們需要摒棄一些非常明顯的誤解。因為RISC的意思是簡化指令集計算機(Reduced Instruction Set Computer),所以很多人認(rèn)為RISC處理器只是一個沒有多少指令的CPU。如果是這樣的話,那么6502處理器將是有史以來最RISCy的處理器之一,它只有56條指令。甚至英特爾8086也可以算作RISC處理器,因為它只有81條指令。即使是后來的Intel 80286也只有大約100條指令。
像AVR這樣簡單的8位RISC處理器有78條指令。如果您看看最早的32位RISC處理器之一,比如PowerPC 601(1993年發(fā)布),它有273個指令。
MIPS32指令集來源于伯克利的原始RISC處理器,它也有200多條指令。
我們可以將其與CISC 32位處理器(如80386)進行比較,后者只有略多于170條指令。差不多時間亮相的MIPS R2000處理器在大約有92條指令。
For the curios:x86 instruction listingsPentium instruction set6502 Instruction SetMIPS R2000 InstructionSet 古玩:x86指令列表奔騰指令集6502指令集MIPS R2000指令集
也就是說,類似x86指令集、奔騰指令集、6502指令集、MIPS R2000指令集一開始都具有很少指令集,但它們都不是RISC處理器。
少數(shù)晶體管并不意味著RISC
CISC和RISC處理器之間的晶體管數(shù)量的分界點是多少?根本沒有。6502有4528個晶體管。第一個ARM處理器有25000個晶體管。或者這個有趣的小事實。摩托羅拉68060被認(rèn)為是那個時代最具代表性的CISCy的處理器之一,它只有250萬個晶體管,比1994年發(fā)布的IBM PowerPC 601的280萬個晶體管還要少。如果你看一下幾乎同時發(fā)布的RISC和CISC處理器,沒有明顯的趨勢表明RISC處理器比CISC處理器有更少的晶體管和更少的指令。
所以讓我們得出結(jié)論,我們不能根據(jù)晶體管或指令數(shù)量區(qū)分RISC或CISC芯片。但是問題仍然存在,到底是什么是RISC微處理器或CISC微處理器?
RISC和CISC是不同的晶體管預(yù)算理念
當(dāng)你的老板告訴你“這里,有一百萬個晶體管,給我做一個快速的處理器!”,那么你就有很多方法可以實現(xiàn)這個目標(biāo)。對于相同數(shù)量的晶體管,RISC和CISC的設(shè)計者將會做出不同的選擇。伯克利的David A. Patterson廣為人所知的可能是他在1980年發(fā)表的論文《簡化指令集計算機的案例》中推廣了RISC處理器的思想。Patterson在這篇論文中概述的并不是芯片制造的詳細藍圖,而更像是哲學(xué)指導(dǎo)方針。在現(xiàn)實世界的程序中,添加這個指令會提高多少性能?硬件方面的影響是什么?我們是否需要存儲大量復(fù)雜的狀態(tài),這使得上下文切換和無序執(zhí)行更加復(fù)雜,因為需要存儲大量的狀態(tài)?一個設(shè)計良好的簡單指令的組合能以相當(dāng)?shù)男阅芡瓿赏瑯拥墓ぷ鲉?我們是否可以利用現(xiàn)有的算術(shù)邏輯單元(ALUs)和CPU上的其他資源來添加這條指令,或者我們需要添加很多新東西?如果不添加這條指令,這些晶體管的其他用途是什么?更多的緩存嗎?更好的分支預(yù)測嗎?重要的是要理解這些規(guī)則適用于給定的晶體管預(yù)算。如果你有更多的晶體管,你可以添加更多的指令,甚至更復(fù)雜的指令。然而,RISC的哲學(xué)優(yōu)先考慮保持指令集的簡單。這意味著RISC設(shè)計者首先會嘗試通過其他方法來提高性能,而不是添加如下指令:-
使用晶體管增加更多的緩存
-
更多的CPU寄存器
-
更好的管道
-
更好的分支預(yù)測
-
超標(biāo)量體系結(jié)構(gòu)的體系結(jié)構(gòu)
-
添加更多的指令解碼器
-
亂序執(zhí)行
-
Macro-operation融合
-
壓縮指令
因此,設(shè)計一個好的RISC指令集(ISA)的一個關(guān)鍵目標(biāo)是使設(shè)計不妨礙未來的微架構(gòu)優(yōu)化。
這與CISC設(shè)計者設(shè)計CPU的方式不同。為了能夠提供更好的性能,那么CISC設(shè)計者將添加引入更多狀態(tài)以跟蹤狀態(tài)寄存器等復(fù)雜指令。CISC設(shè)計理念的問題
問題是CISC的設(shè)計師沒有超前思考。將來你的晶體管預(yù)算可能會增加。突然之間,你有了所有這些好的晶體管,可以用來創(chuàng)建無序(OoO)超標(biāo)標(biāo)量處理器邏輯。這意味著您在每個時鐘周期解碼多個指令,并將它們放在一個指令隊列中。然后,OoO邏輯會找出哪些指令不相互依賴,以便它們可以并行運行。如果您是軟件開發(fā)人員,您可以考慮函數(shù)式編程(functional programming)和命令式編程(imperative programming)之間的區(qū)別。為了獲得短期性能收益而改變?nèi)謹(jǐn)?shù)據(jù)可能很誘人。然而,一旦你并行運行,而全局狀態(tài)被多個函數(shù)改變了,這可能會在多個線程中并行運行,這絕對是一場噩夢。函數(shù)式編程喜歡只依賴于輸入而不依賴全局?jǐn)?shù)據(jù)的純函數(shù)。這些函數(shù)可以很容易地并行運行。同樣的機制也適用于CPU。不依賴于全局狀態(tài)(如狀態(tài)寄存器)的匯編代碼指令可以更容易地并行或流水線運行。RISC-V就是這種思想的一個很好的例子。RISC-V沒有狀態(tài)寄存器。比較和跳轉(zhuǎn)指令合二為一。除非運行額外的計算來確定是否發(fā)生了溢出,否則無法用狀態(tài)寄存器捕獲整數(shù)溢出。這應(yīng)該會給你一些關(guān)于RISC和CISC區(qū)別的線索。
一個RISC處理器設(shè)計的優(yōu)先級
如果10條新指令對微架構(gòu)沒有顯著影響,那么RISC設(shè)計者添加10條新指令不一定會有問題。如果一條指令要求在CPU中表示更多的全局狀態(tài),那么RISC設(shè)計人員將會非常不愿意添加一條指令。這種哲學(xué)的最終結(jié)果是,從歷史上看,在RISC處理器上添加管道和超標(biāo)量架構(gòu)比CISC處理器更容易,因為人們避免了添加指令,從而引入狀態(tài)管理或控制邏輯,這使得添加這些微架構(gòu)創(chuàng)新變得困難。這就是為什么RISC-V團隊更喜歡進行宏操作(macro-operation)融合,而不是添加支持復(fù)雜尋址模式或整數(shù)溢出檢測的指令。RISC的理念導(dǎo)致了不斷出現(xiàn)的特殊設(shè)計選擇,這讓我們能夠討論在比較RISC和CISC處理器時所觀察到的更具體的差異。讓我們看看這些。
現(xiàn)代RISC和CISC處理器的特點
某些設(shè)計選擇不斷出現(xiàn)在許多不同的RISC處理器上。通常情況下,RISC處理器傾向于使用固定長度的32位指令。也有一些例外,比如AVR,它使用固定長度的16位指令。相比之下,Intel x86處理器的指令長度為1到15字節(jié)。摩托羅拉68k處理器,另一個著名的CISC設(shè)計,有2到10字節(jié)長的指令(16位到80位)。
; 68k Assembly code
MOVE.B 4, 12 ; mem[4] → mem[12]
MOVE.B (A1), (A2) ; mem[A1] → mem[A2]

在RISC處理器中的算術(shù)邏輯單元(ALU)只能從寄存器而不是內(nèi)存中獲取輸入。
加載/存儲體系結(jié)構(gòu)
機器代碼指令必須對正在執(zhí)行的信息進行編碼,例如它是在執(zhí)行ADD、SUB還是MUL。它還必須對輸入的信息進行編碼。輸入寄存器和輸出寄存器是什么。一些指令需要對要加載數(shù)據(jù)的地址進行編碼。在RISC-V指令中是這樣編碼的:
; 68k assembly
ADD.L D3, 4(A2) ; D3 + mem[4 + A2] → mem[4 + A2]
# RISC-V assembly
LW x4, 4(x2) # x4 ← mem[x2+4]
ADD x3, x4, x3 # x3 ← x4 + x3
SW x3, 4(x2) # x3 → mem[x2+4]
你不需要通過結(jié)合地址寄存器(A0到A7)來計算地址。你可以直接指定一個內(nèi)存地址,比如400:
; 68k assembly
ADD.L 400, D4 ; mem[400] + D4 → D4
但即使是這樣一個看似簡單的操作也需要多個RISC指令。
# RISC-V assembly
LW x2, 400(x0) # x3 ← mem[x0 + 400]
ADD x4, x4, x3 # x4 ← x4 + x3
在很多RISC設(shè)計中,x0寄存器總是0,這意味著即使你只對絕對內(nèi)存地址感興趣,你也可以始終使用偏移加基寄存器的形式。雖然這些偏移量看起來與您在68k上所做的非常相似,但它們的限制要大得多,因為您總是需要適合一個32位字。使用68k,可以給ADD.L一個完整的32位地址。你不能用RISC-V LW和SW。獲得完整的32位地址是相當(dāng)麻煩的。假設(shè)您希望從32位地址:0x00042012加載數(shù)據(jù),則必須分別加載上面的20位和下面的12位,以形成一個32位地址。
# RISC-V assembly
LUI x3, 0x42 # x3[31:12] ← 0x42 put in upper 20-bits
ADDI x3, x3, 0x12 # x3 ← x3 + x3 + 0x12
LW x4, 0(x3) # x4 ← mem[x3+0]
實際上這可以簡化為:LUI x3, 0x42 LW x4, 0x12(x3)
我記得當(dāng)我從68k組裝轉(zhuǎn)到PowerPC(蘋果以前使用的RISC處理器)時,這讓我很惱火。當(dāng)時我認(rèn)為RISC意味著一切都將變得更容易。我發(fā)現(xiàn)x86很麻煩,很難處理。然而,對于匯編編碼員來說,RISC不像68k那樣方便地使用CISC指令集。幸運的是,有一些簡單的技巧可以使這個過程在RISC處理器上變得更容易。RISC-V定義了一些偽指令,以簡化匯編代碼的編寫。使用LA (load address)偽指令,我們可以像這樣編寫前面的代碼:
# RISC-V assembly with pseudo instructions
LI x3, 0x00042012 # Expands to a LUI and ADDI
LW x4, 0(x3)
總而言之:雖然加載/存儲體系結(jié)構(gòu)使編寫匯編代碼變得更麻煩,但它允許我們保持每個指令為32位長。這意味著創(chuàng)建一個可以并行解碼多個指令的超標(biāo)標(biāo)量微體系結(jié)構(gòu)需要更少的晶體管來實現(xiàn)。流水線化每條指令變得更容易,因為它們中的大多數(shù)可以適合經(jīng)典的5步RISC流水線。
RISC處理器有很多寄存器
使用像68k這樣的高級CISC處理器,您可以用一條指令做很多事情。假設(shè)您想將數(shù)字從一個數(shù)組復(fù)制到另一個數(shù)組。下面是一個使用指針的C語言例子:
// C code
int data[4] = {4, 8, 1, 2, -1};
int *src = data;
while (*xs > 0)
*dst++ = *src++;
如果你在68k處理器上將指針src存儲在地址寄存器A0中,將指針dst存儲在地址寄存器A1中,你可以在一條指令中復(fù)制并向前移動每個指針4個字節(jié):
; 68k assembly
MOVE.L (A0)+,(A1)+ ; mem[A1++] → mem[A2++]
這只是一個例子,但是一般來說,您可以使用CISC指令做更多的事情。這意味著您需要更少的代碼。因此,RISC設(shè)計者意識到他們的代碼會變得臃腫。因此,RISC的設(shè)計者們分析了真實的代碼,提出了一種方案,可以在不使用復(fù)雜指令的情況下減少代碼的大小。他們發(fā)現(xiàn)很多代碼只是用來加載和存儲內(nèi)存中的數(shù)據(jù)。通過添加大量寄存器,可以將臨時結(jié)果保存在寄存器中,而無需將它們寫入內(nèi)存。這將減少需要執(zhí)行的加載和存儲指令的數(shù)量,從而減少代碼的RISC代碼大小。因此,MIPS、SPARC、Arm(64位)和RISC-V處理器有32個通用寄存器。我們可以對比一下原來的x86,它只有8個通用寄存器。
復(fù)雜性的RISC/CISC視角
我在這個故事中想要說明的是,RISC處理器并不比CISC處理器差。區(qū)別在于RISC和CISC的設(shè)計者選擇增加復(fù)雜性。CISC設(shè)計人員將復(fù)雜性放在指令集體系結(jié)構(gòu)(ISA)中,而RISC設(shè)計人員寧愿將復(fù)雜性添加到他們的微體系結(jié)構(gòu)中,但正如我一直強調(diào)的,他們不希望指令集在微架構(gòu)中強加復(fù)雜性。讓我來比較一下MIPS R4000,摩托羅拉68040和英特爾486,以強調(diào)理念上的差異。它們都有大約120萬個晶體管,幾乎同時發(fā)布(1989年至1991年)。RISC處理器(R4000)是64位的,其他是32位的。R4000有8級pipeline ,允許比6級pipeline 的68040和5級pipeline 的486更高的時鐘頻率。更長的pipeline 給R4000從100-200 Mhz遠遠超過68040的40Mhz和486DX2得到66Mhz (100Mhz在一個更晚的模型)。最終在1993/1994年出現(xiàn)了速度更快的CISC處理器,如68060和Pentium。但與此同時出現(xiàn)了MIPS R8000,它是一種可以并行解碼4條指令的超標(biāo)量結(jié)構(gòu)。奔騰處理器每個時鐘周期只能解碼2條指令。
所以我們可以看到RISC的設(shè)計者們是如何喜歡花哨的微架構(gòu)而不是花哨的指令的。
“但是現(xiàn)代CISC處理器有復(fù)雜的微架構(gòu)!”您可能會抗議說,今天的CISC處理器有復(fù)雜的微架構(gòu)。他們所做的。一個現(xiàn)代的Intel或AMD處理器有多個解碼器、微操作緩存、高級分支預(yù)測器、無序(OoO)執(zhí)行引擎。然而,這并不奇怪。記住我關(guān)于晶體管預(yù)算理念的關(guān)鍵點:今天每個人都有很多晶體管可以使用,所以所有高端芯片都將有很多先進的微架構(gòu)功能。他們可以負擔(dān)得起他們的預(yù)算。關(guān)鍵在于:這些復(fù)雜的微體系結(jié)構(gòu)特性中的許多都是由復(fù)雜的CISC指令集強加的。例如,為了使pipelines 工作,x86處理器將其冗長復(fù)雜的指令分解成微操作。微操作很簡單,行為更像RISC操作,因此它們可以更容易地流水線化。
Arm vs RISC-V設(shè)計理念
比較現(xiàn)代RISC和CISC處理器的一個問題是,RISC基本上贏了。沒有人再從頭開始設(shè)計CISC處理器了。Intel和AMD的x86處理器今天之所以流行,主要是因為向后兼容。如果你今天讓一個設(shè)計團隊坐下來,告訴他們從頭開始設(shè)計一個高性能處理器,那么你最終不會得到傳統(tǒng)的CISC設(shè)計。然而,這并不意味著在RISC社區(qū)中,有多少設(shè)計師傾向于CISC或RISC的方向上沒有差異。現(xiàn)代的Arm處理器和基于RISC-V的處理器就是這種對比的有趣例子。Arm的設(shè)計者更愿意添加復(fù)雜的指令來提高性能。請記住,不是Arm不是RISC設(shè)計。當(dāng)你的晶體管預(yù)算增長,增加更復(fù)雜的指令是公平的。。RISC-V的設(shè)計者更熱衷于將ISA的復(fù)雜性保持在最低程度,而不是增加微架構(gòu)的復(fù)雜性,從而通過使用壓縮指令和宏操作融合等技巧來提高性能。我在這里討論這些設(shè)計選擇:RISC-V微處理器的天才。Arm和RISC-V的不同選擇不是隨意的,而是受到非常不同的目標(biāo)和市場的很大影響。Arm越來越多地進入高端市場。請記住,蘋果的Arm芯片正在與x86芯片展開正面競爭,不久,英偉達也會這樣做。RISC-V的目標(biāo)是成為一個更廣泛的架構(gòu),用于從鍵盤到人工智能加速器、從gGPU到專門的超級計算機的任何東西。RISC-V意味著靈活性,您添加的指令越復(fù)雜,您施加的復(fù)雜性就越小,從而減少了為特定用例定制芯片的自由。
審核編輯 :李倩-
晶體管
+關(guān)注
關(guān)注
77文章
9977瀏覽量
140612 -
CISC
+關(guān)注
關(guān)注
1文章
31瀏覽量
19747 -
RISC
+關(guān)注
關(guān)注
6文章
479瀏覽量
84691
原文標(biāo)題:RISC和CISC,究竟有何不同?
文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
HPM5E31IGN單核 32 位 RISC-V 處理器
HXS320F28027數(shù)字信號處理器(32位RISC-V DSP)
新思科技RISC-V處理器助力低功耗嵌入式應(yīng)用

評論