首頁登錄注冊

芯技術 | RISC-V的創新是在驗證巨人的肩膀厚不厚實

[會員動態] 2022-11-21 17:45:49   編輯:yl


RISC-V又被稱為“CPU的Linux”。對一些人來說,這個稱謂像一種傳承又像一種創新,尤其當你是開源的堅定信仰者。不過我是一個地道的實用主義者,而RISC-V的過度營銷反而讓我對這個詞兒提不起興趣。


直到我開始詳細研究RISC-V,我才發現成為某種微處理器的Linux可能是RISC-V最不足為外人道的優點之一。

在以下的文章中,我將對RISC-V的創新性展開更深入的討論。規范開源已經是許多框架都在做的事,所以并不新鮮,基于本身架構設計上的特性和開放性才讓RISC-V的創新力凸顯出來。



一個可拓展的指令集架構


每個CPU都有一個指令集,那是一個所有可以執行的機器指令列表,可執行如兩數相加,從內存中加載數據,或將其存儲在內存中或跳轉到程序中的另一個位置之類的操作。

如今,大多數指令集架構都走增量進化路線,包括最熱門的X86、MIPS、ARM。這意味著這些架構的創建者會隨著時間的推移不斷添加指令。但他們從不刪除任何內容,也就造成了冗余無用的指令會堆積如山越來越多。And that’s why, X86有超過1500個不同的指令,ARM-64有1000多個。

相比之下,RISC-V的誕生就是為了讓冗余指令不再占用資源。讓用來制作芯片的寶貴硅資源真正用到實處。

怎么實現?RISC-V只有一個由47條指令組成的微小基本指令集。其它指令都作為擴展內容。每個擴展都是相關指令的集合。

例如,SIMD 指令是一個擴展。浮點相關的指令是另一個。甚至整數乘法和除法也在單獨的擴展中。

RISC-V從一開始就建立了一個系統來管理這些擴展,按照A到Z26個字母排列。CPU中有一些特殊的bits,程序可以檢查這些bits以查看實現了哪些擴展。如果一個程序忘記了管理系統并嘗試運行特定RISC-V架構CPU不支持的指令,它仍然可以處理這個指令。不受支持的指令可能會導致陷阱。這類似于中斷。當前位置被保存以供以后返回,并跳轉到內核子程序。這允許RISC-V處理器在軟件中實現它們不支持的每個擴展。因此,當某些擴展不再使用時,舊代碼仍然可以在新CPU上運行。



為什么x86和ARM

不能復用類似方式?


理論上,英特爾和ARM可以辯稱許多冗余指令已被棄用,要用需要在軟件中再模擬。也能說新指令是某些可選擴展的一部分。

但問題是:ISA就像一份合同。RISC-V基金會不會制造任何芯片或產品,他們做的就是制定規范。該規范就像注冊RISC-V生態系統,即軟件工具制造商、軟件開發人員和硬件芯片制造商之間之間的合同。這些人同意遵守 RISC-V 規范。沒有人會拿槍指著他們的頭,或者如果他們不遵守這個“合同”,就會在法庭上威脅要處以罰款。那么,如何讓參與者遵守合同呢?



因為利益。如果軟件開發人員和硬件開發人員知道對方正確遵循規范,他們就知道他們的產品可以正常工作。硬件制造商不想制造無法運行RISC-V代碼的芯片。軟件開發人員也不想發布無法在RISC-V處理器上運行的代碼。

與ARM和x86不同,RISC-V 已經制定了一套程序,以確保軟件和硬件具備處理不同擴展的兼容性。硬件提供了查詢擴展是否存在的方法,如果遇到非法指令,可能會觸發陷阱。



軟件如何支持多個擴展


軟件開發人員確保在需要時添加軟件來模擬不受支持的指令?;蛘撸幾g器編寫者可以確保根據支持的擴展為程序生成不同的代碼。具體來說,這意味著生成子程序,這些子程序都使用不同的擴展名執行相同的操作。編譯器創建所有這些子程序,并確保存在代碼檢查支持的擴展,然后再跳轉到最佳子程序。

