了解Tomasulo算法

JDS*_*JDS 5 hardware computer-science computer-architecture

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

  • 指令按顺序获取并存储在指令队列中.

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

  • 指令发给保留站.据我所知,每个功能单元都有自己的一组预订站.但它是否就像在公共数据总线上有适当标记的操作数可用时执行该功能单元的指令队列(FIFO)?

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

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

感谢您的任何帮助.

Nat*_*ert 6

Tomasulo的算法实际上并不依赖于任何特定的硬件,事实上,在实际的机器中,寄存器重命名通常在指令插入指令队列之前发生.让我们来看几个基本点.首先,程序中表示的寄存器是逻辑寄存器.其次,实际的硬件寄存器称为物理寄存器.Tomasulo的算法只是一种将逻辑寄存器映射到物理寄存器的机制.在实际机器中,通常有两个表将逻辑寄存器映射到物理寄存器.一个在重命名阶段,一个在提交阶段.物理寄存器也必须多于逻辑寄存器.它基本上以这种方式工作:

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

关于保留站的部分实际上是无序管道的特定实现,并且基本上带有物理寄存器.有很多机器真的没有保留站的概念.

轩尼诗和帕特森关于计算机体系结构的书是关于这类内容的标准教科书.我试图尽可能简单地解释这一点,但实际上有数以千计的优化这些东西的建议.