计算机

指令级并行

指令级并行(Instruction-level parallelism,ILP)指的是在指令层面实现并行计算,主要包括软件上的循环展开、硬件上的动态调度、分支预测等。

冒险

冒险包括结构冒险、数据冒险和控制冒险。

结构冒险

结构冒险可以通过将 L1 缓存分为数据 Cache 和指令 Cache,同时引入多个访问端口来解决。

数据冒险

当数据之间存在相关性时,可能会导致数据冒险。

数据相关包括 RAR、RAW、WAR、WAW。其中,RAR 不会导致数据冒险。

可以通过转发(前递,forward)来初步解决数据相关,但这并不能解决所有的问题。

控制冒险

控制冒险又叫分支冒险,指的是跳转(分支)目标不确定导致的后续指令无法确定。

指令调度

指令调度包括静态调度和动态调度。其中,静态调度由编译器优化决定,而动态调度在运行时实时由硬件调度指令的执行。

循环展开

循环展开:静态调度,由编译器决定。将多个循环写在一起,减少了控制冒险。

计分板

计分板允许我们乱序执行指令,包含以下四个阶段:

  • 发射:按序发射,当指令存在结构冒险、WAW 冒险时,暂停发射指令。此时,后续的指令也需要等待当前指令;
  • 读操作数:若有 RAW 冒险,说明此时结果未计算,等待结果后读操作数(计分板算法并未考虑转发);
  • 执行:做运算,向计分板通知指令完成;
  • 写回:将结果写入寄存器,此时需要确保没有 WAR 冒险,即确保没有其他指令正在读取这一寄存器。

计分板会记录已发射的指令位于哪一阶段、记录寄存器的状态、记录功能单元的状态。功能单元的状态使用 9 个字段进行标记。

特点:按序发射、乱序执行、乱序写回。

Tomasulo 算法

使用保留站(Reservation Stations,RS),保留站保存了所需的操作数及其他信息。指令中的寄存器被重命名,使用虚拟寄存器代替,数据存储在保留站中。保留站与功能部件之间的船体通过公共数据总线(Common Data Bus,CDB)。

Tomasulo 算法包含以下三步:

  • 发射(解包):在 FIFO 队列中获取下一个指令。如果 RS 可用(即 RS 仍有空闲空间,没有结构冒险),则发射指令。此时,若指令所需的操作数已经准备好,指令会立即执行,否则指令会等待。
  • 执行:当指令所需的操作数准备好时,将其存储在保留站中。如果操作数未准备好,会观察 CDB。
  • 写回结果:通过 CDB 将结果写入寄存器、保留站,此时监听。

保留站保存的信息:

  • Op:操作类型
  • Busy:是否占用

特点:按序发射、乱序执行、乱序写回。

优势:

  • CDB 可以实现广播消息,将一个结果传给多个功能单元;
  • 消除 WAW、WAR 冒险

分支预测与推测执行

分支预测

预测分支是否发射跳转。

现在的分支预测器往往通过硬件实现,基于分支的历史进行预测。

推测执行

在 Tomasulo 算法的基础上,引入重排序缓存(Reordered Buffer,ROB),使指令按序提交。

发射的指令按序保存在 ROB 中,执行完成后并不马上提交(即,不写入寄存器),但需要用到的数据可以传递。

遇到分支时,按分支预测的结果继续执行命令,但不提交,直到确认分支正确。若分支推测错误,则抛弃 ROB 中错误的指令。

BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表