计算机系统机构——Tomasulo算法实验报告
一、实验目的
- 加深对指令级并行性及其开发的理解。
- 加深对Tomasulo算法的理解。
- 掌握Tomasulo算法在指令流出、执行、写结果各阶段对浮点操作指令以及load和store指令进行什么处理。
- 掌握采用了Tomasulo算法的浮点处理部件的结构。
- 掌握保留站的结构。
- 给定被执行代码片段,对于具体某个时钟周期,能够写出保留站、指令状态表以及浮点寄存器状态表内容的变化情况。
二、 实验平台
实验平台采用Tomasulo算法模拟器。
三、实验内容及步骤
首先要掌握Tomasulo模拟器的使用方法。(见使用说明:点击模拟器中标题右侧的小圈)
1. 假设浮点功能部件的延迟时间为加减法2个时钟周期,乘法10个时钟周期,除法40个时钟周期,Load部件2个时钟周期。
(1)对于下面的代码段,给出当指令MUL.D即将确认时,保留站、load缓冲器以及寄存器状态表中的内容。
L.D F6, 24(R2)
L.D F2, 12(R3)
MUL.D F0, F2, F4
SUB.D F8, F6, F2
DIV.D F10, F0, F6
ADD.D F6, F8, F2
实验结果:
(a)保留站的内容、分析

此时,ADD.D和SUB.D已经执行完毕,所以Busy状态为“no”,Mult1和Mult2还未执行完毕,所以Busy状态为“yes”。
(b)寄存器状态表的内容,分析

ADD指令写结果D4到寄存器F6中,清空保留站中原来存放ADD指令的位置。MULT指令继续执行。
(2)按步进方式执行上述代码,利用模拟器的“向上箭头”(鼠标摸上去)的对比显示功能,观察每一个时钟周期前后各信息表中内容的变化情况。
周期1:取出第一条指令L.D F6, 24(R2),地址偏移量24写入LOAD部件中的LOAD1并且将LOAD1名存入寄存器字段F6中。

周期2:取出第二条指令L.D F2, 12(R3),地址偏移量12写入LOAD部件中的LOAD2并且将LOAD2名存入寄器字段F2中,同时第一条指令开始执行,LOAD1上写入绝对地址。 
周期3:取出第三条指令MUL.D F0, F2,F4,第一条指令完成取值并且准备在下一个时钟周期写入寄存器F6,第二条指令开始执行,LOAD2上写入绝对地址。同时,保留站中存入第三条指令待运算的操作数和操作,因为F2中内容需要Load,所以先写进保留站的Qj中,F4可以直接取就直接存进Vk中。寄存器F0中Qi写入保留站中待运算命令的名称。
周期4:取出第四条指令SUB.D F8,F6,F2,第二条指令执行完成,同时第一条指令完成写入结果D1到寄存器表F6中的值并在指令状态表中第一条指令填入写结果周期4。同样在保留站中存入第四条指令的待运算操作数和操作,F6是之前写入的值为D1所以存入Vj,F2是要等待Load的值尚未准备好所以存入Qk中为Load2,同时寄存器表中F8中Qi存入将要给它赋值的指令名称。Load部件中LOAD1行清空。

周期5:取出第五条指令DIV.D F10,F0,F6,第二条指令写结果M2到寄存器D2的值中,Load部件表中LOAD2行清空。同时,因为F2的值D2已经准备好了,所以在保留站中第一行的Qk转为Vk为D2,同理第四行。保留站中继续存入第五条指令的待运算操作数和操作,因为F0需要Mult1的值,所以保留站最后一行Qj先填入对应寄存器指令名称。

周期6:取出第六条指令ADD.D F6,F8,F2,因为所需数据都已经在之前的周期中写回结果,所以第三条和第四条指令在第六个周期开始执行并在指令状态中更新,相关的操作数和操作符被存入保留站,同理因为F8的结果正在由Sub执行,所以Qj先写为Sub所在的保留站Add1,同时在寄存器表中F6(第六条指令将要写入的寄存器)的改变Qi为指令执行的保留站号Add2。然后因为SUB和MULT都已经取到值了,可以开始执行了,就分别更新保留站之中的time列。
周期7:因为SUB只需2个周期就可以执行完,所以SUB的Time由上个周期的1变成2时就代表指令完成,故第四条SUB指令执行完成,更新指令状态,并且准备写入寄存器表中Qi为Add1的寄存器中,即F8。保留站中的MULT指令继续执行,DIV指令继续等待MULT。

