指令级并行,为什么要进行流水线调度?

933 阅读1分钟

假设有如下两条语句:

a = b + c;
d = e * f;

会被转换成多条汇编指令,例如以下汇编指令实现了计算两个数相加、两个数相乘的功能:

ld r5,B(r0)
ld r4,A(r0)
dadd r3,r4,r5
sd r3,C(r0)
ld r6,D(r0)
ld r7,E(r0)
dmul r2,r6,r7
sd r2,F(r0)
halt

这些指令依次取出对应寄存器的数据,然后进行相应的运算,再将结果写入存放结果的寄存器,指令此时是有顺序的,其顺序也符合我们在写高级程序语言时的语句顺序。

现在使用 WINMIPS64 模拟CPU执行,流水图如下:

reranking1.jpg

分析结果:

reranking2.jpg

可以看到总共需要17个时钟周期,但仔细观察流水图,会发现其效率并不高,有的指令因为资源相关或数据相关而停顿,导致CPU空闲,利用率降低。

  • 资源相关:当有多条指令进入流水线后在同一时钟周期内争用同一功能部件所发生的冲突
  • 数据相关:当一条指令需要用到前面指令的执行结果,而前面的指令均在流水线中重叠执行,还未产生相应的结果。

通过对指令顺序的调整,可以解决部分冲突,提高利用率

下面对这些指令进行重排序:

reranking3.jpg

reranking4.jpg

通过指令重排序减少了3个时钟周期。 所以,通过对指令进行重排序,可以减少所需时钟周期、提升流水线效率。