Superscalar和VLIW
1. 多发射与超标量
程序的
C
P
U
执行时间
=
指令数
×
C
P
I
×
C
l
o
c
k
C
y
c
l
e
T
i
m
e
程序的 CPU 执行时间 = 指令数 \times CPI \times Clock Cycle Time
程序的CPU执行时间=指令数×CPI×ClockCycleTime
I
P
C
=
1
C
P
I
IPC = \frac{1}{CPI}
IPC=CPI1
如果 CPU 仍然只能在一个时钟周期里面,取一条指令,无论指令后续能优化得多好,一个时钟周期也只能执行这样的一条指令,CPI 只能是 1.
一个简单的方法,和增加 ALU一样增加用于取指令和指令译码的硬件,就可以进行并行。我们可以一次性从内存里面取出多条指令,然后分发给多个并行的指令译码器,进行译码,然后对应交给不同的功能单元去处理。这样在一个时钟周期里,能够完成的指令就不只一条,IPC 也就能做到大于 1 。
这种 CPU 的设计,叫做多发射(Multiple Issue)和超标量(Superscalar)。
多发射:同一个时间,可能会同时将多条指令发射(Issue)到不同的译码器或者后续处理的流水线中去。
超标量:本来在一个时钟周期里面,只能执行一个标量(Scalar)的运算。在多发射的情况下,就能够超越这个限制,同时进行多次计算。
2. 超长指令字设计
为了解决指令之间的依赖关系问题,超长指令字设计(Very Long Instruction Word)通过改进编译器来优化指令数。
编译器把没有依赖关系的代码位置进行交换,然后,再把多条连续的指令打包成一个指令包。CPU 在运行的时候,不再是取一条指令,而是取出一个指令包。然后,译码解析整个指令包,解析出指令直接并行运行。