精簡指令集電腦

精簡指令集電腦(英語:Reduced Instruction Set Computer縮寫RISC)或簡譯為精簡指令集,是電腦中央處理器的一種設計模式。這種設計思路可以想像成是一家模組化的組裝工廠,對指令數目和定址方式都做了精簡,使其實現更容易,指令並列執行程度更好,編譯器的效率更高。目前常見的精簡指令集微處理器包括DEC AlphaARC英語ARC (processor)ARMAVRMIPSPA-RISCPower ISA(包括PowerPCPowerXCell)、RISC-VSPARC等。

一顆主要用於路由器Conexant ARM處理器
DEC Alpha AXP 21064 處理器在Windows NT 4.0 SP6之前微軟都還支援
IBM PowerPC 601處理器用於PowerMac

歷史

精簡指令集的名稱最早來自1980年大衛·帕特森加州大學柏克萊分校主持的Berkeley RISC英語Berkeley RISC計劃。但在他之前,已經有人提出類似的設計理念。由約翰·科克主持,在1975年開始,1980年完成的IBM 801計劃,可能是第一個使用精簡指令集理念來設計的系統。

這種設計思路最早的產生緣自於有人發現,儘管傳統處理器設計了許多特性讓代碼編寫更加便捷,但這些複雜特性需要幾個指令周期才能實現,並且常常不被執行程式所採用。此外,處理器和主主記憶體之間執行速度的差別也變得越來越大。在這些因素促使下,出現了一系列新技術,使處理器的指令得以流水執行,同時降低處理器訪問主記憶體的次數。

早期,這種指令集的特點是指令數目少,每條指令都採用標準字長、執行時間短、中央處理器的實現細節對於機器級程式是可見的等等。

實際上在後來的發展中,RISC與CISC(複雜指令集)在競爭的過程中相互學習,現在的RISC指令集也達到數百條,執行周期也不再固定。雖然如此,RISC設計的根本原則——針對管線化的處理器最佳化——沒有改變,而且還在遵循這種原則的基礎上發展出RISC的一個並行化變種VLIW(包括Intel EPIC),就是將簡短而長度統一的精簡指令組合出超長指令,每次執行一條超長指令,等於並行執行多條短指令。

另一方面,目前最常見的複雜指令集x86 CPU,雖然指令集是CISC的,但因對常用的簡單指令會以硬體線路控制盡全力加速,不常用的複雜指令則交由微碼循序器「慢慢解碼、慢慢跑」,因而有「RISCy x86」之稱。

精簡指令集之前的設計原理

在早期的電腦業界,編譯器技術並不發達,程式多半以機器語言組譯語言完成。為了便於編寫程式,電腦架構師設計出越來越複雜的指令,可以直接對應進階程式語言的進階功能。當時的看法是硬體比編譯器更容易設計,所以結構的複雜性在硬體這端。

加速這種複雜化的另一因素是缺乏大容量的主記憶體。在主記憶體容量受限的應用中,具有極高訊息密度的程式更加實用。當時主記憶體中的每一位元組都很寶貴,例如只有幾千個位元組來儲存某個完整系統。它使產業界傾向於高度編碼的指令、長度不等的指令、多運算元的指令,以及把資料的搬移與計算合併在一起的指令。在當時看來,相對於使指令更容易解碼,指令的編碼打包問題尤為重要。

還有一個因素是當時的主記憶體不僅容量少,而且速度很慢,使用的都是磁性技術。憑藉高密度打包的指令,存取慢速資源的頻率可以降低。

微處理器只有少量暫存器的兩個原因是:

  • 暫存器每一個位元位都比外部主記憶體貴。以當時的積體電路技術水準,大量暫存器對晶片或電路板而言是難以承受的。
  • 一旦具有大數量的暫存器,相關的指令字(opcode)將會需要更多的位元位(使用寶貴的RAM)來定位暫存器。

基於上述原因,微處理器設計師儘可能使指令做更多的工作。這導致單個指令做全部的工作:讀入兩個加數,相加,並將計算結果直接寫入主記憶體;另一個例子是從主記憶體讀取兩個數據,但計算結果儲存在暫存器內;第三個例子是從主記憶體和暫存器各讀取一個數據,其結果再次寫入主記憶體;以此類推。這種微處理器設計原理,在精簡指令集(RISC)的思路出現後,最終被人稱為複雜指令集

當時設計的一個通常目標是為每個指令都提供所有的尋址模式,稱為「正交性」。這給微處理器增加了一些複雜性,但理論上每個可能的命令均可單獨調整。相對於使用更簡單的指令,這樣做能夠使設計速度更快。

這類設計最終可以由功率譜的兩端來表述,6502在一端,VAX在功率譜的另一端。單價25美元的1MHz 6502晶片只有一個通用暫存器,但它非常精簡的單週期主記憶體訪問介面允許一個位元組寬度的操作,其效率和使用更高時脈頻率的設計一致,例如主頻4MHz的Zilog Z80使用相同慢速的記憶晶片(大約近似300ns)。另一方面,VAX則是一種小型機,它的每個CPU至少需要三個機架來放置。其顯著特點是,它支援的主記憶體存取模式數目多得驚人,並且每條指令都可以使用任一種模式。

RISC設計原理

1970年代後期,IBM(以及其它類似企業組織)的研究人員顯示,大多數正交尋址模式基本上已被程式員所忽略。這是編譯器的使用逐漸增多而組譯語言的使用相對減少所導致的。值得注意的是,由於編寫編譯器的難度很大,當時編譯器並不能充分利用CISC處理器所提供的各種特性。儘管如此,廣泛應用編譯器的趨勢已然很明顯,從而使得正交定址模式變得更加無用。

這些複雜操作很少被使用。事實上,相比用更精簡的一系列指令來完成同一個任務,用單一複雜指令甚至會更慢。這看上去有些自相矛盾,卻源自於微處理器設計者所花的時間和精力:設計者一般沒有時間去調整每一條可能被用到的指令,通常他們只最佳化那些常用的指令。一個惡名昭著的例子是VAX的INDEX指令,執行它比執行一個迴圈還慢。

幾乎就在同時,微處理器開始比主記憶體執行得更快。即便是在七十年代末,人們也已經認識到這種不一致性至少會在下一個十年繼續增加,到時微處理器將會比主記憶體的速度快上百倍。很明顯,需要有更多暫存器(以及後來的快取)來支援更高頻率的操作。為此,必須降低微處理器原本的複雜度,以節省出空間給新增的暫存器和快取。

不過RISC也有它的缺點。當需要一系列指令用來完成非常簡單的程式時,從記憶體讀入的指令總數會變多,因此也需要更多時間。在當時的工業和設計領域,對RISC的效能優劣有大量持續不斷的爭論。

提升中央處理器效能的方法

精簡指令集設計中常見的特徵:

  • 統一指令編碼(例如,所有指令中的op-code永遠位於同樣的位元位置、等長指令),可快速解譯:
  • 泛用的暫存器,所有暫存器可用於所有內容,以及編譯器設計的單純化(不過暫存器中區分了整數浮點數);
  • 單純的尋址模式(複雜尋址模式以簡單計算指令序列取代);
  • 硬體中支援少數資料型別(例如,一些CISC電腦中存有處理位元組字串的指令。這在RISC電腦中不太可能出現)。

參考