訂閱
糾錯
加入自媒體

大道至簡——RISC-V架構之魂(中)

2020-06-06 12:21
TXP嵌入式
關注

2.7 無條件碼執(zhí)行

很多早期的RISC架構發(fā)明了帶條件碼的指令,譬如在指令編碼的頭幾位表示的是條件碼(Conditional Code),只有該條件碼對應的條件為真時,該指令才被真正執(zhí)行。

這種將條件碼編碼到指令中的形式可以使得編譯器將短小的循環(huán)編譯成帶條件碼的指令,而不用編譯成分支跳轉指令。這樣便減少了分支跳轉的出現,一方面減少了指令的數目;另一方面也避免了分支跳轉帶來的性能損失。然而,這種“條件碼”指令的弊端同樣會使得CPU的硬件設計變得復雜,增加硬件的開銷,也可能損傷時序使得CPU的主頻無法提高,筆者在曾經設計此類處理器時便深受其苦。

RISC-V架構則放棄使用這種帶“條件碼”指令的方式,對于任何的條件判斷都使用普通的帶條件分支跳轉指令。此選擇再次印證了RISC-V追求硬件簡單的哲學,因為放棄帶“條件碼”指令的方式可以大幅簡化CPU的硬件設計,對于低功耗小面積的CPU可以選擇非常簡單的電路進行實現,而高性能超標量處理器由于硬件動態(tài)調度能力很強,可以有強大的分支預測電路保證CPU能夠快速的跳轉執(zhí)行達到高性能。

2.8 無分支延遲槽

很多早期的RISC架構均使用了“分支延遲槽(Delay Slot)”,最具有代表性的便是MIPS架構,在很多經典的計算機體系結構教材中,均使用MIPS對分支延遲槽進行過介紹。分支延遲槽就是指在每一條分支指令后面緊跟的一條或者若干條指令不受分支跳轉的影響,不管分支是否跳轉,這后面的幾條指令都一定會被執(zhí)行。

早期的RISC架構很多采用了分支延遲槽誕生的原因主要是因為當時的處理器流水線比較簡單,沒有使用高級的硬件動態(tài)分支預測器,所以使用分支延遲槽能夠取得可觀的性能效果。然而,這種分支延遲槽使得CPU的硬件設計變得極為的別扭,CPU設計人員對此往往苦不堪言。

RISC-V架構則放棄了分支延遲槽,再次印證了RISC-V力圖簡化硬件的哲學,因為現代的高性能處理器的分支預測算法精度已經非常高,可以有強大的分支預測電路保證CPU能夠準確的預測跳轉執(zhí)行達到高性能。而對于低功耗小面積的CPU,由于無需支持分支延遲槽,硬件得到極大簡化,也能進一步減少功耗和提高時序。

2.9 無零開銷硬件循環(huán)

很多RISC架構還支持零開銷硬件循環(huán)(Zero Overhead Hardware Loop)指令,其思想是通過硬件的直接參與,通過設置某些循環(huán)次數寄存器(Loop Count),然后可以讓程序自動地進行循環(huán),每一次循環(huán)則Loop Count自動減1,這樣持續(xù)循環(huán)直到Loop Count的值變成0,則退出循環(huán)。

之所以提出發(fā)明這種硬件協助的零開銷循環(huán)是因為在軟件代碼中的for 循環(huán)(for i=0; i<N; i++)極為常見,而這種軟件代碼通過編譯器編譯之后,往往會編譯成若干條加法指令和條件分支跳轉指令,從而達到循環(huán)的效果。一方面這些加法和條件跳轉指令占據了指令的條數;另外一方面條件分支跳轉如存在著分支預測的性能問題。而硬件協助的零開銷循環(huán),則將這些工作由硬件直接完成,省掉了這些加法和條件跳轉指令,減少了指令條數且提高了性能。

