体系结构实验(4)—— Tomasulo算法

Overcome RAW/WAR/WAW by Tomasulo Approach

1. Dlxview模拟器的使用

Execute ~\bin\f.s (f.d) or prim.s or code sequence you designed in dlxview simulator.

执行~ \ bin \ f。S (f.d)或prim.s或你在dlxview模拟器中设计的代码序列。

  1. 点击运行\bin 目录下的dlxwin.exe文件。
    在这里插入图片描述

  2. 点击进入configure,进行相关配置

在这里插入图片描述

  1. 选择Tomasulo 模拟算法

在这里插入图片描述

  1. 进入如下配置页面,选择不同指令占用的时钟周期。然后点击OK

在这里插入图片描述

  1. 点击Load 加载代码

在这里插入图片描述

  1. 选择需要加载的文件,并再次点击Load

在这里插入图片描述

  1. 加载完成,点击Done

在这里插入图片描述

  1. 点击step foward

在这里插入图片描述

  1. 选择内存的起始地址 (可以自定义或者选择默认的Default
    在这里插入图片描述

  2. 可以观察到如下的架构图
    在这里插入图片描述

  3. 点击Step Forword 执行指令

在这里插入图片描述

2. f.s 代码的执行和分析

Indicate when out-of-order execution or register renaming occurs.

指示何时发生乱序执行或寄存器重命名。

2.1 逐步分析

f.d 内容如下:

在这里插入图片描述

f.s 代码如下

	ld	f2, a         	 		 // f2=pi
	add	r1, r0, xtop  	 		 //  r1=28
loop:	ld	f0, 0(r1)	 		 // f0= 0(r1)   
	multd 	f4, f0, f2   		 // f4= f0*f2 = f0*pi
	divd	f10, f8, f0  		 // f10= f8/f0
	sd	0(r1), f4				// f4=0(r1)
	sub 	r1, r1,  #8          // r1=r1-8
	bnez	r1, loop             // 跳转继续执行      
	nop                          // 暂停
	trap	#0              	// 退出
  • ld f2, a : 从内存中将a的值加载到寄存器f2中

    • Cycle1 ld f2, a 指令的发射

      初始时,Integer units 缓冲器中有空间,因此指令进入发射阶段。并在Integer units 缓冲器中将其重命名为LD。并将F0对应的Qi 域置为Int1

    • Cylce2: ld f2, a 指令的执行

      指令从发射阶段进入到执行阶段,计算得到待存储数a的地址。

    • Cycle3: ld f2, a 结果的写回

      将结果写回到f2寄存器中
      在这里插入图片描述

  • add r1, r0, xtop

    • Cycle 4:add r1, r0, xtop 指令的发射

      Integer units 缓冲器中有空间,因此指令进入发射阶段。并在Integer units 缓冲器中将其重命名为ADDI。并将R0对应的Qi 域置为Int1

    • Cycle 5:add r1, r0, xtop 指令的执行

      将r0和xtop的值进行求和

    • Cycle 6:add r1, r0, xtop 指令的写回

      将结果写回到R1寄存器中
      在这里插入图片描述

  • loop: ld f0, 0(r1)

    • Cycle7: ld f0, 0(r1) 指令的发射

      Integer units 缓冲器中有空间,因此指令进入发射阶段。并在Integer units 缓冲器中将其重命名为LD。并将R0对应的Qi 域置为Int1

    • Cycle8: ld f0, 0(r1) 指令的执行

      指令从发射阶段进入到执行阶段,计算得到对应存储器的地址为R[R1]+0 ,并取出对应指令的值M[R[R1]+0]

    • Cycle9: ld f0, 0(r1) 指令的写回

      将上一步取出的值放入f0寄存器中。

在这里插入图片描述

  • multd f4, f0, f2

    • Cycle8: multd f4, f0, f2 指令的发射

      FP multipliers中有空闲缓冲区,因此发送该指令,并被重命令为mult1。 但是操作数f0 仍未算出,因此乘法保留站中Vj 为空,Qj 为int1 (需等待int1将f0的结果算出); 此时f2处于可用状态,因此乘法保留站中Vk=0.1415…, Qk =0 。

    • Cycle10-14:multd f4, f0, f2 指令的执行

      由于第9周期结束时,int1指令才能把f0的结果计算出,所以只能等到第9周期时,才能执行该乘法指令。

    • Cycle15:multd f4, f0, f2 指令的写回

      由于一开始设定的乘法指令需要5个时钟周期才能完成。因此第15个周期时才能将计算结果写回到f4中。

在这里插入图片描述

  • divd f10, f8, f0

    • Cycle 9 : divd f10, f8, f0 指令的发射

      FP multipliers中有空闲缓冲区,因此发送该指令,并被重命令为mult2。 此时乘法保留站中操作数f8可用,因此Vj=0.000,Qj为空。但是操作数f0等待int1指令写回f0的值,因此Vk为空,Qk为Int1。

      此时由于int1指令正在写回阶段,因此通过CDB总线(红色)广播f0的值。

    • Cycle 10-28 : divd f10, f8, f0 指令的执行

      FP multipliers 执行部件计算出结果除法的结果。由于一开始设定的乘法指令需要19个时钟周期才能完成。因此该过程的持续时间为cycle10-cycle28

    • Cycle 29 : divd f10, f8, f0 指令的写回

      第29个周期时才能将计算结果写回到f4中。

在这里插入图片描述

  • sd a(r1), f4

    • Cycle10: sd 0(r1), f4 指令的发送

      Integer units存在空闲缓冲区,因此此时将该存储指令存入保留站中,并重命名为sd。操作数r1可用,因此Vj=224 ; 但是操作数f4需要等到乘法指令mult2写回,因此Vk为空,Qk=mult2。

    • Cycle16: sd 0(r1), f4 指令的执行

      由于mult2指令在cycle15时才进行写回,因此在cycle16时, f4的操作数才可用。并在该周期计算得到存储器的对应的地址和该地址存放的数值。

    • Cycle17: sd a(r1), f4 指令的写回

      在该周期完成指令的写回,将a(r1)的值写入到f4中。

在这里插入图片描述

  • sub r1, r1, #8

    • Cycle 18 : sub r1, r1, #8 指令发送

      源操作数r1需要等待sd指令在cycle17写回后才能执行,因此在cycle18时,才开始发射指令。Integer units存在空闲缓冲区,因此此时将该存储指令存入保留站中,并重命名为int1。 此时可以得到r1的值,因此保留站中Vj=224,Qj 为空

    • Cycle 19 : sub r1, r1, #8 指令执行

      取操作数,并执行该减法

    • Cycle 20 : sub r1, r1, #8 指令写回

      将上一步的计算结果写回到r1中。

在这里插入图片描述

  • bnez r1, loop

    • Cycle21: bnez r1, loop 指令发送

      此时Integer units存在空闲缓冲区,因此此时将该存储指令存入保留站中,并重命名为int1。此时可以得到r1的值,因此保留站中Vj=216,Qj 为空。

    • Cycle22: bnez r1, loop 指令执行

      判断r1寄存器中的值是否为0, 如果不为0则发生跳转

    • Cycle23: bnez r1, loop 指令写回

      将新的PC值写入。
      在这里插入图片描述

  • nop

    • Cycle24: nop 指令的发送
    • Cycle25: nop 指令的执行
    • Cycle26: nop 指令的写回
      在这里插入图片描述
  • loop: ld f0, a(r1)

    • Cycle27 ld f0, a(r1) 指令的发射

      初始时,Integer units 缓冲器中有空间,因此指令进入发射阶段。并在Integer units 缓冲器中将其重命名为LD。并将F0对应的Qi 域置为Int1

    • Cylce28: ld f0, a(r1) 指令的执行

      指令从发射阶段进入到执行阶段,计算得到待存储数a的地址。

    • Cycle30: ld f0, a(r1) 结果的写回

      由于divd指令在cycle29时才完成指令的写回操作,同时该指令也用到的f0操作数。因此要等到Cycle30时,才能将结果写回到f0寄存器中

在这里插入图片描述

  • multd f4, f0, f2

    • Cycle 28: multd f4, f0, f2 指令的发射

      FP multipliers中有空闲缓冲区,因此发送该指令,并被重命令为mult1。 但是操作数f0 仍未算出,因此乘法保留站中Vj 为空,Qj 为int1 (需等待int1将f0的结果算出); 此时f2处于可用状态,因此乘法保留站中Vk=0.1415…, Qk =0 。

    • Cycle 31-35:multd f4, f0, f2 指令的执行

      由于第30周期结束时,int1指令才能把f0的结果计算出,所以只能等到第31个周期时,才能执行该乘法指令。

    • Cycle36:multd f4, f0, f2 指令的写回

      此第36个周期时才能将计算结果写回到f4中。

在这里插入图片描述

2.2 整体分析

不同指令类型耗时:

  • 整数运算, 加载,存储:1 cycles
  • 浮点加法:2 cycles
  • 浮点乘法:5 cycles
  • 浮点除法:19 cycles
编号指令运算类型(执行所需时钟周期数)发射执行写回
1ld f2, a加载(1 c)123
2add r1, r0, xtop 整数运算(1 c)456
3ld f0, 0(r1)加载(1 c)789
4multd f4, f0, f2浮点乘法(5 c)810-1415
5divd f10, f8, f0浮点除法(19 c)910-2829
6sd 0(r1), f4存储(1 c)101617
7sub r1, r1, #8整数运算(1 c)181920
8bnez r1, loop跳转指令(1 c)212223
9nop空指令(1 c)242526
10ld f0, 0(r1)加载(1 c)272830
11multd f4, f0, f2浮点乘法(5 c)2831-3536
  • 执行过程分析

    • 由于指令1-3都使用整数运算保留站,且该保留站只能存放一条指令记录,因此指令1-3必须等待前一个指令写回操作做完才能进行发射。

    • 指令4在指令3发射完就可以立即发射,因为指令4使用的是浮点乘法保留站,此保留站存在空闲。但是指令4和指令3关于f0发生了RAW冲突,因此必须等到指令3写回完成,指令4才可以执行。因此指令4的开始执行时间为cycle10.

    • 在cycle9时,浮点乘法保留站仍有空闲,因此指令5在指令4发射完就可以立即发射。在cycle10时,指令3已经写回了f0的值,因此在指令5的执行阶段不会与指令4发生RAW冲突

    • 在cycle10时,整数运算保留站仍有空闲,指令6在指令4发射完即可以发射。但是指令4和指令6关于f4发生了RAR冲突,因此必须等到指令4写回完成,指令4才可以执行。因此指令6的开始执行时间为cycle16.

    • 指令6,7,8,9, 10都使用整数运算保留站,且该保留站只能存放一条指令记录,因此指令6-10必须等待前一个指令写回操作做完才能进行发射。

    • 指令11在指令10发射完就可以立即发射,因为指令4使用的是浮点乘法保留站,此保留站存在空闲。但是指令11和指令10关于f0发生了RAW冲突,因此必须等到指令3写回完成,指令11才可以执行。因此指令4的开始执行时间为cycle31.

  • 乱序执行

    • 比如指令6,7, 8 在指令5之后发射,但是在指令5之前完成执行。说明了指令6,7,8 提前获得了所需的操作数,则可以先执行。因此是乱序执行的。
  • 寄存器重命名

    • 在上述执行过程中,如指令1被重命名为int1,指令4被重命名为mult1, 指令5被重命名为mult2等。

3. 解决WAR和WAW冒险

Find WAR and WAW hazards (or design it if not existed) and focus on how to overcome them by Tomasulo approach.

找到WAR和WAW冒险(或者设计它,如果不存在的话),并专注于如何通过Tomasulo方法克服它们

由于上述的f.s指令结构和运行设置导致在运行过程中并不能观察WAR和WAW冒险,因此采用重新设计代码的方式来观察Tomasulo方法克服WAR和WAW冒险方法。

在这里插入图片描述

序号指令运算类型(执行所需时钟周期数)发射执行写回
1multd f0,f2,f4浮点乘(5 c)12-67
2addd f2,f6,f8浮点加(2 c)23-45
3addd f2,f10,f14浮点加(2 c)34-56
4multd f6,f10,f8浮点乘(5 c)45-910
5nop空指令(1 c)567
6trap #0结束(1 c)678
  • 流程分析
    • 指令1和指令2之间关于f2存在WAR冒险,但是浮点乘法保留站将f2重命名为mul1, 并提前取出f2的值放入保留站中。因此指令2不需要任何等待,在cycle2发射指令完成后,顺次执行,且指令2的结束时间要早于指令1,即乱序执行
    • 指令2和指令3之间关于f2d存在WAW冒险,但是加法保留站将f2右重命名为add1, 后一个指令的写回结果并不影响前一个指令的写回结果,因此在指令3发射完成后,顺次执行。
    • 指令3和指令1之间关于f2存在WAR冒险,但是浮点乘法保留站将f2重命名为mul1, 并提前取出f2的值放入保留站中。因此指令3不需要任何额外的等待时间。
    • 指令4和指令2之间关于f6存在WAR冒险,但是浮点加法保留站将f6重命名为add1, 并提前取出f6的值放入保留站中。因此指令4不需要任何额外的等待时间。
  • 总结
    • 冒险检测和执行控制是分布的,每个功能单元保留站中的信息决定了一条指令何时可以开始执行
    • 结果直接从缓冲的保留站中通过CDB传递给功能单元,而不需要经过寄存器。
    • 在指令发射并开始等待源操作数之后,将使用一个保留站的编号来引用该操作数,这个保留站保存着对寄存器进行写操作的指令。如果使用一个未用保留站编号的值来引用该操作数,则表明操作数已经在寄存器中准备就绪。由于保留站的个数多于实际寄存器的数目,因此使用保留站编号对结果进行重命名,就可以避免WAW和WAR冒险。
    • 在Tomasulo算法中,采用顺序指令发射,但是只要当一条指令的操作数可用时就立即开始执行,因此会导致一些指令的发射顺序和完成顺序并不一致,即乱序完成。
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Tomasulo算法实验报告 课程名称:高级计算机系统结构 学号: 姓名: 指导教师: 日期:2011年12月8日 Tomasulo算法实验报告全文共5页,当前为第1页。 Tomasulo算法实验报告全文共5页,当前为第1页。 实验目的 加深对指令集并行性及开发的理解。 加深对Tomasulo算法的理解。 掌握Tomulo算法在指令流出、执行、写结果各阶段对浮点操作指令以及load和store指令进行什么处理。 掌握采用了Tomasulo算法的浮点处理部件的结构。 掌握保留站的结构。 给定被执行代码片段,对于具体某个时钟周期,能够写出保留站、指令状态表以及浮点寄存器状态表内容的变化情况。 实验平台 Tomasulo算法模拟器。 实验内容 1. 假设浮点功能部件的延迟时间为加减法2个周期,乘法10个时钟周期,除法40个时钟周期,load部件2个时钟周期。运行程序的代码段如下: 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 当指令MUL.D写结果时,保留站中内容如下表所示: 当指令MUL.D写结果时,load缓冲器中内容如下表所示: 当指令MUL.D写结果时,寄存器状态表中的内容如下表所示: 观察分析: 周期1:取出第一条指令L.D F6, 24(R2),地址偏移量24写入LOAD1,LOAD1名存入寄存器F6。 周期2:取出第二条指令L.D F2, 12(R3),地址偏移量12写入LOAD2,LOAD2名存入寄存器F2,同时第一条指令开始执行,LOAD1上写入绝对地址。 周期3:取出第三条指令MUL.D F0, F2,F4,第一条指令完成,第二条指令开始执行,LOAD2上写入绝对地址。保留站中存入待运算的操作数和操作。寄存器F0上QI写入保留站中待运算命令的名称。 Tomasulo算法实验报告全文共5页,当前为第2页。 周期4:取出第四条指令SUB.D F8,F6,F2,第二条指令执行完成,第一条指令写入结果M1到寄存器F6,保留站中存入第四条指令的待运算操作数和操作。LOAD1清空。 Tomasulo算法实验报告全文共5页,当前为第2页。 周期5:取出第五条指令DIV.D F10,F0,F6,第二条指令写结果M2到寄存器F2,LOAD2清空。保留站中存入第五条指令的待运算操作数和操作 周期6:取出第六条指令ADD.D F6,F8,F2,第三条和第四条指令开始执行,相关的操作数和操作符被存入保留站 周期7:第四条指令执行完成,保留站中的第三条指令继续执行。 周期8:第四条指令写结果M3到寄存器F8,保留站中存放第四条指令的位置清空,第三条指令继续执行。 周期9:第六条指令开始执行。第三条指令继续执行。 周期10:第六条指令执行完成,第三条指令继续执行。 周期11:第六条指令写结果M4到寄存器F6中,清空保留站中原来存放第六条指令的位置。第三条指令继续执行。 周期12~15:第三条指令继续执行,直到完成。 周期16:第三条指令写结果M5到寄存器F0,保留站中原来存放第三条指令的位置清空。 周期17~56:第五条指令开始执行,直到结束 周期57:第五条指令执行结束后写结果M6到F10,保留站中原来存放第五条指令的位置清空。 2. 对于与1相同的延迟时间和代码段 (1)在第3个时钟周期时,保留站内容如下表所示: 在第3个时钟周期时,load缓冲器内容如下表所示: 在第3个时钟周期时,寄存器状态表内容如下表所示: (2)步进5个时钟周期后,保留站内容如下表所示: Tomasulo算法实验报告全文共5页,当前为第3页。load缓冲器内容如下表所示: Tomasulo算法实验报告全文共5页,当前为第3页。 寄存器状态表中内容如下表所示: (3)再步进10个时钟周期后,保留站内容如下表所示: load缓冲器内容如下表所示: 寄存器状态表中内容如下表所示: 3. 浮点功能部件的延迟时间为加减法3个时钟周期,乘法8个时钟周期,除法40个时钟周期。load部件2个时钟周期。运行程序的代码段如下: L.D F12, 20(R5) L.D F2, 10(R6) MUL.D F6, F2,F10 SUB.D F0,F8,F2 DIV.D F10,F0,F12 ADD.D F8,F12,F2 在第3个时钟周期时,保留站内容如下表所示: load缓冲器内容如下表所示: 寄存器状态表中内容如下表所示: Tomasulo算法实验报告全文共5页,当前为第4页。 Tomasulo算法实验报告全文共5页,当前为第4页。 步进5个时钟周期后,保留站内容如下表所示: load缓冲器内容如下表所示: 寄存器状态表中内容如下表所示: 再步

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值