深刻浅出计算机组成原理学习笔记:第二十九讲

1、引子

我在第5讲讲计算机指令的时候,给你看过MIPS体系结构计算机的机器指令格式。MIPS的指令都是固定的32位长度,若是要用一个打孔卡来表示,并不复杂。算法

第6讲的时候,我带你编译了一些简单的C语言程序,看了x86体系结构下的汇编代码。眼尖的话,你应该能发现,每一条机器码的长度是不同的。ubuntu

而CPU的指令集里的机器码是固定长度仍是可变长度,也就是 复杂指令集(Complex Instruction SetComputing,简称CISC)和 精简指令集(Reduced Instruction Set Computing,简称RISC)这两种风格的指令集一个最重要的差异。那今天咱们就来看复杂指令集和精简指令集之间的对比、差别以及历史纠葛。设计模式

2、CISC VS RISC:历史的车轮不老是向前的

一、人月神话

在计算机历史的早期,其实没有什么CISC和RISC之分。或者说,全部的CPU其实都是CISC。缓存

虽然冯·诺依曼高屋建瓴地提出了存储程序型计算机的基础架构,可是实际的计算机设计和制造仍是严格受硬件层面的限制。当时的计算机很慢,存储空间也很小。
《人月神话》这本软件工程界的名著,讲的是花了好几年设计IBM 360这台计算机的经验。IBM 360的最低配置,每秒只能运行34500条指令,只有8K的内
存。为了让计算机可以作尽可能多的工做,每个字节乃至每个比特都特别重要。bash

因此,CPU指令集的设计,须要仔细考虑硬件限制。为了性能考虑,不少功能都直接经过硬件电路来完成。为了少用内存,指令的长度也是可变的。
就像算法和数据结构里的赫夫曼编码(Huffman coding)同样,经常使用的指令要短一些,不经常使用的指令能够长一些。那个时候的计算机,想要用尽量少的内存空间,
存储尽可能多的指令。服务器

二、80%的时间都是在使用20%的简单指令

不过,历史的车轮滚滚向前,计算机的性能愈来愈好,存储的空间也愈来愈大了。到了70年代末,RISC开始登上了历史的舞台。当时,UC Berkeley的大卫·帕特森(David Patterson)教授发现,
实际在CPU运行的程序里,80%的时间都是在使用20%的简单指令。因而,他就提出了RISC的理念。自此以后,RISC类型的CPU开始快速蓬勃发展。数据结构

我常常推荐的课后阅读材料,有很多是来自《计算机组成与设计:硬件/软件接口》和《计算机体系结构:量化研究方法》这两本教科书。此外,他还在2017年得到了图灵奖。架构

三、RISC架构的CPU到底是什么样的呢?

RISC架构的CPU的想法其实很是直观。既然咱们80%的时间都在用20%的简单指令,那咱们能不能只要那20%的简单指令就行了呢?答案固然是能够的。由于指令数量多,
计算机科学家们在软硬件两方面都受到了不少挑战。ionic

在硬件层面:

咱们要想支持更多的复杂指令,CPU里面的电路就要更复杂,设计起来也就更困难。更复杂的电路,在散热和功耗层面,也会带来更大的挑战。性能

在软件层面:

支持更多的复杂指令,编译器的优化就变得更困难。毕竟,面向2000个指令来优化编译器和面向500个指令来优化编译器的困难是彻底不一样的。

因而,在RISC架构里面,CPU选择把指令“精简”到20%的简单指令。而原先的复杂指令,则经过用简单指令组合起来来实现,让软件来实现硬件的功能。这样,CPU的整个硬件设计就会变得更简单了,在硬件层面提高性能也会变得更容易了。

RISC的CPU里完成指令的电路变得简单了,因而也就腾出了更多的空间。这个空间,经常被拿来放通用寄存器。由于RISC完成一样的功能,执行的指令数量要比CISC多,因此,
若是须要反复从内存里面读取指令或者数据到寄存器里来,那么不少时间就会花在访问内存上。因而,RISC架构的CPU每每就有更多的通用寄存器。

除了寄存器这样的存储空间,RISC的CPU也能够把更多的晶体管,用来实现更好的分支预测等相关功能,进一步去提高CPU实际的执行效率。

总的来讲,对于CISC和RISC的对比,咱们能够一块儿回到第4讲讲的程序运行时间的公式:

程序的CPU执行时间=指令数 × CPI × Clock Cycle Time

四、为何它能在这么短的时间内受到如此大的追捧?

CISC的架构,其实就是经过优化指令数,来减小CPU的执行时间。

而RISC的架构,实际上是在优化CPI。由于指令比较简单,须要的时钟周期就比较少。

