问题
一个公式:
程
序
的
C
P
U
执
行
时
间
=
指
令
数
∗
C
P
I
∗
C
l
o
c
k
C
y
c
l
e
T
i
m
e
程序的CPU执行时间 = 指令数 * CPI * Clock Cycle Time
程序的CPU执行时间=指令数∗CPI∗ClockCycleTime
-
这个公式里,有一个叫做CPI的指标,CPI的倒数,又叫作 IPC(Instruction Per Clock),也就是一个时钟周期里面能够执行的指令树,代表了CPU的吞吐率。那么,在反复优化流水线架构的CPU里面,能够达到多少呢?
-
答案是:最佳情况下,IPC也只能到1。因为无论做了哪些流水线层面的优化,即使做到了指令执行层面的乱序执行,CPU仍然只能在一个时钟周期里面,取一条指令。
但是,我们现在用的Intel CPU 或者 ARM 的 CPU,一般的 CPI 都能做到 2 以上,这是怎么做到的呢?
- 指令的执行阶段:乱序执行的时候,是由很多个功能单元(FU)并行(Parallel)进行的。
- 取指令和指令译码也可以通过增加硬件的方式,同时并行执行:
- 我们可以一次性从内存里面取出多条指令,然后分发给多个并行的指令译码器,进行译码,然后对应交给不同的功能单元去处理。
这样,我们在一个时钟周期里,能够完成的指令就不只一条了。IPC 也就能做到大于 1 了
(从上图可以看出,不同的功能单元的流水线长度是不一样的。我们平时说的14级流水线,指的通常是进行整数计算指令的流水线长度。如果是浮点数运行,实际的流水线长度会更长一点)
这种 CPU 设计,我们叫作多发射(Mulitple Issue)和超标量(Superscalar)。
- 多发射:在同一个时间,可能会同时把多条指令发送到不同的译码器或者后继处理的流水线中去
- 超标量:
- 在超标量的CPU里面,有很多条并行的流水线,而不是只有一条流水线。
- “超标量”这个词是说,本来我们在一个时钟周期里面,只能执行一个标量(Scalar)的运算。在多发射的情况下,我们就能够超越这个限制,同时进行多次计算。
总结
- 超标量可以让CPU不仅在指令执行阶段是并行的,在取指令和指令译码的时候,也是并行的。通过超标量技术,可以使得CPU的IPC超过1
- 在 Intel 的 x86 的 CPU 里,从 Pentium 时代,第一次开始引入超标量技术,整个 CPU 的性能上了一个台阶。对应的技术,一直沿用到了现在。
- 超标量技术和流水线技术一样,依赖于在硬件层面,能够检测到对应的指令的先后依赖关系,解决“冒险”问题。所以,它也使得CPU 的电路变得更复杂了。