精简指令集计算机

(重定向自精简指令集

精简指令集计算机(英語: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電腦中不太可能出現)。

参考