《電子技術應用》
您所在的位置:首頁 > EDA與制造 > 業界動態 > 大道至簡——RISC-V架構之魂(中)

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

2018-09-14
關鍵詞: RISC-V 架構

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

  2.3 規整的指令編碼

  在流水線中能夠盡早盡快的讀取通用寄存器組,往往是處理器流水線設計的期望之一,這樣可以提高處理器性能和優化時序。這個看似簡單的道理在很多現存的商用RISC架構中都難以實現,因為經過多年反復修改不斷添加新指令后,其指令編碼中的寄存器索引位置變得非常的凌亂,給譯碼器造成了負擔。

  得益于后發優勢和總結了多年來處理器發展的教訓,RISC-V的指令集編碼非常的規整,指令所需的通用寄存器的索引(Index)都被放在固定的位置,如圖2所示。因此指令譯碼器(Instruction Decoder)可以非常便捷的譯碼出寄存器索引然后讀取通用寄存器組(Register File,Regfile)。

313.jpg

  圖2 RV32I規整的指令編碼格式

  這里寫圖片描述

  2.4 簡潔的存儲器訪問指令

  與所有的RISC處理器架構一樣,RISC-V架構使用專用的存儲器讀(Load)指令和存儲器寫(Store)指令訪問存儲器(Memory),其他的普通指令無法訪問存儲器,這種架構是RISC架構的常用的一個基本策略,這種策略使得處理器核的硬件設計變得簡單。

  存儲器訪問的基本單位是字節(Byte)。RISC-V的存儲器讀和存儲器寫指令支持一個字節(8位),半字(16位),單字(32位)為單位的存儲器讀寫操作,如果是64位架構還可以支持一個雙字(64位)為單位的存儲器讀寫操作。

  RISC-V架構的存儲器訪問指令還有如下顯著特點:

  為了提高存儲器讀寫的性能,RISC-V架構推薦使用地址對齊的存儲器讀寫操作,但是地址非對齊的存儲器操作RISC-V架構也支持,處理器可以選擇用硬件來支持,也可以選擇用軟件來支持。

  由于現在的主流應用是小端格式(Little-Endian),RISC-V架構僅支持小端格式。有關小端格式和大端格式的定義和區別,本文在此不做過多介紹,若對此不甚了解的初學者可以自行查閱學習。

  很多的RISC處理器都支持地址自增或者自減模式,這種自增或者自減的模式雖然能夠提高處理器訪問連續存儲器地址區間的性能,但是也增加了設計處理器的難度。RISC-V架構的存儲器讀和存儲器寫指令不支持地址自增自減的模式。

  RISC-V架構采用松散存儲器模型(Relaxed Memory Model),松散存儲器模型對于訪問不同地址的存儲器讀寫指令的執行順序不作要求,除非使用明確的存儲器屏障(Fence)指令加以屏蔽。

  這些選擇都清楚地反映了RISC-V架構力圖簡化基本指令集,從而簡化硬件設計的哲學。RISC-V架構如此定義非常合理,能夠達到能屈能伸的效果。譬如:對于低功耗的簡單CPU,可以使用非常簡單的硬件電路即可完成設計;而對于追求高性能的超標量處理器則可以通過復雜設計的動態硬件調度能力來提高性能。

  2.5 高效的分支跳轉指令

  RISC-V架構有兩條無條件跳轉指令(Unconditional Jump),jal與jalr指令。跳轉鏈接(Jump and Link)指令jal可用于進行子程序調用,同時將子程序返回地址存在鏈接寄存器(Link Register:由某一個通用整數寄存器擔任)中。跳轉鏈接寄存器(Jump and Link-Register)指令jalr指令能夠用于子程序返回指令,通過將jal指令(跳轉進入子程序)保存的鏈接寄存器用于jalr指令的基地址寄存器,則可以從子程序返回。

  RISC-V架構有6條帶條件跳轉指令(Conditional Branch),這種帶條件的跳轉指令跟普通的運算指令一樣直接使用2個整數操作數,然后對其進行比較,如果比較的條件滿足時,則進行跳轉。因此,此類指令將比較與跳轉兩個操作放到了一條指令里完成。

  作為比較,很多的其他RISC架構的處理器需要使用兩條獨立的指令。第一條指令先使用比較指令,比較的結果被保存到狀態寄存器之中;第二條指令使用跳轉指令,判斷前一條指令保存在狀態寄存器當中的比較結果為真時則進行跳轉。相比而言RISC-V的這種帶條件跳轉指令不僅減少了指令的條數,同時硬件設計上更加簡單。

  對于沒有配備硬件分支預測器的低端CPU,為了保證其性能,RISC-V的架構明確要求其采用默認的靜態分支預測機制,即:如果是向后跳轉的條件跳轉指令,則預測為“跳”;如果是向前跳轉的條件跳轉指令,則預測為“不跳”,并且RISC-V架構要求編譯器也按照這種默認的靜態分支預測機制來編譯生成匯編代碼,從而讓低端的CPU也能得到不錯的性能。

  為了使硬件設計盡量簡單,RISC-V架構特地定義了所有的帶條件跳轉指令跳轉目標的偏移量(相對于當前指令的地址)都是有符號數,并且其符號位被編碼在固定的位置。因此,這種靜態預測機制在硬件上非常容易實現,硬件譯碼器可以輕松的找到這個固定的位置,并判斷其是0還是1來判斷其是正數還是負數,如果是負數則表示跳轉的目標地址為當前地址減去偏移量,也就是向后跳轉,則預測為“跳”。當然對于配備有硬件分支預測器的高端CPU,則可以采用高級的動態分支預測機制來保證性能。

  2.6 簡潔的子程序調用

  為了理解此節,需先對一般RISC架構中程序調用子函數的過程予以介紹,其過程如下:

  進入子函數之后需要用存儲器寫(Store)指令來將當前的上下文(通用寄存器等的值)保存到系統存儲器的堆棧區內,這個過程通常稱為“保存現場”。

  在退出子程序之時,需要用存儲器讀(Load)指令來將之前保存的上下文(通用寄存器等的值)從系統存儲器的堆棧區讀出來,這個過程通常稱為“恢復現場”。

  “保存現場”和“恢復現場”的過程通常由編譯器編譯生成的指令來完成,使用高層語言(譬如C或者C++)開發的開發者對此可以不用太關心。高層語言的程序中直接寫上一個子函數調用即可,但是這個底層發生的“保存現場”和“恢復現場”的過程卻是實實在在地發生著(可以從編譯出的匯編語言里面看到那些“保存現場”和“恢復現場”的匯編指令),并且還需要消耗若干的CPU執行時間。

  為了加速這個“保存現場”和“恢復現場”的過程,有的RISC架構發明了一次寫多個寄存器到存儲器中(Store Multiple),或者一次從存儲器中讀多個寄存器出來(Load Multiple)的指令,此類指令的好處是一條指令就可以完成很多事情,從而減少匯編指令的代碼量,節省代碼的空間大小。但是此種“Load Multiple”和“Store Multiple”的弊端是會讓CPU的硬件設計變得復雜,增加硬件的開銷,也可能損傷時序使得CPU的主頻無法提高,筆者在曾經設計此類處理器時便深受其苦。

  RISC-V架構則放棄使用這種“Load Multiple”和“Store Multiple”指令。并解釋,如果有的場合比較介意這種“保存現場”和“恢復現場”的指令條數,那么可以使用公用的程序庫(專門用于保存和恢復現場)來進行,這樣就可以省掉在每個子函數調用的過程中都放置數目不等的“保存現場”和“恢復現場”的指令。

  此選擇再次印證了RISC-V追求硬件簡單的哲學,因為放棄“Load Multiple”和“Store Multiple”指令可以大幅簡化CPU的硬件設計,對于低功耗小面積的CPU可以選擇非常簡單的電路進行實現,而高性能超標量處理器由于硬件動態調度能力很強,可以有強大的分支預測電路保證CPU能夠快速的跳轉執行,從而可以選擇使用公用的程序庫(專門用于保存和恢復現場)的方式減少代碼量,但是同時達到高性能。

  2.7 無條件碼執行

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

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

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

  2.8 無分支延遲槽

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

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

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

  2.9 無零開銷硬件循環

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

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

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

  2.10 簡潔的運算指令

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

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

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

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

  2.11 優雅的壓縮指令子集

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

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

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

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