簡單舉例。假設您得到了兩個數組矢量加法,每個數組有三個元素。
sum = [3, 4, 1] + [2, 1, 2] 

編譯器可以創建此代碼的兩個版本。一個基礎指令集與循環一起使用,執行重復添加。另一個版本可以基于RISC-V矢量指令,不需要任何循環。您只需指定每個元素都是一個整數,每個矢量是3個元素。接下來,在矢量之間執行加法。

在這兩種情況下,您都會得到相同的結果,但是使用矢量指令擴展可以大大提高速度。



x86 和 ARM 擴展的問題


世界上已經充滿了ARM和x86代碼,但它們不檢查擴展。因此,英特爾不能簡單地停止在未來的微芯片中支持某些指令,因為現有軟件將無法優雅地get到這一點。處理的過程會讓它崩潰。

RISC-V能做的事放在x86和ARM上將不得不以一種笨拙的方式舉步維艱。此外,每個平臺上都必須毫無意義地支持超過1000條指令。這就是RISC-V未來可期的原因。微架構的創新可能會使現有指令過時并需要一組新的指令,這對于RISC-V來說將很容易。他們為新的指示留下了足夠的空間。相比之下,英特爾和ARM無法輕易做到這一點。



把指令集的精簡程度作為一項特性


指令集的精簡性往往會被嚴重低估。人們往往更容易對RISC-V吹毛求疵。
有一條評論是這樣說的:


實際上,RISC-V中的所有功能從1980年代就有了,都是非常古老的想法。RISC-V規范的推出只是采用了舊有想法:加載/存儲架構,大量寄存器,簡單的指令編碼,在指令中分離目標字段,并拋棄了一些糟粕。


然而,沿用舊有想法并非因為RISC-V設計人員缺乏想象力或創新失敗。相反,他們刻意希望使用來自現有架構的經過驗證的指令和設計。


原因很多。比如過去許多新穎且過于“聰明”的選擇在未來的微架構創新中已過時。


相反,RISC-V的創新是取一切精華去一切糟粕的完美體現,以保證指令集的精簡性。從過往經驗中吸取的教訓讓他們知道將來需要同時支持壓縮指令和64位指令。


RISC-V指令編碼的變體很少,

這使得它們非常容易解碼。


因此,RISC-V指令的編碼都非常精細。上圖顯示了它們的編碼方式。下面我們試著解釋它的含義和意義。

一個RISC-V指令的長度為32 bits,在所有RISC-V架構中都很常見。MIPS、PowerPC和ARM都是相同的。相較之下,x86倒有從8到120位的可變指令長度。

一個bit只是二進制數中的一個數字。RISC-V指令中的前七個bits會指定要執行的指令(圖中的黃色區)。操作碼是要執行的操作,如加、減、乘、移位或跳轉到程序中的其它位置。在紅色區中,我們有目標寄存器(編號7到11位共五位)。這五位足以對從0到31的數字進行編碼。因此,目標寄存器可以是32個不同的寄存器之一。

省去細說步驟,懂得都懂。重點在于規范性的體現。對于各種變體編碼都位于同一位置,這使得創建硬件解碼RISC-V指令變得容易。

精簡性意味著晶體管尺寸會變少。RISC-V手冊就是一個絕佳范例:


作為簡單性影響的一個具體例子,我們將“Demo級”RISC-V開源項目Rocket-chip處理器與使用相同大小的緩存(16 KiB)的相同技術(TSMC40GPLUS)中的ARM-32 Cortex-A5處理器進行比較。對于 ARM-32,RISC-V 的晶片尺寸為 0.27 mm2,精度為 0.53 mm2。ARM-32 Cortex-A5芯片的成本大約是RISC-V Rocket-chip片的兩倍(22)。即使模具小10%,成本也可降低1.2倍(1.12)。



其次,精簡性有利于性能,因為更小和更簡單的芯片更容易提高時鐘頻率。一家名為Micro Magic的小公司已經制造了一種RISC-V芯片,它可以在0.07w的功率上運行。

