精简指令集
历史
精简指令集的名称最早来自1980年大卫·帕特森在加州大学柏克莱分校主持的Berkeley RISC计划。但在他之前,已经有人提出类似的设计理念。由约翰·科克主持,在1975年开始,1980年完成的IBM 801项目,可能是第一个使用精简指令集理念来设计的系统。
这种设计思路最早的产生缘自于有人发现,尽管传统处理器设计了许多特性让代码编写更加便捷,但这些复杂特性需要几个指令周期才能实现,并且常常不被运行程序所采用。此外,处理器和主内存之间运行速度的差别也变得越来越大。在这些因素促使下,出现了一系列新技术,使处理器的指令得以流水执行,同时降低处理器访问内存的次数。
早期,这种指令集的特点是指令数目少,每条指令都采用标准字长、执行时间短、中央处理器的实现细节对于机器级程序是可见的等等。
实际上在后来的发展中,RISC与CISC在竞争的过程中相互学习,现在的RISC指令集也达到数百条,运行周期也不再固定。虽然如此,RISC设计的根本原则——针对流水线化的处理器优化——没有改变,而且还在遵循这种原则的基础上发展出RISC的一个并发化变种VLIW(包括Intel EPIC),就是将简短而长度统一的精简指令组合出超长指令,每次运行一条超长指令,等于并发运行多条短指令。
另一方面,目前最常见的复杂指令集x86CPU,虽然指令集是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的性能优劣有大量持续不断的争论。
提升中央处理器性能的方法
增加寄存器的大小
增进内部的平行性
增加高速缓存大小
加入其它功能,如I/O和计时器
加入向量处理器(SIMD),如VISAltiVec、SSE(Streaming SIMD Extensions)
避免附加。使朝向省电化(battery-constrained)或小型化的应用
集成多个核心
硬件多线程技术
精简指令集设计中常见的特征:
统一指令编码(例如,所有指令中的op-code永远位于同样的比特位置、等长指令),可快速解译:
泛用的寄存器,所有寄存器可用于所有内容,以及编译器设计的单纯化(不过寄存器中区分了整数和浮点数);
单纯的寻址模式(复杂寻址模式以简单计算指令序列取代);
硬件中支持少数数据类型(例如,一些CISC电脑中存有处理字节字符串的指令。这在RISC电脑中不太可能出现)。
参考
复杂指令集
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值