到今天为止,专栏已通过半了。过去的20多讲里,我给你讲的内容,不少都是围绕着怎么提高CPU的性能这个问题展开的。咱们先回顾一下第4讲,不知道你是否还记得这个公式:bash
程序的CPU执行时间 = 指令数 × CPI × Clock Cycle Time
这个公式里,有一个叫CPI的指标。咱们知道,CPI的倒数,又叫做IPC(Instruction Per Clock),也就是一个时钟周期里面可以执行的指令数,表明了CPU的吞吐率。那么,这个指标,放在咱们前面几节反复优化流
水线架构的CPU里,能达到多少呢?服务器
答案是,最佳状况下,IPC也只能到1。由于不管作了哪些流水线层面的优化,即便作到了指令执行层面的乱架构
这说明,不管指令后续能优化得多好,一个时钟周期也只能执行完这样一条指令,CPI只能是1。可是,咱们如今用的Intel CPU或者ARM的CPU,通常的CPI都能作到2以上,这是怎么作到的呢?并发
今天,咱们就一块儿来看看,现代CPU都使用了什么“黑科技”。性能
以前讲CPU的硬件组成的时候,咱们把全部算术和逻辑运算都抽象出来,变成了一个ALU这样的“黑盒子”。你应该还记得第13讲到第16讲,关于加法器、乘法器、乃至浮点数计算的部分,其实整数的计算和
浮点数的计算过程差别仍是不小的。实际上,整数和浮点数计算的电路,在CPU层面也是分开的。优化
一直到80386,咱们的CPU都是没有专门的浮点数计算的电路的。当时的浮点数计算,都是用软件进行模拟的。因此,在80386时代,Intel给386配了单独的387芯片,专门用来作浮点数运算。那个时候,
你买386芯片的话,会有386sx和386dx这两种芯片能够选择。386dx就是带了387浮点数计算芯片的,而sx就是不带浮点数计算芯片的。spa
其实,咱们如今用的Intel CPU芯片也是同样的。虽然浮点数计算已经变成CPU里的一部分,但并非全部计算功能都在一个ALU里面,真实的状况是,咱们会有多个ALU。这也是为何,在第24讲讲乱序执行的时
候,你会看到,其实指令的执行阶段,是由不少个功能单元(FU)并行(Parallel)进行的。scala
不过,在指令乱序执行的过程当中,咱们的取指令(IF)和指令译码(ID)部分并非并行进行的。设计
既然指令的执行层面能够并行进行,为何取指令和指令译码不行呢?若是想要实现并行,该怎么办呢?3d
其实只要咱们把取指令和指令译码,也同样经过增长硬件的方式,并行进行就行了。咱们能够一次性从内存里面取出多条指令,而后分发给多个并行的指令译码器,进行译码,而后对应交给不一样的功能单元去处理。
这样,咱们在一个时钟周期里,可以完成的指令就不仅一条了。IPC也就能作到大于1了。
这种CPU设计,咱们叫做 多发射(Mulitple Issue)和 超标量(Superscalar)。
什么叫多发射呢?这个词听起来很抽象,其实它意思就是说,咱们同一个时间,可能会同时把多条指令发射(Issue)到不一样的译码器或者后续处理的流水线中去。
在超标量的CPU里面,有不少条并行的流水线,而不是只有一条流水线。“超标量“这个词是说,原本咱们在一个时钟周期里面,只能执行一个标量(Scalar)的运算。在多发射的状况下,
咱们就可以超越这个限制,同时进行屡次计算。
你能够看我画的这个超标量设计的流水线示意图。仔细看,你应该能看到一个有意思的现象,每个功能单元的流水线的长度是不一样的。事实上,不一样的功能单元的流水线长度原本就不同。咱们平时所说的14级
流水线,指的一般是进行整数计算指令的流水线长度。若是是浮点数运算,实际的流水线长度则会更长一些。
不管是以前几讲里讲的乱序执行,仍是如今更进一步的超标量技术,在实际的硬件层面,其实实施起来都挺麻烦的。这是由于,在乱序执行和超标量的体系里面,咱们的CPU要解决依赖冲突的问题。这也就是前面几
讲咱们讲的冒险问题。
CPU须要在指令执行以前,去判断指令之间是否有依赖关系。若是有对应的依赖关系,指令就不能分发到执行阶段。由于这样,上面咱们所说的超标量CPU的多发射功能,又被称为 动态多发射处理器。这些对于依赖
关系的检测,都会使得咱们的CPU电路变得更加复杂。
因而,计算机科学家和工程师们就又有了一个大胆的想法。咱们能不能不把分析和解决依赖关系的事情,放在硬件里面,而是放到软件里面来干呢?
若是你还记得的话,我在第4讲也讲过,要想优化CPU的执行时间,关键就是拆解这个公式:
程序的CPU执行时间 = 指令数 × CPI × Clock Cycle Time
当时咱们说过,这个公式里面,咱们能够经过改进编译器来优化指令数这个指标。那接下来,咱们就来看看一个很是大胆的CPU设计想法,叫做 超长指令字设计(Very Long Instruction Word,VLIW)。这个设计
呢,不只想让编译器来优化指令数,还想直接经过编译器,来优化CPI。
围绕着这个设计的,是Intel一个著名的“史诗级”失败,也就是著名的IA-64架构的安腾(Itanium)处理器。只不过,这一次,责任不全在Intel,还要拉上能够称之为硅谷起源的另外一家公司,也就是惠普。
之因此称为“史诗”级失败,这个说法来源于惠普最先给这个架构取的名字, 显式并发指令运算(ExplicitlyParallel Instruction Computer),这个名字的缩写 EPIC,正好是“史诗”的意思。
好巧不巧,安腾处理器和和我以前给你介绍过的Pentium 4同样,在市场上是一个失败的产品。在经历了12年之久的设计研发以后,安腾一代只卖出了几千套。而安腾二代,在从2002年开始反复挣扎了16年以后,
最终在2018年被Intel宣告放弃,退出了市场。自此,世上再也没有这个“史诗”服务器了。
那么,咱们就来看看,这个超长指令字的安腾处理器是怎么回事儿。
在乱序执行和超标量的CPU架构里,指令的先后依赖关系,是由CPU内部的硬件电路来检测的。而到了 超长指令字的架构里面,这个工做交给了编译器这个软件。
我从专栏第5讲开始,就给你看了很多C代码到汇编代码和机器代码的对照。编译器在这个过程当中,其实也可以知道先后数据的依赖。因而,咱们可让编译器把没有依赖关系的代码位置进行交换。而后,再把多条
连续的指令打包成一个指令包。安腾的CPU就是把3条指令变成一个指令包。
CPU在运行的时候,再也不是取一条指令,而是取出一个指令包。而后,译码解析整个指令包,解析出3条指令直接并行运行。能够看到,使用 超长指令字架构的CPU,一样是采用流水线架构的。也就是说,一组
(Group)指令,仍然要经历多个时钟周期。一样的,下一组指令并非等上一组指令执行完成以后再执行,而是在上一组指令的指令译码阶段,就开始取指令了。
值得注意的一点是,流水线停顿这件事情在 超长指令字里面,不少时候也是由编译器来作的。除了停下整个处理器流水线, 超长指令字的CPU不能在某个时钟周期停顿一下,等待前面依赖的操做执行完成。编译器需
要在适当的位置插入NOP操做,直接在编译出来的机器码里面,就把流水线停顿这个事情在软件层面就安排稳当。
虽然安腾的设想很美好,Intel也曾经但愿可以让安腾架构成为替代x86的新一代架构,可是最终安腾仍是在前先后后折腾将近30年后失败了。2018年,Intel宣告安腾9500会在2021年中止供货。
安腾失败的缘由有不少,其中有一个重要的缘由就是“向前兼容”。
一方面,安腾处理器的指令集和x86是不一样的。这就意味着,原来x86上的全部程序是没有办法在安腾上运行的,而须要经过编译器从新编译才行。
另外一方面,安腾处理器的VLIW架构决定了,若是安腾须要提高并行度,就须要增长一个指令包里包含的指令数量,比方说从3个变成6个。一旦这么作了,虽然一样是VLIW架构,一样指令集的安腾CPU,程序也需
要从新编译。由于原来编译器判断的依赖关系是在3个指令以及由3个指令组成的指令包之间,如今要变成6个指令和6个指令组成的指令包。编译器须要从新编译,交换指令顺序以及NOP操做,才能知足条件。甚至,咱们须要从新来写编译器,才能让程序在新的CPU上跑起来。
因而,安腾就变成了一个既不容易向前兼容,又不容易向后兼容的CPU。那么,它的失败也就不足为奇了。能够看到,技术思路上的先进想法,在实际的业界应用上会遇到更多具体的实践考验。不管是指令集向前兼
容性,仍是对应CPU将来的扩展,在设计的时候,都须要更多地去考虑实践因素。
这一讲里,我和你一块儿向CPU的性能发起了一个新的挑战:让CPU的吞吐率,也就是IPC可以超过1。
我先是为你介绍了超标量,也就是Superscalar这个方法。超标量可让CPU不只在指令执行阶段是并行的,在取指令和指令译码的时候,也是并行的。经过超标量技术,可使得你所使用的CPU的IPC超过1。
在Intel的x86的CPU里,从Pentium时代,第一次开始引入超标量技术,整个CPU的性能上了一个台阶。对应的技术,一直沿用到了如今。超标量技术和你以前看到的其余流水线技术同样,依赖于在硬件层面,可以
检测到对应的指令的前后依赖关系,解决“冒险”问题。因此,它也使得CPU的电路变得更复杂了。
由于这些复杂性,惠普和Intel又共同推出了著名的安腾处理器。经过在编译器层面,直接分析出指令的先后依赖关系。因而,硬件在代码编译以后,就能够直接拿到调换好前后顺序的指令。而且这些指令中,能够并
行执行的部分,会打包在一块儿组成一个指令包。安腾处理器在取指令和指令译码的时候,拿到的再也不是单个指令,而是这样一个指令包。而且在指令执行阶段,能够并行执行指令包里全部的指令。
虽然看起来,VLIW在技术层面更具备颠覆性,不只仅只是一个硬件层面的改造,并且利用了软件层面的编译器,来组合解决提高CPU指令吞吐率的问题。然而,最终VLIW却没有获得市场和业界的承认。
惠普和Intel强强联合开发的安腾处理器命运多舛。从1989开始研发,直到2001年才发布了第一代安腾处理器。然而12年的开发过程后,第一代安腾处理器最终只卖出了几千套。而2002年发布的安腾2处理器,也没
能拯救本身的命运。最终在2018年,Intel宣布安腾退出市场。自此以后,市面上再没有可以大规模商用的VLIW架构的处理器了。