Tomasulo算法:为IBM 360/91设计的,它采用的是寄存器重命名的方法来消除寄存器数据流之间的假相关,即用虚拟寄存器集代替真实的FPR,虚拟寄存器集在tomasulo算法中由每一功能单元所带的保留站(reservation station)、取数缓冲区(load buffers)和存数缓冲区(store buffers)组成。
Tomasulo算法的三段
1.Issue―从FP Op Queue中取出指令。
如果保留站空闲(无结构冒险),控制机制发射指令&发送操作数(对寄存器进行换名)。
2.Execution―对操作数执行操作(EX)
如果两个操作数都已就绪,就执行;如果没有就绪,就观测公共数据总线等待所需结果
3.Write result―完成执行(WB)
通过公共数据总线(CDB)将结果写入到所有等待的部件;标记保留站可用
IBM360/91的FPU分为加法器和乘除两个子功能单元。FLOS在两个功能单元的保留站有位置时将指令发生到相应保留站,并为输出分配相应重命名寄存器并标记,如果此时需要的源数据已经准备好则直接从相应寄存器送到保留站对应位置,等待功能单元空闲即运行,如果源数据没准备好,则在保留站对应区域设置指向该数据寄存器的指针,等数据准备好,则直接通过CDB总线送到保留站,而不需等待数据写回寄存器。
加上加法部件执行需要两个周期,乘除部件需要3个周期。
第一个周期,因为两个功能部件的保留站均有空闲位置,因此发射两条指令分别到两个功能单元,并设置好FLR相应标签位和为输出FLR分配重命名寄存器,这里因为x的源数据在FLR中已经准备好,所以直接将数据放入保留站相应位置,而w指令的源数据来源于R4,此时R4为忙,标签为x的输出对应保留站的ID=1,所以设置相应标签为1,即x指令对应的保留站号。
第二个周期,保留站有空位,仍然发射两条指令到相应位置。同样设置源操作数标签。为FLR4和FLR8设置标签和分配重命名寄存器。由于FLR4标签在前一个周期已经被设置从指向x,即1,需要更新为指向y,即2,即y指令的结果更新FLR4。该周期末,x执行完毕,计算结果通过CDB总线送到w和y指令的相应区域。
第三个周期,w和y开始执行。
第四个周期,y指令执行。
第五个周期,周期末,y执行完毕,数据通过CDB送到z指令,同时更新FLR。
第六个周期,指令x执行完毕,在总线CDB上广播,z和FLR2中相关标签命中,更新相应区域,z开始执行。z指令在低八个周期结束。
ps1:保留站的标签设置是根据FLR标签的值来设置的,在把指令发送到保留站时先设置源操作标签,再设置FLR标签。
ps2:采用这种算法,寄存器R4的内容在出现输出相关时可能漏掉中间数据,例如指令w的结果在R4中不会出现,因此存在不能精确异常定位问题。