自RISC和CISC戰(zhàn)爭(zhēng)在1990年代后期爆發(fā)以來,人們就宣稱RISC和CISC不再重要。許多人會(huì)指出指令集是無關(guān)緊要的。
但是指令集其實(shí)很重要,因?yàn)樗麄兿拗屏丝梢暂p松添加到微處理器的優(yōu)化類型。作者最近一直在學(xué)習(xí)有關(guān)RISC-V指令集體系結(jié)構(gòu)(ISA)的更多信息,以下是作者對(duì)RISC-V ISA最印象深刻的一些方面:1.這是一個(gè)RISC指令集,它很小且易于學(xué)習(xí)(基礎(chǔ)為47個(gè))。對(duì)于任何對(duì)學(xué)習(xí)微處理器感興趣的人都非常友好。
2.大學(xué)中用于數(shù)字設(shè)計(jì)教學(xué)的主導(dǎo)架構(gòu)。
3.它經(jīng)過精心設(shè)計(jì),可讓CPU制造商使用RISC-V ISA創(chuàng)建高性能微處理器。
4.無需授權(quán)費(fèi),并且被設(shè)計(jì)為允許簡(jiǎn)單的硬件實(shí)現(xiàn),那么專業(yè)的業(yè)余愛好者原則上就可以在合理的時(shí)間內(nèi)進(jìn)行自己的RISC-V CPU設(shè)計(jì)。
5.易于修改和使用的開源設(shè)計(jì)。
嵌入式專欄
1
RISC的復(fù)仇正如我開始了解RISC-V的好,我認(rèn)識(shí)到,RISC-V其實(shí)是一個(gè)根本性的轉(zhuǎn),因?yàn)樗屛覀兓氐搅四莻€(gè)好多人認(rèn)為已經(jīng)過去的計(jì)算時(shí)代。在設(shè)計(jì)方面,RISC-V就好像回到了上世紀(jì)八九十年代的經(jīng)典RISC 時(shí)代。
在隨后的幾年中,許多人指出RISC和CISC的區(qū)別不再重要,因?yàn)橄?a target="_blank">ARM這樣的RISC CPU添加了很多指令,許多指令相當(dāng)復(fù)雜,以至于今天它比純RISC CPU更像是一種混合。對(duì)于其他RISC CPU(例如PowerPC)也有類似的看法。
相比之下,RISC-V則是RISC CPU中的硬核。實(shí)際上,如果您閱讀有關(guān)RISC-V的討論,您會(huì)發(fā)現(xiàn)有人聲稱RISC-V是由一些拒絕與時(shí)俱進(jìn)的老派RISC激進(jìn)分子制造的。
前ARM工程師Erin Shepherd幾年前對(duì)RISC-V發(fā)表了有趣的評(píng)論:RISC-V ISA追求極簡(jiǎn)主義,這是一個(gè)錯(cuò)誤。因?yàn)樗麄冞^分強(qiáng)調(diào)了最小化指令數(shù)量,規(guī)范化編碼等。這種極簡(jiǎn)主義的追求導(dǎo)致錯(cuò)誤的正交性(例如將相同的指令重新用于分支,調(diào)用和返回),并且需要多余的指令,這會(huì)影響代碼密度。指令的大小和數(shù)量。
讓我快速介紹一下。保持較小的代碼對(duì)性能有利,因?yàn)檫@樣可以更輕松地將正在運(yùn)行的代碼保持在高速CPU緩存中。
這里的批評(píng)是RISC-V設(shè)計(jì)師過于關(guān)注使用小的指令集。這畢竟是最初的RISC目標(biāo)之一。
這樣聲稱的結(jié)果是,一個(gè)現(xiàn)實(shí)的程序?qū)⑿枰嗟闹噶顏硗瓿晒ぷ?,從而占用更多的?nèi)存空間。
多年以來的傳統(tǒng)常識(shí)是,RISC處理器應(yīng)添加更多指令并變得更像CISC。這個(gè)想法是,更專業(yè)的指令可以代替多個(gè)通用指令的使用。
嵌入式專欄
2
壓縮指令和宏操作融合但是,CPU設(shè)計(jì)中特別存在兩項(xiàng)創(chuàng)新,這些創(chuàng)新從許多方面使添加更多復(fù)雜指令的策略變得多余:
壓縮指令-指令在內(nèi)存中進(jìn)行壓縮,并在CPU的第一階段進(jìn)行解壓縮。
宏操作融合-將CPU讀取的兩個(gè)或更多簡(jiǎn)單指令融合為一個(gè)復(fù)雜指令。
ARM實(shí)際上已經(jīng)采用了這兩種策略,而x86 CPU則采用了后者,因此這并不是RISC-V的新招。
但是,這里有一個(gè)關(guān)鍵點(diǎn):RISC-V從這些策略中獲得了更大的優(yōu)勢(shì),其原因有兩個(gè):
1.從一開始就添加了壓縮指令。ARM上使用的Thumb2壓縮指令格式必須通過將其添加為單獨(dú)的ISA進(jìn)行改進(jìn)。這需要一個(gè)內(nèi)部模式開關(guān)和單獨(dú)的解碼器來處理。但在RISC-V方面,壓縮指令可以添加到帶有最少400個(gè)額外邏輯門(AND,OR,NOR,NAND門)的CPU中。
2.RISC對(duì)保持唯一指令數(shù)量低的癡迷得到了回報(bào)。壓縮指令帶來更多空間。
嵌入式專欄
3
指令編碼后一部分需要一些闡述。在RISC架構(gòu)上,指令通常為32位寬。這些位需要用于編碼不同的信息。例如,假設(shè)有一條這樣的指令(hash marks comments):ADD x1,x4,x8#x1←x4 + x8
這的注冊(cè)內(nèi)容x4和x8結(jié)果存儲(chǔ)到x1。我們需要對(duì)此進(jìn)行編碼的位數(shù)取決于我們擁有的寄存器數(shù)量。RISC-V和ARM64具有32個(gè)寄存器。數(shù)字32可以用5位表示:2^5= 32
由于必須指定3個(gè)不同的寄存器,因此總共需要15位(3×5)來編碼操作數(shù)(用于加法運(yùn)算的輸入)。
因此如果我們希望在我們的指令集支持更多的東西,那么我們小號(hào)消耗的32bit位數(shù)越多。當(dāng)然,我們可以使用64位指令,但這將消耗過多的內(nèi)存,從而降低性能。
通過積極降低指令數(shù)量,RISC-V留出了更多空間來添加表示我們正在使用壓縮指令的位。如果CPU看到指令中的某些位被設(shè)置,則知道應(yīng)該將其解釋為壓縮指令。
嵌入式專欄
4
壓縮指令:二合一這意味著,我們可以將兩條16位寬的指令放入32位字中,而不必在32位字中插入一條指令。自然,并非所有的RISC-V指令都可以16位格式表示。因此,根據(jù)32位指令的效用和使用頻率來選擇它們的子集。未壓縮的指令可以使用3個(gè)操作數(shù)(輸入),而壓縮的指令只能使用2個(gè)操作數(shù)。因此,壓縮ADD指令如下所示:C.ADD x4,x8#x4←x4 + x8
RISC-V匯編使用C.前綴來指示匯編器應(yīng)將指令轉(zhuǎn)換為壓縮指令。但是實(shí)際上您不需要編寫此代碼。如果適用,RISC-V匯編程序?qū)⒛軌蜻x擇未壓縮指令而不是未壓縮指令。
基本上壓縮的指令減少了操作數(shù)的數(shù)量。三個(gè)寄存器操作數(shù)將消耗15位,而只剩下1位來指定操作!因此,通過使用兩個(gè)操作數(shù),我們剩下了6位來指定操作碼(執(zhí)行操作)。
實(shí)際上,這與x86匯編的工作方式非常接近,在x86匯編中,保留的位數(shù)不足以擁有3個(gè)寄存器操作數(shù)。取而代之的是,x86會(huì)花費(fèi)一些位來允許例如一條ADD指令從存儲(chǔ)器和寄存器中讀取輸入。
嵌入式專欄
5
宏操作融合:一對(duì)一但是,當(dāng)我們將指令壓縮與宏操作融合相結(jié)合時(shí),我們才能看到真正的收獲。你看,如果CPU得到包含兩個(gè)壓縮的16位指令的32位字,它可以融合這些成一個(gè)單一的復(fù)雜指令。
聽起來像胡說八道,難道我們不是剛回到起點(diǎn)嗎?我們不是要避免使用CISC樣式的CPU嗎?
不會(huì),因?yàn)槲覀儽苊馐褂煤芏鄰?fù)雜的指令,x86和ARM策略來填充ISA規(guī)范。相反,我們基本上是通過簡(jiǎn)單指令的各種組合間接地表達(dá)大量復(fù)雜指令。
在正常情況下,宏融合存在一個(gè)問題:盡管兩條指令可以被一條指令代替,但它們?nèi)匀幌膬杀兜膬?nèi)存空間。但是通過指令壓縮,我們不再消耗更多空間。我們兩全其美。
讓我們看一下Erin Shepherd的例子之一。在對(duì)RISC-V ISA的批評(píng)中,她展示了一個(gè)簡(jiǎn)單的C函數(shù)。為了清楚起見,我重寫了一下:int get_index(int * array,int i){
return array [i];
}
在x86上,它將編譯為:mov eax,[rdi + rsi * 4]
ret
當(dāng)您以編程語言調(diào)用函數(shù)時(shí),通常會(huì)根據(jù)已建立的約定將參數(shù)傳遞給寄存器中的函數(shù),這取決于所使用的指令集。在x86上,第一個(gè)參數(shù)放置在rdi寄存器,中第二個(gè)參數(shù)放置在中rsi寄存器中。按照慣例,返回值必須放在eax寄存器中。
第一條指令將rsi中的內(nèi)容乘以4。它包含我們的i變量。為什么要相乘?由于array都是由整數(shù)元素組成,因此它們之間的間隔為4個(gè)字節(jié)。因此,數(shù)組中的第三個(gè)元素實(shí)際上處于字節(jié)偏移量3×4 = 12。
之后,我們將其添加到rdi中,因?yàn)樗薬rray的基礎(chǔ)地址地址。這為我們提供了array中i元素的最終地址。我們讀存儲(chǔ)單元的內(nèi)容,并將其存儲(chǔ)在eax,任務(wù)就此完成了。
在ARM上,它非常相似:LDR r0,[r0,r1,lsl#2]
BX lr; return
在這里,我們不是與4相乘,而是r1寄存器向左移動(dòng)2位,這等同于與4相乘。這可能也是x86代碼中發(fā)生情況的更真實(shí)的表示。在x86上,您只能乘以2、4或8,所有這些都可以通過左移1、2或3來執(zhí)行。
無論如何,您幾乎可以從我的x86描述中猜測(cè)其余的內(nèi)容?,F(xiàn)在讓我們進(jìn)入RISC-V,真正的樂趣開始了?。╤ash starts comments)
SLLI a1,a1,2#a1←a1 《《 2
ADD a0,a0,a1#a0←a0 + a1
LW a0,a0,0#a0←[a0 + 0]
RET
在RISC-V寄存器上,a0,a1僅是x10和x11的別名。這些是放置函數(shù)調(diào)用的第一個(gè)和第二個(gè)參數(shù)的位置。RET是偽指令(簡(jiǎn)寫):JALR x0,0(ra)#sp←0 + ra
#x0←sp + 4 ingnoring resultJALR跳轉(zhuǎn)到ra引用返回地址的地址。ra是x1的別名。
無論如何,這看起來簡(jiǎn)直太可怕了吧?這樣簡(jiǎn)單而通用的操作的指令需要在表中進(jìn)行基于索引的查找并返回。
確實(shí)確實(shí)看起來很糟。這就是為什么Erin Shepherd高度批評(píng)RISC-V團(tuán)隊(duì)做出的設(shè)計(jì)選擇的原因。她寫道:RISC-V的簡(jiǎn)化使解碼器(即CPU前端)更容易,但以執(zhí)行更多指令為代價(jià)。但是,縮放流水線的寬度是一個(gè)難題,而對(duì)輕微(或高度)不規(guī)則指令的解碼已廣為人知(當(dāng)確定一條指令的長(zhǎng)度不平凡時(shí),主要的困難就出現(xiàn)了-x86在這種情況下尤其糟糕,因?yàn)樗麄冇謉眾惡多前綴)。
但是,由于指令壓縮和宏操作融合,我們可以解決這個(gè)問題。C.SLLI a1,2#a1←a1 《《 2
C.ADD a0,a1#a0←a0 + a1
C.LW a0,a0,0#a0←[a0 + 0]
C.JR ra現(xiàn)在,這將占用與ARM示例完全相同的內(nèi)存空間。
好的,接下來讓我們做一些Macro-op融合!
RISC-V中允許將操作融合為一個(gè)的規(guī)則之一是目標(biāo)寄存器是相同的。ADD和LW(加載字)指令就是這種情況。因此,CPU將這些指令轉(zhuǎn)換為一條指令。
如果SLLI也是如此,我們可以將所有三個(gè)指令融合為一個(gè)。因此,CPU會(huì)看到類似于更復(fù)雜的ARM指令的內(nèi)容:LDR r0,[r0,r1,lsl#2]
為什么我們不能在代碼中直接編寫這種復(fù)雜的宏操作?
因?yàn)槲覀兊腎SA不包含對(duì)它的支持!我們有有限的可用位數(shù)。為什么不延長(zhǎng)說明時(shí)間呢?因?yàn)槟菚?huì)消耗太多內(nèi)存,并更快地填充寶貴的CPU緩存。
但是,如果我們?cè)贑PU內(nèi)部制造這些長(zhǎng)的半復(fù)雜指令,則無需擔(dān)心。因?yàn)樵谌魏螘r(shí)候,CPU永遠(yuǎn)不會(huì)漂浮數(shù)百條指令。因此,在每個(gè)指令上浪費(fèi)128位并不重要。每個(gè)人都有很多硅。
因此,當(dāng)解碼器獲得正常指令時(shí),通常會(huì)將其轉(zhuǎn)換為一個(gè)或多個(gè)微操作。這些微操作是CPU實(shí)際處理的指令。這些可能真的很廣泛,并且包含許多額外的有用信息。考慮到它們很寬,將它們稱為“微型”可能看起來具有諷刺意味。但是,“微型”是指它們執(zhí)行的任務(wù)數(shù)量有限。
嵌入式專欄
6
Goldie鎖定指令的復(fù)雜性宏操作融合使解碼器的工作變得微不足道:我們沒有將一條指令變成多個(gè)微操作,而是采取了多種操作并將它們變成一個(gè)微操作。
因此,現(xiàn)代CPU中發(fā)生的事情顯得有些奇怪:
1.首先,它通過壓縮將兩條指令組合為一條。2.然后通過解壓將其分為兩部分。3.通過宏操作融合將它們組合回一個(gè)操作中。
相反,其他指令最終可能會(huì)分成多個(gè)微操作,而不是被融合。為什么有些人會(huì)融合而另一些人會(huì)分拆呢?關(guān)鍵是最終要進(jìn)行適當(dāng)程度的復(fù)雜性的微操作:
不太復(fù)雜,因?yàn)榉駝t它無法在為每個(gè)指令分配的固定數(shù)量的時(shí)鐘周期內(nèi)完成。
不太簡(jiǎn)單,因?yàn)槟菢游覀兙驮诶速M(fèi)CPU資源。執(zhí)行兩次微操作所需的時(shí)間是執(zhí)行一次微操作所需時(shí)間的兩倍。
這一切都始于CISC處理器。英特爾開始將其復(fù)雜的CISC指令拆分為微操作,因此它們可以像RISC指令那樣更輕松地適應(yīng)其流水線。但是,在后來的設(shè)計(jì)中,他們意識(shí)到許多CISC指令是如此簡(jiǎn)單,以至于它們很容易與一種中等復(fù)雜的指令融合在一起。如果執(zhí)行的指令較少,則可以更快地完成。
嵌入式專欄
7
這樣設(shè)計(jì)的好處好的,這有很多細(xì)節(jié),也許很難弄清重點(diǎn)是什么。為什么要進(jìn)行所有這些壓縮和融合?這聽起來像很多額外的工作。
首先,指令壓縮與zip壓縮完全不同?!皦嚎s”一詞有點(diǎn)用詞不當(dāng),因?yàn)榱⒓唇鈮嚎s已壓縮的指令非常簡(jiǎn)單。這樣做不會(huì)浪費(fèi)時(shí)間。記住,對(duì)于RISC-V來說很簡(jiǎn)單。僅使用400個(gè)邏輯門,即可執(zhí)行解壓縮。
宏操作融合也是如此。盡管這看起來很復(fù)雜,但是這些方法已經(jīng)在現(xiàn)代微處理器中使用。因此,已經(jīng)支付了這種復(fù)雜性的稅收或成本。
但是,與ARM,MIPS和x86設(shè)計(jì)人員不同,RISC-V設(shè)計(jì)人員在開始設(shè)計(jì)ISA時(shí)就知道指令壓縮和宏操作融合?;蚋鼫?zhǔn)確地說,競(jìng)爭(zhēng)對(duì)手在設(shè)計(jì)原始ISA時(shí)對(duì)此一無所知。在設(shè)計(jì)x86和ARM指令的64位版本時(shí),他們可能已經(jīng)考慮到了這一點(diǎn)。為什么他們沒有,我們只能推測(cè)。但是,似乎公司喜歡制作新的ISA,而這些ISA不會(huì)偏離更早的版本。通常,這是要消除過去的明顯錯(cuò)誤,而不是徹底改變哲學(xué)。
通過使用第一個(gè)最小指令集的各種測(cè)試,RISC-V設(shè)計(jì)人員取得了兩個(gè)重要發(fā)現(xiàn):
1.RISC-V程序通常會(huì)比其他任何CPU體系結(jié)構(gòu)占用或減少內(nèi)存空間。包括x86,考慮到它是CISC ISA,它本來可以節(jié)省空間。2.與其他ISA相比,它需要執(zhí)行的微操作更少。
基本上,通過設(shè)計(jì)具有融合功能的基本指令集,他們能夠融合足夠多的指令,從而使任何給定程序的CPU執(zhí)行的微操作都比競(jìng)爭(zhēng)對(duì)手少。
這使得RISC-V團(tuán)隊(duì)將宏操作融合作為RISC-V的核心策略。您可以在RISC-V手冊(cè)中看到很多有關(guān)可以融合哪些操作的注釋。您會(huì)看到已對(duì)指令進(jìn)行了修訂,以便更輕松地融合以常見模式顯示的指令。
將ISA保持較小意味著學(xué)生更容易學(xué)習(xí)。這意味著對(duì)于學(xué)習(xí)CPU架構(gòu)的學(xué)生來說,實(shí)際上更容易構(gòu)建運(yùn)行RISC-V指令的CPU。
RISC-V具有每個(gè)人都必須實(shí)現(xiàn)的小型核心指令集。但是,所有其他指令都作為擴(kuò)展的一部分存在。壓縮指令只是一個(gè)可選擴(kuò)展。因此,對(duì)于簡(jiǎn)單設(shè)計(jì),可以省略。
宏操作融合只是一種優(yōu)化。它不會(huì)改變整體行為,因此不需要您在特定的RISC-V處理器中實(shí)現(xiàn)它。
相反,對(duì)于ARM和x86,很多復(fù)雜性不是可選的。即使您嘗試創(chuàng)建最小的簡(jiǎn)單CPU內(nèi)核,也必須實(shí)現(xiàn)整個(gè)指令集和所有復(fù)雜的指令。
嵌入式專欄
8
RISC-V設(shè)計(jì)策略RISC-V吸收了我們對(duì)現(xiàn)代CPU的了解,并使其成為設(shè)計(jì)和ISA的選擇。例如,我們知道:
今天,CPU內(nèi)核具有先進(jìn)的分支預(yù)測(cè)器。他們的預(yù)測(cè)可以在90%的時(shí)間內(nèi)糾正。
CPU內(nèi)核是超標(biāo)量的,這意味著它們可以并行執(zhí)行多個(gè)指令。
使用亂序執(zhí)行是超標(biāo)量的。
它們已pipelined。
這意味著不再需要諸如ARM支持的條件執(zhí)行之類的東西。在ARM上支持以指令格式占用位。RISC-V可以保存這些位。
有條件執(zhí)行的最初目的是避免分支,因?yàn)榉种?duì)pipeline不利。為了使CPU快速運(yùn)行,通常會(huì)預(yù)取下一條指令,以便在上一條指令完成其第一階段后立即選擇下一條指令。
但是對(duì)于條件分支,開始填充pipeline時(shí),您不知道下一條指令在哪里。但是,超標(biāo)量CPU可以簡(jiǎn)單地并行執(zhí)行兩個(gè)分支。
這也是RISV-C沒有狀態(tài)寄存器的原因。這在指令之間創(chuàng)建了依賴關(guān)系。每條指令越獨(dú)立,與另一條指令并行運(yùn)行就越容易。
RISC-V策略基本上是,我們?nèi)绾尾拍苁笽SA盡可能簡(jiǎn)單,并盡可能簡(jiǎn)化RISC-V CPU的最小實(shí)現(xiàn),而又無需做出使高性能CPU成為可能的設(shè)計(jì)決策。
原文地址:https://erik-engheim.medium.com/the-genius-of-risc-v-microprocessors-b19d735abaa6
責(zé)任編輯:xj
原文標(biāo)題:為什么大家都看好RISC-V
文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
處理器
+關(guān)注
關(guān)注
68文章
19259瀏覽量
229651 -
指令集
+關(guān)注
關(guān)注
0文章
222瀏覽量
23378 -
RISC-V
+關(guān)注
關(guān)注
45文章
2270瀏覽量
46129
原文標(biāo)題:為什么大家都看好RISC-V
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論