一、实验目的
- 熟悉Tomasulo模拟器
- 加深对Tomasulo算法的理解,从而理解指令级并行的一种方式-动态指令调度。
- 掌握在指令流出、执行、写结果各阶段,对浮点操作、load、store指令进行什么处理;
- 给定被执行代码片段,对于具体某个时钟周期,能够写出保留站、指令状态表、浮点寄存器状态表内容的变化情况。
二、实验说明
学习ScoreBoard和Tomasulo算法,并且进行Tomasulo算法的模拟实验,同时熟悉动态指令调度相关知识。
三、实验内容
1、Tomasulo算法模拟器
使用模拟器进行以下指令流的执行并对模拟器截图、回答问题
L.D F6, 21(R2)
L.D F2, 0 (R3)
MUL.D F0, F2, F4
SUB.D F8, F6, F2
DIV.D F10,F0, F6
ADD.D F6, F8, F2
题中假设浮点功能部件的延迟时间:加减法2个周期,乘法10个周期,load/store2个周期,除法40个周期。
0)设置指令和参数
下拉框选择相应操作和源、目的,执行时间修改为给定的延迟时间:
1)周期2、3的load部件
分别截图(当前周期2和当前周期3),请简要说明load部件做了什么改动
a)周期2:
说明:深色的区域表示最近一个时钟周期其内容发生了变化;
- 指令状态:
指令1开始执行;指令2流出
- 保留站:
没有运算指令,这里的保留站为空;
- 寄存器:
写入寄存器F2的保留站的站号为:Load2
- Load部件:
Load1:部件的地址寄存器设为R[R2]+21;
Load2:部件填入了指令2,Busy置位,地址寄存器设为立即数0;
b)周期3:
- 指令状态:
指令1执行完成;指令2开始执行;指令3流出;
- 保留站:
流出的指令3,操作为MULT.D,占用保留站Mult1;
源操作数是F2、F4;检查寄存器可知:
F2-Qj:保留站的站号为Load2;本指令需等Load2写回;【RAW】
F4-Vk:无保留站,直接读寄存器即可R[F4]
- 寄存器:
写入寄存器F0的保留站的站号为:Mult1
- Load部件:
Load1:从存储器读地址为R[R2]+21 的值,保存在Load1部件寄存器;
Load2:部件的地址寄存器设为R[R3]+0;
- 寄存器重命名:
- 一个新的指令流出,进入保留站之后,在寄存器中检查对应的操作数:
- 源操作数:寄存器–>保留站
- 非Busy:直接取值,填到本指令的保留站的Vj/Vk即可;
- Busy:使用该操作数寄存器的保留站Qi,填到本指令的保留站的Qj/Qk;
- 目的操作数:保留站–>寄存器
- 将本指令的保留站的站名,填到该操作数寄存器的保留站的Qi,并把Busy设为yes
- 源操作数:寄存器–>保留站
- 一个新的指令流出,进入保留站之后,在寄存器中检查对应的操作数:
2)MUL.D刚开始执行时系统状态
a)MUL.D开始执行的上一周期–周期5
这里其实周期5,指令2L.D F2,0(R3)
写回寄存器的时候,保留站中Add1
和Mult1
已经通过CDB得到了F2的值M2,但是需到周期6才开始执行。
b)MUL.D刚开始执行的周期–周期6(与周期5对比分析)
- 指令状态:
指令3、4开始执行;指令6流出
- 保留站:
流出的指令6,操作为ADD.D,占用Add2保留站;
源操作数是F8、F2;
检查寄存器可知:
F8-Qj:保留站的站号为Add1;本指令需等Add1写回;
F2-Vk:Load2已写回M2,直接取该值即可;
Time:表示相应的保留站还有要执行多少个时钟周期;
指令SUB.D和MUL.D开始执行,时间开始倒计时;
- 寄存器:
写入寄存器F6的保留站的站号,更改为Add2
这里其实有点问题:
寄存器既然已经写入了值M1/M2,应该把上面的Qi(Load1/Load2)删去;不过寄存器这一栏由于显示问题,下面还有一行Busy标志位,猜测只有当第二次写入才会覆盖Qi,只有当Busy有效时才使用Qi字段,否则使用寄存器值。
- Load部件:
无变化;
3)为什么MUL.D流出后没有立即执行
周期6的图中可以看到:
MUL.D流出是在周期3,而执行是在周期6;
原因是:MUL.D F0, F2, F4与指令2-L.D F2 0(R3)关于F2的写后读RAW
动态调度:按指令的操作数的可用性进行调度;
调度队列: 当指令需要等待操作数时,会被放置在调度队列中,直到所有操作数都可用。
作用:有效地隐藏RAW依赖的延迟,因为指令可以在操作数就绪后立即被调度执行;
4)15周期和16周期的系统状态
请分别截图(15周期和16周期的系统状态),并分析系统发生了哪些变化
a)15周期
- 指令状态:
指令3 MULT.D刚执行完成;
- 保留站:
Time:MUL.D还要执行的时钟周期数变为0
- 寄存器:
无操作,F0结果还未写回
- Load部件:
无操作
b)16周期
- 指令状态:
指令3 MULT.D写回;
- 保留站:
写回的指令3 MULT.D:保留站MULT1清空释放;
指令5 DIV.D-保留站MULT2:CBD将结果广播到指令DIV.D对应的保留站:
F0-Vj:接收CBD广播的Mult1的写回值M5;
F6-Vk:寄存器F6是周期5得到的M1
- 寄存器:
Mult1写入寄存器F0的值为M5;
- Load部件:
无操作
5)所有指令刚刚执行完毕的周期
回答所有指令刚刚执行完毕时是第多少周期,同时请截图(最后一条指令写CBD时认为指令流执行结束)
所有指令刚刚执行完毕时是第57周期
第56周期:DIV.D指令执行完毕;
第57周期:DIV.D指令写结果(最后一条指令写CBD)
2、思考题
1)Tomasulo算法、Score Board算法的异同
Tomasulo算法相比Score Board算法有什么异同?(简要回答两点:1.分别解决了什么相关问题,2.两者分别是分布式还是集中式)
-
Tomasulo算法
- WAR相关:在发射时就拷贝数据,贯彻数据流思想——“寄存器名字不重要,寄存器里的数据才重要”;
- WAW相关:只保存最新的写入值,既保证了正确的结果,又减少了不必要的写回操作;
- RAW相关:(与Score Board算法的同)用CDB总线实现了逻辑上的正确,都解决了写后读冒险;
- 结构相关:引入保留站,每条通路可以缓冲多条指令,平缓了指令发射的速度;
- 分布式 :指令状态、相关控制和操作数缓存分布在各个部件中(保留站);
-
Score Board算法
-
WAR相关:过度纠结寄存器名字,指令在执行之前一直检测的是寄存器堆,一旦数据准备好,就会从寄存器堆中取数;使得后序指令即使计算完结果也可能不能立刻写回寄存器堆;【tag广播】
-
WAW相关:过度纠结寄存器名字,会把所有指令的结果都写进寄存器堆,会因为写后写冒险阻塞指令发射;【停滞写回机制】
-
RAW相关:(与Tomasulo算法的同)用CDB总线实现了逻辑上的正确,都解决了写后读冒险;【停滞发射】
-
结构相关:每条通路只能存一条指令,导致经常有指令因为结构冒险而不能发射;
-
集中式:指令状态和相关控制都在记分牌处理;
-
2)Tomasulo算法如何解决结构冒险、RAW、WAR和WAW相关的数据冒险?
a)结构冒险
- 功能部件都完全流水化,有序访问存储器;
- 引入保留站,每条通路可以缓冲多条指令,平缓了指令发射的速度;
- 有结构冲突不发射;
b)RAW
- 原理:通过监测Common Data Bus,跟踪每个源操作数当前是否可用;
- 解释:
- 仅当所有源操作数可用时才允许指令进入执行阶段,否则等待;
L.D F6, 21(R2)
L.D F2, 0 (R3) ##
MUL.D F0, F2, F4 ##
SUB.D F8, F6, F2
DIV.D F10,F0, F6
ADD.D F6, F8, F2
c)WAR
-
原理:使用硬件寄存器重命名技术;
-
解释:
-
对于同一寄存器的两条指令,前者读该寄存器,后者写该寄存器;
-
前者指令:发射时就拷贝数据,贯彻数据流思想——“寄存器名字不重要,寄存器里的数据才重要”。
-
Busy为yes:标记上对应的指令的保留站编号,否则直接从寄存器取;
-
后者指令:写操作的目的寄存器和前者读的已经不同名
-
L.D F6, 21(R2)
L.D F2, 0 (R3)
MUL.D F0, F2, F4
SUB.D F8, F6, F2 ##
DIV.D F10,F0, F6
ADD.D F6, F8, F2 ##
前者SUB.D F8, F6, F2
的F6:直接从寄存器取
后者ADD.D F6, F8, F2
的F6
写操作的目的寄存器重命名,跟前者的F6不同
d)WAW
- 原理:使用硬件寄存器重命名技术;
- 解释:
- 只保存最新的写入值,既保证了正确的结果,又减少了不必要的写回操作
L.D F6, 21(R2)
L.D F2, 0 (R3)
MUL.D F0, F2, F4
SUB.D F8, F6, F2 ##
DIV.D F10,F0, F6
ADD.D F6, F8, F2 ##
前者SUB.D F8, F6, F2
的F6:直接从寄存器取
后者ADD.D F6, F8, F2
的F6
写操作的目的寄存器重命名,跟前者的F6不同
d)WAW
- 原理:使用硬件寄存器重命名技术;
- 解释:
- 只保存最新的写入值,既保证了正确的结果,又减少了不必要的写回操作
- 对于同一寄存器写的两个指令:后者对RS中该寄存器的保留站的写入会覆盖前者,故该寄存器只会响应后者完成时的广播CDB信号,使得最终寄存器的值是后者的写回值;