所以我试图理解用于无序指令执行的Tomasulo算法。这是我到目前为止所得到的:
指令按顺序获取并存储在指令队列中。
注册重命名会在接下来的某个地方发生......?据我所知,这是通过给寄存器提供标签来避免WAR / WAW危险。说你有 添加r1,r2,r3(1) 添加r3,r5,r6(2) 您有WAR危险,需要确保指令(1)在将其添加到r1之前读取旧值r3。所以我猜在指令队列(?)内硬件重命名寄存器,即 添加r1,r2,r3#1 添加r3#2,r5,r6 或类似的东西。
向保留站发出指令。据我所知,每个功能单元都有自己的一组预订站。但它是否就像在公共数据总线上有适当标记的操作数可用时执行该功能单元的指令队列(FIFO)?
由于指令可以按任意顺序完成(乱序),并且更多指令可以继续...有没有一个阶段,公共数据总线在更多指令进入之前更新寄存器文件?我听说过使用了重新排序缓冲区,它基本上按顺序对指令进行排序(这必须意味着指令有某种标记)然后将寄存器结果提交回寄存器文件。
我感到困惑的是寄存器重命名的实现以及保留站的结构。
感谢您的帮助。
答案 0 :(得分:5)
Tomasulo的算法实际上并不依赖于任何特定的硬件,实际上,在实际的机器中,寄存器重命名通常在指令插入指令队列之前发生。让我们来看几个基本点。首先,程序中表示的寄存器是逻辑寄存器。其次,实际的硬件寄存器称为物理寄存器。 Tomasulo的算法只是一种将逻辑寄存器映射到物理寄存器的机制。在实际机器中,通常有两个表将逻辑寄存器映射到物理寄存器。一个在重命名阶段,一个在提交阶段。物理寄存器也必须多于逻辑寄存器。它基本上以这种方式工作:
关于保留站的部分实际上是无序管道的特定实现,并且基本上带有物理寄存器。有很多机器真的没有预订站的概念。
Hennessy和Patterson关于计算机体系结构的书是关于这类内容的标准教科书。我试图尽可能简单地解释这一点,但实际上有数以千计的建议来优化这些东西。
答案 1 :(得分:0)
Tomasulo算法与重新排序缓冲区无关。 Tomasulo算法的目的是启用无序执行,而重新排序缓冲区的动机是实现精确的中断。
常见的寄存器重命名方案提供的物理寄存器比ISA需要的多。在这种情况下,在将指令馈送到指令队列之前,其架构寄存器(例如r5)的名称已被修改为物理寄存器(例如p19)。然而,Tomasulo算法使用另一种方法,其中指令的寄存器实际上“重命名”为部分的编号(部分可以是保留站或任何寄存器中的单个插槽/条目)。
您可以在此幻灯片中了解更多详情:
http://www.slideshare.net/onesuper/understanding-tomasolu-algorithm