目录

指令级并行

2025-12-01

1 关键思想

如何通过各种可能的技术,获得更多更多的指令级并行性

2 执行的动态调度

  • 在程序的执行过程中,依靠专门硬件对代码进行调度,减少数据相关导致的停顿
  • 对指令的执行顺序重新安排,减少冲突停顿
    • 能处理一些在编译时情况不明的相关
  • 但是显著增加了硬件复杂性

2.1 基本思想

考虑如下一段代码

DIV.D F4,F0,F2
SUB.D F10,F4,F6
ADD.D F12,F6,F14

由于SUB.D与DIV.D指令关于F4相关,导致流水线停顿。然而,ADD.D由于指令必须按照顺序执行,也遭受了停顿。 所以,动态流水线的思想就是能够让各个指令不按顺序地执行。

于是我们采用了两个阶段进行译码:

  1. IS : Issue指令译码,检查是否存在结构冲突
  2. RO : Read Operands 等待数据冲突消失,然后读操作数。

然而,在采用了上述方式之后,会有新的冲突可能出现:

  1. WAR冲突,下一条指令要写的寄存器和上一个寄存器要读的指令相同
  2. WAW冲突,两条指令要对同一个寄存器写

2.2 Tomasulo 算法

使用寄存器换名的办法消除WAR和WAW冲突

例如以下代码:

DIV.D F0,F2,F4
ADD.D F6,F0,F8
S.D   F6,0(R1)
SUB.D F8,F10,F14
MUL.D F6,F10,F8

这个时候引入两个临时寄存器S和T

DIV.D F0,F2,F4
ADD.D S,F0,F8
S.D   S,0(R1)
SUB.D T,F10,F14
MUL.D F6,F10,T

简要的说,译码器像一个工头一样把任务分给不同的部件去执行,然而,有些时候,这些部件不会拿到全部的生产资料,需要等待别人为它生产。他们便会留好已经给出的生产资料,等到所有的生产资料凑齐了,再进行生产。译码器可以无限制地分发任务,但是受限于工人的能力限制,工人同时能够保存的生产现场是有限的。例如,一个加法器只能保存3个生产现场,多了之后只能阻塞等待重新执行。

2.3 指令动态预测

BHT算法

连续两次预测分支成功失败,那就预测分支失败 连续两次预测分支失败失败,那就预测分支成功

指令按照乱序流出,但是遇到分支预测的时候,要按照顺序确认。并且在指令被确认之前,不允许它进行不可恢复的操作,如更新机器状态或发生异常。