相比之下,蘋果M1芯片在10w的功率上運行。Micro Magic芯片的時鐘頻率最高可達5 GHz。


基于RISC-V的BOOM項目更足為人道。我們可以和ARM-32 Cortex-A9作比較。

CoreMark是用來衡量嵌入式系統中CPU性能的標準。當兩個處理器都在此基準測試上運行100 000次迭代(重復)時,ARM CPU 在 18.5 秒內完成,BOOM 處理器只需14.26 秒。

這就證明了更簡單的實現允許更高的時鐘頻率。諷刺的是,盡管指令集更簡單,但ARM CPU在指令數量上并不具有優勢。與ARM版本相比,CoreMark測試套件所需的指令數減少了10%。

使用小型芯片還可以制作大量芯片來處理高度可并行的任務。例如,Esperanto Technologies公司就制作了一個具有1000多個RISC-V協處理器的片上系統用于機器學習任務。


凝練的設計



乍看之下“凝練”這個詞不該用來形容RISC-V。但實際上,壓縮指令集和64 bits指令等從一開始就被預設具有可擴展性?;局噶罴壥窃谠O計時考慮到將有一個64 bits擴展,而這一點之前的設計都沒有考慮到,所以32 bits指令都必須為64 bits的重復。相較之下,在RISC-V上大多數現有指令只在64 bits寄存器上工作,而不是在64 bits的RISC-V CPU上使用32 bits寄存器。因此,RISC-V 64 bits擴展實際上只是添加特殊指令來處理64 bits寄存器的32 bits部分。


例如, ADDW 和 SUBW 指令用于將32 bits結果存儲在目標寄存器中。正常 ADD 和 SUB 指令會在 64 bits CPU 上加減 64 位數字,在32 bits CPU 上加減32 bits的數字。


這意味著RISC-V上的64 bits 的代碼看起來幾乎與32 bits 代碼相同。


壓縮指令集是一個類似的擴展指令集,允許將兩個指令放在32 bits 字節內,而其它框架只能用笨拙的方式擠壓。例如,在ARM上Thumb2 壓縮指令格式本質上是一種不同的ISA,而不是RISC-V上的擴展。這意味著CPU必須在內部切換模式并使用不同的解碼器。這增加了復雜性。相比之下,解碼壓縮的RISC-V指令非常簡單。將它們轉換為32位指令只需要400個邏輯門(與門、或門、或非門、與非門)。這還只是冰山一角。


實現基本指令集的最小RISC-V CPU僅用了8000個邏輯門。



矢量指令集


雖然這不是RISC-V獨有的,但RISC-V指令集的特性絕對可以證明經驗驗證的后發優勢。當其它CPU不斷添加一個接一個的SIMD指令,而每次決定延長SIMD指令的操作時間時,都需要一組新的指令。

相比之下,使用RISC-V,CPU可以在運行時通知代碼它支持什么,并允許程序員自己指定矢量的長度。這大大簡化了矢量代碼。

矢量指令集實際上是一種陳舊且更易于理解的技術,編譯器優化對此有很好的理解。例如,Esperanto Technologies在其基于RISC-V的專用協處理器中使用矢量指令集來加速機器學習任務。他們聲稱性能比競爭對手高出30-50倍。



結論


讓我們看看我是否可以壓縮我剛剛RISC-V創新性介紹中精簡出一些內容:

非增量ISA。以前添加的指令不會永遠使ISA膨脹。軟件開發人員、工具開發人員和硬件制造商必須確保可選擴展的存在與否是可控的。


積極刪除嚴格來說不需要的所有內容,以將復雜性保持在最低限度。這意味著它很容易實現RISC-V芯片,并且可以在幾個晶體管中完成,使其更便宜,更容易增加時鐘頻率等。


來源:酷芯微電子

作者:Erik Engheim

翻譯:酷芯PR團隊

校對:酷芯芯片工程部


安防經理人QQ群:
(監控1)257870573 (監控2)263689735
(智慧社區1)218554770 (智慧社區2)316099252
(智慧社區3)436122502 (智慧社區4)236413147