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)?
由于指令可以按任意顺序(乱序)完成,并且更多指令可以继续...有没有像公共数据总线在更多指令进入之前更新寄存器文件的阶段?我听说过使用了重新排序缓冲区,它基本上按顺序对指令进行排序(这必须意味着指令有某种标记)然后将寄存器结果提交回寄存器文件.
我很困惑的是寄存器重命名的实现,以及保留站的结构.
感谢您的任何帮助.
Tomasulo的算法实际上并不依赖于任何特定的硬件,事实上,在实际的机器中,寄存器重命名通常在指令插入指令队列之前发生.让我们来看几个基本点.首先,程序中表示的寄存器是逻辑寄存器.其次,实际的硬件寄存器称为物理寄存器.Tomasulo的算法只是一种将逻辑寄存器映射到物理寄存器的机制.在实际机器中,通常有两个表将逻辑寄存器映射到物理寄存器.一个在重命名阶段,一个在提交阶段.物理寄存器也必须多于逻辑寄存器.它基本上以这种方式工作:
关于保留站的部分实际上是无序管道的特定实现,并且基本上带有物理寄存器.有很多机器真的没有保留站的概念.
轩尼诗和帕特森关于计算机体系结构的书是关于这类内容的标准教科书.我试图尽可能简单地解释这一点,但实际上有数以千计的优化这些东西的建议.