(二十)Superscalar 和 VLIW CPU吞吐量提升
一、回顾一下指令执行时间
程序执行时间 = 指令数 * CPI * Clock sycle time
二、多发射与超标量:并行取指令、指令译码
CPU乱序执行的优化中,取指令和指令译码的操作还是串行的,为了提高取指令和指令译码的效率,通过增加硬件的方式,使得同一时间可以取到多条指令、并行译码。这种方式被称为“多发射”与“超标量”。
在超标量的CPU里面,可以同时运行多条流水线,且这些流水线长度可能并不相同,例如进行浮点数运算的流水线就比进行整数运算的流水线的长度长。
三、超长指令字设计
在乱序执行和超标量执行里面由于指令/数据间依赖关系的存在,会造成处理逻辑比较复杂。 检测指令依赖需要在指令执行之前完成,可以通过复杂的硬件电路完成,也可以通过软件层面也就是编译器来完成。这样一来,编译器不仅需要优化指令数,还需要优化CPI,这种设计成为“超长指令数设计”。但Intel在这个看起来不错的优化方向上的投入遭遇来很大的失败,最后不得不退出市场。其原理如下:
编译器在编译过程知道哪些指令存在相互依赖,然后将依赖的指令和不依赖的指令进行交换,最后将三个没有依赖关系的指令组成一个指令包交给CPU去执行。CPU一次性取出一个指令包,交给译码器去译码然后并行去执行,这种模式下,同样使用流水线执行指令,后一组指令的获取不会等到前一组指令执行完成再开始,而是前一组译码阶段后一组指令的取指令操作就开始了,而流水线停顿也是通过编译器插入NOP指令完成的。
Intel的这种架构在三十年后彻底失败了,其中一个重要的原因是“向前兼容性”
- 之前x86架构的CPU指令集和这种架构指令集不同,导致程序没有办法向前兼容
- VLIW 架构决定了,想要继续提高并行速度就要增加指令包的指令数,这样就需要重新编译以前的程序才能在新的CPU上运行。
最终做出了一个既不能向前兼容,又不能向后兼容的架构,只能以失败告终。
四、总结
为了提升CPU执行指令的吞吐量,一些CPU设计上采用了超标量方法,但是为了解决并行执行中指令依赖的问题,需要使用很复杂的硬件电路来检测指令依赖,因此基于VLIW架构的安腾处理器通过在编译器在软件层面就分析出指令依赖并通过将指令打包执行的方式提升执行效率,这是一种开创性的突破,但最终却因为兼容问题使得项目失败了。