周期8:SUB指令执行完后在下个周期写结果D4到寄存器F8,同时保留站Add1中存放的指令的位置清空,MULT条指令继续执行。因为F8也有了ADD所需要的数据,所以更新Add2中的Vj为D4。

周期9:ADD(第六条)指令开始执行。MULT指令继续执行。
周期10:ADD指令执行完成在下个周期准备写结果到F6,MULT指令继续执行。

周期11-15:ADD指令写结果D6到寄存器F6中,清空保留站中原来存放ADD指令的位置。MULT指令继续执行。

周期16-56:MULT指令写结果D3到寄存器F0,保留站中原来存放指令的位置清空。DIV指令开始执行,直到执行完毕。 


周期57:第五条指令执行结束后写结果D5到F10,保留站中原来存放指令的位置清空,执行完毕。

2. 对于与上面相同的延迟时间和代码段。
(1)给出在第3个时钟周期时,保留站的内容。
结果:
(a)保留站的内容、分析

第3个时钟周期时,MUL.D指令流出,保留站的Mult1的Busy状态为“yes”。
(b)寄存器状态表的内容,分析
取出第三条指令MUL.D F0, F2,F4,第一条指令完成取值并且准备在下一个时钟周期写入寄存器F6,第二条指令开始执行,LOAD2上写入绝对地址。同时,保留站中存入第三条指令待运算的操作数和操作,因为F2中内容需要Load,所以先写进保留站的Qj中,F4可以直接取就直接存进Vk中。寄存器F0中Qi写入保留站中待运算命令的名称。
(2)步进5个时钟周期,给出这时保留站、load缓冲器以及寄存器状态表中的内容。
实验结果:
(a)保留站的内容、分析 
第8个周期时,L.D和SUB.D3条指令执行完毕,其余3条未完成,所以保留站中仍有其他3条的信息。
(b)寄存器状态表的内容,分析
SUB指令执行完后在下个周期写结果D4到寄存器F8,同时保留站Add1中存放的指令的位置清空,MULT条指令继续执行。因为F8也有了ADD所需要的数据,所以更新Add2中的Vj为D4。
(3)再步进10个时钟周期,给出这时保留站、load缓冲器以及寄存器状态表中的内容。
实验结果:
(a)保留站的内容、分析

第18个周期时,只剩下DIV.D未执行完成,并且此时正处于执行等待阶段。
(b)寄存器状态表的内容,分析 
MULT指令写结果D3到寄存器F0,保留站中原来存放指令的位置清空。DIV指令开始执行,直到执行完毕。
问题
1、执行完6条指令最终用多少个周期?(给出计算步骤)
2+2+2+10+40+1=57
2、6条指令流出的顺序是什么?
指令1 L.D,指令2 L.D,指令4 SUB.D,指令6 ADD.D,指令3 MUL.D,指令5 DIV.D
3、上述指令中DIV.D F10,F0,F6和ADD.D F6,F8,F2 的WAR冲突是如何消除的?
保留站保存等待流出和正在流出所需要的操作数,实现了寄存器换名的功能,消除了WAR和WAW冲突。
3. 假设浮点功能部件的延迟时间为加减法3个时钟周期,乘法8个时钟周期,除法40个时钟周期。自己编写一段程序(要在实验报告中给出),重复上述步骤2的工作。



第3个时钟周期时,MUL.D指令流出,保留站的Mult1的Busy状态为“yes”。
取出第三条指令MUL.D F0, F2,F4,第一条指令完成取值并且准备在下一个时钟周期写入寄存器F12,第二条指令开始执行,LOAD2上写入绝对地址。同时,保留站中存入第三条指令待运算的操作数和操作,因为F2中内容需要Load,所以先写进保留站的Qj中,F10可以直接取就直接存进Vk中。寄存器F0中Qi写入保留站中待运算命令的名称。


第8个周期时,L.D的2条指令执行完毕,其余4条未完成,所以保留站中仍有其他4条的信息。

SUB指令执行完后在下个周期写结果D4到寄存器F0,同时保留站Add1中存放的指令的位置清空,MULT条指令继续执行。因为F0也有了ADD所需要的数据,所以更新Add2中的Vj为D4。


第18个周期时,只剩下DIV.D未执行完成,并且此时正处于执行等待阶段。

MULT指令写结果D5到寄存器F10,保留站中原来存放指令的位置清空。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)