由于RISC下降了CPU硬件的设计和开发难度,因此从80年代开始,大部分新的CPU都开始采用RISC架构。从IBM的PowerPC,到SUN的SPARC,都是RISC架构。
全部人看到仍然采用CISC架构的Intel CPU,均可以批评一句“Complex and messy”。可是,为何不管是在PC上,仍是服务器上,仍然是Intel成为最后的赢家呢?

3、Intel的进化:微指令架构的出现

面对这么多负面评价的Intel,天然也不能无动于衷。更况且,x86架构的问题并不能说明Intel的工程师不够厉害。事实上,在整个CPU设计的领域,Intel集中了大量优秀的人才。不管是成功的Pentium时代引入的超标量设计,仍是失败的Pentium 4时代引入的超线程技术,都是异常精巧的工程实现。

一、指令集的向前兼容性

而x86架构所面临的种种问题,其实都来自于一个最重要的考量,那就是指令集的向前兼容性。由于x86在商业上太成功了,因此市场上有大量的Intel CPU。
而围绕着这些CPU,又有大量的操做系统、编译器。这些系统软件只支持x86的指令集,就好比著名的Windows 95。而在这些系统软件上,又有各类各样的应用软件。

二、由于不兼容x86的指令集,遭遇了重大的失败

若是Intel要放弃x86的架构和指令集,开发一个RISC架构的CPU,面临的第一个问题就是全部这些软件都是不兼容的。事实上,Intel并不是没有尝试过在x86以外另起炉灶,这其实就是我在第26讲介绍的安腾处理器。当时,Intel想要在CPU进入64位的时代的时候,丢掉x86的历史包袱,因此推出了全新的IA-64的架构。可是,却由于不兼容x86的指令集,遭遇了重大的失败。

三、AMD和Intel的64位有什么不同

反而是AMD,趁着Intel研发安腾的时候,推出了兼容32位x86指令集的64位架构,也就是AMD64。若是你如今在Linux下安装各类软件包,必定常常会看到像下面这样带有AMD64字样的内容。这是由于x86下的64位的指令集x86-64,并非Intel发明的,而是AMD发明的。

Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 fontconfig amd64 2.12.6-0ubuntu2 [169 kB]

花开两朵,各表一枝。Intel在开发安腾处理器的同时,也在不断借鉴其余RISC处理器的设计思想。既然核心问题是要始终向前兼容x86的指令集,那么咱们能不能不修改指令集,可是让CISC风格的指令集,用RISC的形式在CPU里面运行呢?

四、Intel就开始在处理器里引入了 微指令架构

因而,从Pentium Pro时代开始,Intel就开始在处理器里引入了 微指令(Micro-Instructions/Micro-Ops) 架构。而微指令架构的引入,也让CISC和RISC的分界变得模糊了。

 

在微指令架构的CPU里面,编译器编译出来的机器码和汇编代码并无发生什么变化。但在指令译码的阶段,指令译码器“翻译”出来的,再也不是某一条CPU指令。
译码器会把一条机器码,“ 翻译”成好几条“微指令”。这里的一条条微指令,就再也不是CISC风格的了,而是变成了固定长度的RISC风格的了。

五、指令译码器变成了设计模式里的一个“适配器”

这些RISC风格的微指令,会被放到一个微指令缓冲区里面,而后再从缓冲区里面,分发给到后面的超标量,而且是乱序执行的流水线架构里面。
不过这个流水线架构里面接受的,就不是复杂的指令,而是精简的指令了。在这个架构里,咱们的指令译码器至关于变成了设计模式里的一个
“适配器”(Adaptor)。这个适配器,填平了CISC和RISC之间的指令差别。

六、CISC的指令译码成RISC指令的指令译码器存在的问题

不过,凡事有好处就有坏处。这样一个可以把CISC的指令译码成RISC指令的指令译码器,比原来的指令译码器要复杂。这也就意味着更复杂的电路和更长的译码时间:
原本觉得能够经过RISC提高的性能,结果又有一部分浪费在了指令译码上。针对这个问题,咱们有没有更好的办法呢?

七、为何你们任务认为RISC优于CISC

我在前面说过,之因此你们认为RISC优于CISC,来自于一个数字统计,那就是在实际的程序运行过程当中,有80%运行的代码用着20%的经常使用指令。这意味着,
CPU里执行的代码有很强的局部性。而对于有着很强局部性的问题,常见的一个解决方案就是使用缓存。因此,Intel就在CPU里面加了一层L0 Cache。
这个Cache保存的就是指令译码器把CISC的指令“翻译”成RISC的微指令的结果。因而,在大部分状况下,CPU均可以从Cache里面拿到译码结果,而不须要让译码器
去进行实际的译码操做。这样不只优化了性能,由于译码器的晶体管开关动做变少了,还减小了功耗。