然有得必有失,此類零開銷硬件循環(huán)指令大幅地增加了硬件設計的復雜度。因此,零開銷循環(huán)指令與RISC-V架構簡化硬件的哲學是完全相反的,在RISC-V架構中自然沒有使用此類零開銷硬件循環(huán)指令。

2.10 簡潔的運算指令

在本章第2.1節(jié)中曾經提到RISC-V架構使用模塊化的方式組織不同的指令子集,最基本的整數指令子集(I字母表示)支持的運算包括加法、減法、移位、按位邏輯操作和比較操作。這些基本的運算操作能夠通過組合或者函數庫的方式完成更多的復雜操作(譬如乘除法和浮點操作),從而能夠完成大多數的軟件操作。

整數乘除法指令子集(M字母表示)支持的運算包括,有符號或者無符號的乘法和除法操作。乘法操作能夠支持兩個32位的整數相乘得到一個64位的結果;除法操作能夠支持兩個32位的整數相除得到一個32位的商與32位的余數。

單精度浮點指令子集(F字母表示)與雙精度浮點指令子集(D字母表示)支持的運算包括浮點加減法,乘除法,乘累加,開平方根和比較等操作,同時提供整數與浮點,單精度與雙精度浮點彼此之間的格式轉換操作。

很多RISC架構的處理器在運算指令產生錯誤之時,譬如上溢(Overflow)、下溢(Underflow)、非規(guī)格化浮點數(Subnormal)和除零(Divide by Zero),都會產生軟件異常。RISC-V架構的一個特殊之處是對任何的運算指令錯誤(包括整數與浮點指令)均不產生異常,而是產生某個特殊的默認值,同時,設置某些狀態(tài)寄存器的狀態(tài)位。RISC-V架構推薦軟件通過其他方法來找到這些錯誤。再次清楚地反映了RISC-V架構力圖簡化基本的指令集,從而簡化硬件設計的哲學。

2.11 優(yōu)雅的壓縮指令子集

基本的RISC-V基本整數指令子集(字母I表示 )規(guī)定的指令長度均為等長的32位,這種等長指令定義使得僅支持整數指令子集的基本RISC-V CPU非常容易設計。但是等長的32位編碼指令也會造成代碼體積(Code Size)相對較大的問題。

為了滿足某些對于代碼體積要求較高的場景(譬如嵌入式領域),RISC-V定義了一種可選的壓縮(Compressed)指令子集,由字母C表示,也可以由RVC表示。RISC-V具有后發(fā)優(yōu)勢,從一開始便規(guī)劃了壓縮指令,預留了足夠的編碼空間,16位長指令與普通的32位長指令可以無縫自由地交織在一起,處理器也沒有定義額外的狀態(tài)。

RISC-V壓縮指令的另外一個特別之處是,16位指令的壓縮策略是將一部分普通最常用的的32位指令中的信息進行壓縮重排得到(譬如假設一條指令使用了兩個同樣的操作數索引,則可以省去其中一個索引的編碼空間),因此每一條16位長的指令都能一一找到其對應的原始32位指令。因此,程序編譯成為壓縮指令僅在匯編器階段就可以完成,極大的簡化了編譯器工具鏈的負擔。

RISC-V架構的研究者進行了詳細的代碼體積分析,如圖3所示,通過分析結果可以看出,RV32C的代碼體積相比RV32的代碼體積減少了百分之四十,并且與ARM,MIPS和x86等架構相比都有不錯的表現。

圖3 各指令集架構的代碼密度比較(數據越小越好)

“大道至簡——RISC-V架構之魂”——分成上中下三篇,本文是中篇。關注文末公眾號后可查詢上中下三篇的內容。

本文上接《大道至簡——RISC-V架構之魂(上)》

(未完待續(xù):請參見《大道至簡——RISC-V架構之魂(下)》)


<上一頁  1  2  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關注公眾號
    OFweek人工智能網
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯系郵箱:
    *驗 證 碼:

    粵公網安備 44030502002758號