3DRX

// post

指令级并行

第五章

Updated

相关与指令级并行

指令调度

  • 静态调度
    • 依靠编译器对代码进行静态调度,以减少相关和冲突。
    • 它不是在程序执行的过程中、而是在编译期间进行代码调度和优化。
    • 通过把相关的指令拉开距离来减少可能产生的停顿。
  • 动态调度
    • 在程序的执行过程中,依靠专门硬件对代码进行调度,减少数据相关导致的停顿。
      • 能够处理一些在编译时情况不明的相关(比如涉及到存储器访问的相关),并简化了编译器;
      • 能够使本来是面向某一流水线优化编译的代码在其它的流水线(动态调度)上也能高效地执行。
    • 以硬件复杂性的显著增加为代价

动态调度算法

Tomasulo 算法

https://www.xinhecuican.tech/post/baebc2bf.html

核心思想

  • 记录和检测指令相关,操作数一旦就绪就立即执行,把发生 RAW 冲突的可能性减少到最小。
  • 通过寄存器换名来消除 WAR 冲突和 WAW 冲突。

部件

  • 指令队列
  • store 缓冲器
  • load 缓冲器
  • 加法保留站
  • 乘法保留站
  • 浮点寄存器
  • 公共数据总线 CDB

保留站

  • Busy: 为 yes 表示本保留站或缓冲单元忙
  • Op: 要对源操作数进行的操作
  • Vj/Vk: 源操作数的值
  • Qj/Qk: 将产生源操作数的保留站号(对于一个操作数,V, Q 只会有一个)
  • A: 仅 load 和 store 有,存放指令中的立即数。

Qi 寄存器状态表

  • 用于存放将把结果写入该寄存器的保留站的站号
  • 为 0 表示当前没有正在执行的指令要写入该寄存器,即其内容就绪

习题

对于下述指令

L.D F6, 34(R2)
L.D F2, 45(R3)
MUL.D F0, F2, F4
SUB.D F8, F2, F6
DIV.D F10, F0, F6
ADD.D F6, F8, F2

给出第一条指令执行完成时各个表中的状态

指令流出执行写结果
L.D F6, 34(R2)
L.D F2, 45(R3)
MUL.D F0, F2, F4
SUB.D F8, F2, F6
DIV.D F10, F0, F6
ADD.D F6, F8, F2

保留站

名称BusyOpVjVkQjQkA
Load1no
Load2yesLD45+Regs[R3]
Add1yesSUBMem[34+Regs[R2]]Load2
Add2no
Add3no
Mult1yesMULReg[F4]Load2
Mult2no

寄存器状态表

F0F2F4F6F8F10F30
QiMulti1Load2Add1