由于“微指令”架构的存在,从Pentium Pro开始,Intel处理器已经不是一个纯粹的CISC处理器了。它一样融合了大量RISC类型的处理器设计。不过,因为Intel自己在CPU层面作的大量优化,
好比乱序执行、分支预测等相关工做,x86的CPU始终在功耗上仍是要远远超过RISC架构的ARM,因此最终在智能手机崛起替代PC的时代,落在了ARM后面。

4、ARM和RISC-V:CPU的如今与将来

2017年,ARM公司的CEO Simon Segards宣布,ARM累积销售的芯片数量超过了1000亿。做为一个从12我的起步,在80年代想要获取Intel的80286架构受权来制造CPU的公司,ARM是如何在移动端把本身的芯片塑形成了最终的霸主呢?

一、ARM的芯片是基于RISC架构

ARM这个名字如今的含义,是“Advanced RISC Machines”。你从名字就可以看出来,ARM的芯片是基于RISC架构的。不过,ARM可以在移动端打败Intel,
并非由于RISC架构。

到了21世纪的今天,CISC和RISC架构的分界已经没有那么明显了。Intel和AMD的CPU也都是采用译码成RISC风格的微指令来运行。ARM的芯片,
而一条指令一样须要多个时钟周期,有乱序执行和多发射。我甚至看到过这样的评价,“ARM和RISC的关系,只有在名字上”。

二、为何ARM可以在移动端打败Intel

第一点是功耗优先的设计

一个4核的Intel i7的CPU,设计的时候功率就是130W。而一块ARM A8的单个核心的CPU,设计功率只有2W。二者之间差出了100倍。
在移动设备上,功耗是一个远比性能更重要的指标,毕竟咱们不能随时在身上带个发电机。ARM的CPU,主频更低,晶体管更少,高速缓存更小,
乱序执行的能力更弱。全部这些,都是为了功耗所作的妥协。

第二点则是低价

ARM并无本身垄断CPU的生产和制造,只是进行CPU设计,而后把对应的知识产权受权出去,让其余的厂商来生产ARM架构的CPU。
它甚至还容许这些厂商能够基于ARM的架构和指令集,设计属于本身的CPU。像苹果、三星、华为,它们都是拿到了基于ARM体系架构设计和制造CPU的受权。ARM本身
只是收取对应的专利受权费用。多个厂商之间的竞争,使得ARM的芯片在市场上价格很便宜。因此,尽管ARM的芯片的出货量远大于Intel,可是收入和利润却比不上Intel。

三、ARM并非开源的

不过,ARM并非开源的。因此,在ARM架构逐渐垄断移动端芯片市场的时候,“开源硬件”也慢慢发展起来了。

一、一方面,MIPS在2019年宣布开源

二、另外一方面,从UC Berkeley发起的RISC-V项目也愈来愈受到你们的关注。而RISC概念的发明人,图灵奖的得主大卫·帕特森教授从伯克利退休以后,
成了RISC-V国际开源实验室的负责人,开始推进RISC-V这个“CPU届的Linux”的开发。能够想见,将来的开源CPU,也多半会像Linux同样,
逐渐成为一个业界的主流选择。若是想要“打造一个属于本身CPU”,不可不关注这个项目

5、总结延伸

这一讲,我从RISC和CISC架构以前的差别提及,讲到RISC的指令是固定长度的,CISC的指令是可变长度的。RISC的指令集里的指令数少,
并且单个指令只完成简单的功能,因此被称为“精简”。CISC里的指令数多,为了节约内存,直接在硬件层面可以完成复杂的功能,因此被称为“复杂”。
RISC的经过减小CPI来提高性能,而CISC经过减小须要的指令数来提高性能。


而后,咱们进一步介绍了Intel的x86 CPU的“微指令”的设计思路。“微指令”使得咱们在机器码层面保留了CISC风格的x86架构的指令集。
可是,经过指令译码器和L0缓存的组合,使得这些指令能够快速翻译成RISC风格的微指令,使得实际执行指令的流水线能够用RISC的架构来搭建。
使用“微指令”设计思路的CPU,不能再称之为CISC了,而更像一个RISC和CISC融合的产物。

过去十年里,Intel仍然把持着PC和服务器市场,可是更多的市场上的CPU芯片来自基于ARM架构的智能手机了。而在ARM彷佛已经垄断了移动CPU市场的时候,开源的RISC-V出现了,也给了计算机工程师们新的设计属于本身的CPU的机会。

相关文章
相关标签/搜索