(二十三)CISC和RISC
一、概念释义
按指令长度是否可变,将CPU中运行的指令集分为 CISC(Complex Instruction Set Computing 复杂指令集,指令长度可变)和 RISC(Reduced Instruction Set Computing 精简指令集,指令程度不可变)。
二、CISC 和 RISC历史脉络
最初,CPU指令集其实都是RISC,这是因为一方面要考虑硬件的限制,出于性能的需要,许多功能直接通过硬件电路来完成;另一方面,为了节省捉襟见肘的内存资源,指令也被设计为一部分较短的常用指令和另一部分较长的不常用指令,这样可以在有限的存储空间里面存储更多的指令。
后来,计算机硬件性能越来越好,内存空间也越来越充足,大卫帕特森教授发现,CPU在80%的时间里都在执行20%的较短指令,因此他提出RISC理念,RISC指令集开始蓬勃发展。
相比于CISC指令集,RISC指令集主要由以下特点:
- 要支持越多的复杂指令,CPU电路的设计就会越复杂、功耗散热问题越严重、编译优化也越困难,而只支持较少简单指令的RISC指令集表现比较好。
- RISC 架构的指令数量较少,意味着同样功能的程序会需要执行更多数量的指令,就需要更多从内存读取数据到寄存器的过程,因此需要更多的通用寄存器。
- RISC 下 CPU可以把更多的晶体管资源用于执行分支预测等这样的帮助实际执行效率的功能。
不要忘了 程序执行时间 = 指令数 * CPI * 指令周期,因此RISC架构下的CPU提高执行效率的思路是减少CPI,因为更简单的指令意味着所需要的执行时间更短;而CISC架构是通过减少实际运行指令数这个思路来提高执行效率。
三、Intel 的微指令架构,RISC 和 CISC 兼容性问题
Intel 的x86 CPU指令集做的太成功了,以至于想要转向RISC架构指令集面临很沉重的向前兼容性问题,因此Intel 通过修改指令集使得CISC指令集可以在RISC架构的CPU上运行,它是如何做到的呢?其实这颇似编程中的适配器模式。
从Pentium Pro开始,Intel 引入了微指令(Micro - Instruction)架构:
这种架构下,一条CISC指令被指令译码器转换成系统功能的多条RISC指令存放在微指令缓冲区中,然后再分发给后面的超标量,同时也是乱序执行的流水线里面。为了减轻译码器转换负担和CPU功耗,引入来CPU 的L0缓冲区来缓存已经译码结果,这一点也体现了局部优化的思路。
四、ARM 和 RISC-V ,CPU 未来展望
由于x86架构的CPU做了大量指令执行相关的优化,相比于RISC架构的ARM CPU,功耗问题一直特别突出,因此在特别注重功耗的移动端领域ARM才是唯一的霸主,这主要有以下两个原因:
- ARM的CPU为了降低功耗所做的妥协有:更低的主频、更弱的乱序执行能力、更少的晶体管和更少的高速缓存。
- ARM并没有垄断芯片的设计和制造,而是通过专利授权的形式提供给其他厂商制造,因此占领了市场,但是利润并不高。
ARM虽然只授权使用却不开源,因此近年来有一些开源硬件项目逐渐发展起来,如 RISC-V项目。