超纯量
超纯量(superscalar)CPU架构是指在一颗处理器内核中实行了指令级并行的一类并行运算。这种技术能够在相同的CPU主频下实现更高的CPU流量(throughput)。处理器的内核中一般有多个执行单元(或称功能单元),如算术逻辑单元、位移单元、乘法器等等。未实现超纯量体系结构时,CPU在每个时钟周期仅执行单条指令,因此仅有一个执行单元在工作,其它执行单元空闲。超纯量体系结构的CPU在一个时钟周期可以同时分派(dispatching)多条指令在不同的执行单元中被执行,这就实现了指令级的并行。超纯量体系结构可以视作多指令流多数据流。
超纯量体系结构的CPU一般也都实现了指令流水化。但是一般认为这二者是增强CPU性能的不同的技术。

历史
第一个超纯量的设计是在1965年西摩·克雷开发的CDC 6600。1984年的Intel i960CA与1987的AMD 29050处理器是第一个量产的单晶粒超纯量处理器。这些RISC系统的CPU使用超纯量架构,是由于当时RISC的设计的内核较简单,能够直接发送指令与调度多种功能性的单位(像是ALU)。这也是在八、九十年代RISC处理器比CISC处理器的运算速度更快的主要原因。
除了那些低功率CPU、嵌入式CPU、以及使用电池电源的CPU,1998年以后开发的CPU设计都已经是超纯量体系结构。第一种采用超纯量技术的x86处理器是Pentium。第一批采用了把CISC指令异步解码为微指令串行技术的处理器是Nx586、P6架构的Pentium Pro以及AMD K5。这使得被缓存的微指令可以动态调度(dynamic scheduling)运行,使得P6架构的并行性更优于P5架构的Pentium;这也使得预测运行(投机运行)更易实现,CPU的时脉也可以更高。
从纯量到超纯量
最简单的处理器是纯量处理器。该处理器运行每个指令通常会在一个时间内操作一个或两个数据项目。但相较之下,矢量处理器运行每个指令能够同时间运作很多数据项目。而超纯量处理器则是将纯量与矢量处理器混合起来。每个指令处理一个数据项目,但是有多个多余的处理器内的功能单位能同时处理额外独立的数据项目。
超纯量处理器设计强调增强指令发送的准确度,而且能够加强很多功能单位的利用度。这样当单位增加时性能增进就能很明显。当早期的超纯量CPU有两组ALU与一组FPU的时候,像PowerPC 970较先进的设计就内含四组ALU、二组FPU与一对单指令流多数据流单位。但如果调度器(dispatcher)效率低落,系统的性能将会拖累。
超纯量处理器的运行速度通常高于每周期一个指令。但同时处理多个指令不见得就是超纯量化,像是管线化CPU与多内核CPU,就是使用不同的方式,来达同时处理多个指令的目的。
而超纯量处理器的调度器从内存读取指令,而且决定要将哪些指令能够并行处理,将这些指令再调度到CPU内重复的功能单元。因而超纯量处理器可以想成它有多个平行的管线,这些管线可以平行处理一个线程中指令。
限制
超纯量的性能增进会被这三处限制住:
- 指令流中的本质并行度(degrees of intrinsic parallelism),也就是限制指令级平行的数量。
- 复杂又耗时的调度器的消耗时间与依赖性检查逻辑电路。
- 分支指令的处理
现有的二进制程序有不同的本质并行度。在部分指令中并不与其他指令互相关联而能同时运行。而另一部分指令就有相互关联:一个指令会影响其他指令的资源或结果。像是a=b+c ; d=e+f
这串指令,因为运算中并不会相互影响而能够并行运算。但是a=b+c ; d=a+f
这串指令就可能无法并行运行,是因为指令顺序中后面的指令需要前面的运算结果。
当同时发出指令的数量增加,依赖性检查的成本会大量增加。由于检查过程中需要CPU参与,这样会恶化CPU的处理效率。而此成本包含为了实现依赖性检查而增加的逻辑门,还有在这些逻辑门之间的时间延迟。而研究显示出逻辑门成本在某些状况下可能会高达,n是处理器的指令集数量,而k是同时发送的指令数量。在数学领域称之为排列组合问题。而即使该指令流并没有任何的指令依赖性,超纯量处理器还是要去检查,这样子才能确保结果不会错误。而无论半导体制程是多么进步,或是切换速度是多么的快,同时发送的指令数量还是有一个限制在。当更新进的制程允许更多的功能性单位内置其中(像是ALU),但是指令依赖性检查成长得太快以至于超纯量调度限制还是感觉很小,既使同时有五到六个指令同时调度进去。
然而即使将无限快的依赖性检查逻辑电路内置于超纯量CPU,如果指令流自己有很大的依赖性,这样还是可能会限制住性能。这样在源码流之间的本质平行度就会形成第二个限制。
替代技术
综合来说,这三个限制驱使研究转向其他的性能增进架构,例如超长指令字(VLIW)、显式并行指令计算(EPIC)、同步多线程(SMT)和多内核处理器。
在VLIW架构,繁重的指令相依性检查工作由运行时的硬件逻辑转移到编译器身上。而EPIC与VLIW相似,但多了缓存预取指令。
同步多线程通常缩写为SMT,目的是为了改进超纯量处理器的总体效率。此架构允许多个独立的线程更佳的利用现代处理器架构的资源。
超纯量处理器不同于多内核处理器之处,在于多余的功能单元无法构成完整的处理器。一个处理器由多个较细粒度的功能单元所组成,例如算术逻辑单元(ALU)、整数乘法器、整数字移器、浮点运算器等等。每个功能单元可能存在复数版本,使得多个指令能平行运行。此做法不同于多内核处理器,后者使用多个线程(一核一绪)同时地处理指令;也不同于管线化处理器 - 复数指令可以同时存在于不同的运行阶段,就像工厂装配线一样。
这些替代技术并非互斥,他们可以(经常是)被合并使用到单一处理器上。因此一颗多内核处理器可能是这样,每个内核包含复数个平行管线,每个管线都是超纯量。有些处理器还拥有矢量处理的能力。
内部链接
- Hyper-Threading
- 并行多任务
- 预测运行 / 及早求值
- 软件停滞,会出现于多处理器系统,由于超纯量的逻辑依赖性造成的现象。
参考书目
- Mike Johnson, Superscalar Microprocessor Design, Prentice-Hall, 1991, ISBN 0-13-875634-1
- Sorin Cotofana, Stamatis Vassiliadis, "On the Design Complexity of the Issue Logic of Superscalar Machines", EUROMICRO 1998: 10277-10284
- Steven McGeady, "The 1960CA SuperScalar Implementation of the 80960 Architecture", IEEE 1990, pp. 232-240
- Steven McGeady, et al., "Performance Enhancements in the Superscalar i960MM Embedded Microprocessor," ACM Proceedings of the 1991 Conference on Computer Architecture (Compcon), 1991, pp. 4-7