5

所以我试图理解用于乱序指令执行的 Tomasulo 算法。这是我到目前为止所得到的:

  • 指令按顺序取出并存储在指令队列中。

  • 寄存器重命名发生在接下来的某个地方......?据我了解,这是通过给寄存器贴标签来避免 WAR/WAW 危险。假设您有 add r1,r2,r3 (1) add r3,r5,r6 (2) 您有 WAR 危险,需要确保指令 (1) 在将其添加到 r1 之前读取 r3 的旧值。所以我猜在指令队列(?)中,硬件会重命名寄存器,即 add r1,r2,r3#1 add r3#2,r5,r6 或类似的东西。

  • 向预订站发出指示。据我了解,每个功能单元都有自己的一套预约站。但是,当适当标记的操作数在公共数据总线上可用时,它是否类似于该功能单元执行的指令队列(FIFO)?

  • 由于指令可以以任意顺序(无序)完成,并且更多指令可以不断出现......是否存在公共数据总线在更多指令进入之前更新寄存器文件的阶段?我听说使用了重新排序缓冲区,它基本上按顺序对指令进行排序(这必须意味着指令具有某种标签),然后将寄存器结果提交回寄存器文件。

我感到困惑的是寄存器重命名的实现,以及保留站的结构。

感谢您的任何帮助。

4

2 回答 2

6

Tomasulo 的算法实际上与任何特定硬件无关,事实上,在真实机器中,寄存器重命名通常发生在指令插入指令队列之前。让我们了解几个基本点。首先,程序中表达的寄存器是逻辑寄存器。其次,实际的硬件寄存器称为物理寄存器。Tomasulo 的算法只是一种将逻辑寄存器映射到物理寄存器的机制。在真机中,一般有两个表将逻辑寄存器映射到物理寄存器。一个在重命名阶段,一个在提交阶段。物理寄存器也必须比逻辑寄存器多。它基本上是这样工作的:

  1. 对于每个逻辑输入,在重命名阶段映射表中查找以找出当前保存该逻辑寄存器值的物理寄存器。
  2. 对于每个逻辑输出,找到一个未使用的物理寄存器并将输出映射到它。更新重命名阶段映射表。如果没有可用的物理寄存器,请等到有一个可用。
  3. 在提交阶段,当一条指令被提交时,用新的映射覆盖指令逻辑输出的旧逻辑到物理映射。作为旧映射一部分的空闲物理寄存器。
  4. 如果出现错误预测(或管道中的任何类型的 squash),则提交阶段的表会覆盖重命名阶段的表,并且介于两者之间的管道中的所有内容都会被吹走。

关于保留站的部分实际上是乱序流水线的特定实现,并且本质上与物理寄存器一起出现。有很多机器并没有真正的预订站概念。

Hennessy 和 Patterson 的计算机体系结构书籍是这类东西的标准教科书。我试图尽可能简单地解释这一点,但实际上有成千上万的优化这些东西的建议。

于 2012-06-28T22:30:41.847 回答
1
  1. Tomasulo 算法与重新排序缓冲区无关。Tomasulo 算法的目的是启用乱序执行,而重新排序缓冲区的动机是实现精确中断。

  2. 通用寄存器重命名方案提供了比 ISA 需要的更多的物理寄存器。在这种情况下,在将指令送入指令队列之前,其架构寄存器的名称(例如 r5)已被修改为物理寄存器(例如 p19)。然而,Tomasulo 算法使用另一种方法,其中指令的寄存器实际上被“重命名”为零件的编号(零件可以是保留站中的单个插槽/条目或任何寄存器)。

您可以在此幻灯片中了解更多详细信息:

http://www.slideshare.net/onesuper/understanding-tomasolu-algorithm

于 2013-08-28T13:57:31.880 回答