訂閱
糾錯(cuò)
加入自媒體

大道至簡(jiǎn)——RISC-V架構(gòu)之魂(中)

2.7 無(wú)條件碼執(zhí)行

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

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

RISC-V架構(gòu)則放棄使用這種帶“條件碼”指令的方式,對(duì)于任何的條件判斷都使用普通的帶條件分支跳轉(zhuǎn)指令。此選擇再次印證了RISC-V追求硬件簡(jiǎn)單的哲學(xué),因?yàn)榉艞墡А皸l件碼”指令的方式可以大幅簡(jiǎn)化CPU的硬件設(shè)計(jì),對(duì)于低功耗小面積的CPU可以選擇非常簡(jiǎn)單的電路進(jìn)行實(shí)現(xiàn),而高性能超標(biāo)量處理器由于硬件動(dòng)態(tài)調(diào)度能力很強(qiáng),可以有強(qiáng)大的分支預(yù)測(cè)電路保證CPU能夠快速的跳轉(zhuǎn)執(zhí)行達(dá)到高性能。

2.8 無(wú)分支延遲槽

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

早期的RISC架構(gòu)很多采用了分支延遲槽誕生的原因主要是因?yàn)楫?dāng)時(shí)的處理器流水線(xiàn)比較簡(jiǎn)單,沒(méi)有使用高級(jí)的硬件動(dòng)態(tài)分支預(yù)測(cè)器,所以使用分支延遲槽能夠取得可觀(guān)的性能效果。然而,這種分支延遲槽使得CPU的硬件設(shè)計(jì)變得極為的別扭,CPU設(shè)計(jì)人員對(duì)此往往苦不堪言。

RISC-V架構(gòu)則放棄了分支延遲槽,再次印證了RISC-V力圖簡(jiǎn)化硬件的哲學(xué),因?yàn)楝F(xiàn)代的高性能處理器的分支預(yù)測(cè)算法精度已經(jīng)非常高,可以有強(qiáng)大的分支預(yù)測(cè)電路保證CPU能夠準(zhǔn)確的預(yù)測(cè)跳轉(zhuǎn)執(zhí)行達(dá)到高性能。而對(duì)于低功耗小面積的CPU,由于無(wú)需支持分支延遲槽,硬件得到極大簡(jiǎn)化,也能進(jìn)一步減少功耗和提高時(shí)序。

2.9 無(wú)零開(kāi)銷(xiāo)硬件循環(huán)

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

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

然有得必有失,此類(lèi)零開(kāi)銷(xiāo)硬件循環(huán)指令大幅地增加了硬件設(shè)計(jì)的復(fù)雜度。因此,零開(kāi)銷(xiāo)循環(huán)指令與RISC-V架構(gòu)簡(jiǎn)化硬件的哲學(xué)是完全相反的,在RISC-V架構(gòu)中自然沒(méi)有使用此類(lèi)零開(kāi)銷(xiāo)硬件循環(huán)指令。

2.10 簡(jiǎn)潔的運(yùn)算指令

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

整數(shù)乘除法指令子集(M字母表示)支持的運(yùn)算包括,有符號(hào)或者無(wú)符號(hào)的乘法和除法操作。乘法操作能夠支持兩個(gè)32位的整數(shù)相乘得到一個(gè)64位的結(jié)果;除法操作能夠支持兩個(gè)32位的整數(shù)相除得到一個(gè)32位的商與32位的余數(shù)。

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

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

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

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

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

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

RISC-V架構(gòu)的研究者進(jìn)行了詳細(xì)的代碼體積分析,如圖3所示,通過(guò)分析結(jié)果可以看出,RV32C的代碼體積相比RV32的代碼體積減少了百分之四十,并且與ARM,MIPS和x86等架構(gòu)相比都有不錯(cuò)的表現(xiàn)。

圖3 各指令集架構(gòu)的代碼密度比較(數(shù)據(jù)越小越好)

“大道至簡(jiǎn)——RISC-V架構(gòu)之魂”——分成上中下三篇,本文是中篇。關(guān)注文末公眾號(hào)后可查詢(xún)上中下三篇的內(nèi)容。

本文上接《大道至簡(jiǎn)——RISC-V架構(gòu)之魂(上)》

(未完待續(xù):請(qǐng)參見(jiàn)《大道至簡(jiǎn)——RISC-V架構(gòu)之魂(下)》)


<上一頁(yè)  1  2  
聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀(guān)點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)