33.jpg

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

  這里寫圖片描述


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
先锋影音国产精品| 亚洲欧美三级在线| 国产精品99久久久久久久vr | 欧美婷婷在线| 欧美日韩和欧美的一区二区| 欧美第一黄色网| 欧美电影在线播放| 欧美国产三级| 欧美乱人伦中文字幕在线| 欧美成人激情在线| 免费人成精品欧美精品| 免费永久网站黄欧美| 老色鬼久久亚洲一区二区 | 国内自拍视频一区二区三区| 国产一级久久| 在线成人中文字幕| 亚洲国产精品电影| 亚洲精品美女在线| 一本久久精品一区二区| 一区二区欧美激情| 亚洲一区免费在线观看| 午夜精品福利视频| 久久精品成人| 亚洲精品系列| 亚洲一区久久久| 欧美在线免费播放| 麻豆91精品| 欧美日韩1080p| 国产精品久久久对白| 国产欧美日韩一区| 狠狠色狠色综合曰曰| 亚洲风情亚aⅴ在线发布| 亚洲精品欧美精品| 亚洲一区精品在线| 性感少妇一区| 亚洲日本免费| 99精品国产高清一区二区| 亚洲夜晚福利在线观看| 久久国产99| 欧美成人a视频| 国产精品久久久久999| 国产亚洲激情视频在线| 亚洲国产精品成人| 亚洲午夜一区二区三区| 欧美影院午夜播放| 99热免费精品| 久久www免费人成看片高清| 欧美成人免费播放| 国产精品嫩草99a| 一区二区亚洲| 一区二区三区 在线观看视频| 亚洲欧美日韩一区二区在线| 91久久中文字幕| 亚洲欧美一区二区激情| 久久综合狠狠综合久久综合88| 欧美日韩成人精品| 国产一区二区三区在线观看精品 | 日韩一级免费观看| 久久av老司机精品网站导航| 欧美福利电影网| 国产精品一区一区| 亚洲精品国精品久久99热| 欧美亚洲日本网站| 亚洲最新中文字幕| 久久精品视频一| 欧美视频在线看| 在线精品视频一区二区| 亚洲天堂男人| 亚洲九九精品| 久久激情一区| 欧美日韩在线视频观看| 在线观看91久久久久久| 亚洲夜间福利| 亚洲美女av网站| 久久亚洲一区二区三区四区| 欧美日韩高清在线一区| 一区在线观看| 性欧美大战久久久久久久久| 在线视频欧美一区| 久久综合久久久| 国产日产亚洲精品| 一区二区欧美亚洲| 亚洲精品美女久久久久| 久久久精品2019中文字幕神马| 欧美手机在线| 最近中文字幕日韩精品| 久久精品国产久精国产爱| 亚洲欧美日韩爽爽影院| 欧美伦理一区二区| 在线观看91精品国产麻豆| 新狼窝色av性久久久久久| 亚洲一区二区三区成人在线视频精品 | 国产精品家庭影院| 永久91嫩草亚洲精品人人| 亚洲欧美不卡| 亚洲愉拍自拍另类高清精品| 欧美成人精品一区| 国产偷国产偷亚洲高清97cao| 一区二区三区欧美日韩| 亚洲裸体俱乐部裸体舞表演av| 久久色中文字幕| 国产性色一区二区| 亚洲欧美一区二区三区极速播放 | 久久精品1区| 国产精品久久网| 亚洲午夜在线| 亚洲自啪免费| 欧美日韩一区在线视频| 亚洲精品四区| 亚洲作爱视频| 欧美日韩不卡在线| 亚洲伦理中文字幕| 夜久久久久久| 欧美精品在线视频观看| 亚洲人成在线免费观看| 亚洲久久在线| 欧美精品一卡二卡| 亚洲人成在线观看网站高清| 亚洲精品社区| 欧美人成免费网站| 亚洲精品免费观看| 一本到高清视频免费精品| 欧美人与性动交cc0o| 亚洲精品久久久久久久久久久| 日韩视频一区二区| 欧美另类人妖| 99精品久久久| 亚洲自拍电影| 国产欧美精品日韩精品| 午夜久久资源| 老鸭窝91久久精品色噜噜导演| 韩日在线一区| 亚洲日本中文字幕免费在线不卡| 牛人盗摄一区二区三区视频| 亚洲精品1区| 亚洲私人影院在线观看| 欧美丝袜一区二区| 亚洲免费婷婷| 久久视频在线视频| 亚洲第一精品久久忘忧草社区| 亚洲欧洲在线免费| 欧美日韩成人一区| 亚洲视频一二| 欧美影院视频| 在线精品一区| 亚洲一二三区在线观看| 国产麻豆日韩| 亚洲韩国精品一区| 欧美日韩国产黄| 亚洲特级片在线| 亚洲黄色av| 欧美午夜久久| 亚洲女女女同性video| 久久综合九色综合久99| 亚洲乱亚洲高清| 亚洲欧美在线一区二区| 国产精品视频免费观看www| 91久久久国产精品| 亚洲欧美综合一区| 韩国三级电影久久久久久| 亚洲精品国产精品乱码不99 | 免费h精品视频在线播放| 亚洲欧洲一区二区在线播放| 亚洲一区二区少妇| 韩国一区电影| 在线一区二区三区四区| 国产亚洲成av人片在线观看桃| 亚洲毛片一区| 国产情人综合久久777777| 一区二区免费在线视频| 久久噜噜噜精品国产亚洲综合| 最新热久久免费视频| 欧美一区二区三区四区在线 | 在线一区二区三区四区| 国产日韩在线视频| 日韩亚洲成人av在线| 欧美日韩在线视频首页| 久久精品91久久香蕉加勒比 | 国产乱肥老妇国产一区二| 亚洲看片网站| 国产精品午夜电影| 亚洲伦伦在线| 国产欧美一区二区三区另类精品 | 久久激情五月丁香伊人| 亚洲人成人99网站| 日韩视频第一页| 国外成人在线视频| 亚洲午夜视频在线| 激情综合激情| 午夜精品久久久久久99热| 亚洲国产精品欧美一二99| 性欧美xxxx大乳国产app| 亚洲高清视频一区| 久久av资源网站| 一本色道久久综合亚洲二区三区| 免费成人av在线| 亚洲欧美一区二区视频| 欧美日韩国产综合新一区| 亚洲第一毛片| 国产美女精品在线|