下面是小编为大家整理的《计算机体系结构》第五次实验,WARWAWBTB实验(范文推荐),供大家参考。
WAR\WAW\BTB 实验 姓名:王宇航 学号:09283020WAR\WAW\BTB 实验一、实验目的:通过本实验,理解读后写、写后写数据相关以及转移目标缓冲方法。二、实验内容:1、用 WinMIPS64 模拟器执行一段循环程序(习题 3.4),采用 BTB 转移控制策略。指出程序每次迭代所需的时钟周期数和程序执行所需的总时钟周期数。2、设计产生 WAR、WAW 数据相关的程序段,并在 WinMIPS64 模拟器上执行。三、实验环境操作系统:Windows 7 旗舰版处理器:Intel(R) Core(TM) i5 双核内存:2.00GB软件:winmips64 模拟器四、实验过程:1 、分析 BTB 转移控制策略(1)BTB 转移控制策略BTB 即分支目标缓冲区转移控制策略处理分支指令的作用是为了最大限度地减少分支指令造成的延迟。其思想及实现方法为:BTB 可以看成是用专门的硬件实现的一张表,表中的每一项至少有两个字段:执行过的成功分支指令的地址和预测的分支目标地址。在每次取指令的同时,将指令地址与 BTB 中的所有项的第一个字段进行顺次比较。若在 BTB 中存在和该指令地址匹配的项,则可以确定该指令确实是分支指令且上一次分支成功,据此预测这次执行也将分支成功,将该匹配项中的第二个字段中的地址送给 PC 寄存器,从分支目标处开始取指令。若在 BTB 中不存在和该指令地址匹配的项,则把该指令当做普通的指令来执行。若预测正确,则不会有任何分支延迟;若预测错误或者在 BTB 中不存在匹配的项,则会有至少两个时钟周期的延迟,因为需要花费一个时钟周期停止取指令来更新 BTB 中的项,再花费一个时钟周期来取新的指令。(2)修改习题 3.4 的循环指令序列,使之可以在 WinMIPS64 模拟器上执行,修改后的指令序列如下:.data.textDADDI R2,R0,0DADDI R3,R0,396LOOP: LW R1,0(R2)DADDI R1,R1,1SW R1,0(R2)
DADDI R2,R2,4DSUB R4,R3,R2BNEZ R4,LOOPNOP(3)将该程序导入 WinMIPS64 模拟器,在模拟器菜单栏的 Configure 下,选中“EnableBranch Target Buffer”选项,即采用 BTB 转移控制策略。(4)按 F7 执行该程序,重点观察分支指令“BNEZ R4,LOOP”的执行,第一个循环周期如下图所示:可以看到,采用 BTB 转移控制策略后,分支指令“BNEZ R4,LOOP”在 IF 阶段将其 PC 值即该指令的地址送入指令存储器取指的同时,将指令地址与 BTB 中的所有项的第一个字段进行顺次比较。由于此时 BTB 为空,不存在和该分支指令地址匹配的项,所以就把该指令当做普通的指令来执行。下一个时钟周期,该指令进入 ID 段,其后的指令“NOP”开始取指。在 ID 段判断出该指令是分支指令并且计算出分支目标地址,但是在该分支指令“BNEZR4,LOOP”和上一条指令“DSUB R4,R3,R2 ”之间存在一个 RAW 冲突,引起一个 RAW 暂停,从而导致了结构冲突,使得其后一条指令“NOP”也无法在下一个时钟周期进行指令译码而必须暂停一个周期。再下一个时钟周期时,流水线停止取指用来更新 BTB,即将分支指令“BNEZ R4,LOOP”的地址和其成功分支的目标“LW R1,0(R2)”的地址分别作为 BTB 表中的第一个字段和第二个字段写入 BTB 中。然后便可以在下一个时钟周期中取分支目标指令来执行了。因此共造成了 3 个时钟周期的延迟。故第一个循环周期所需的时钟周期数为 10 个。下图是第二个循环周期,还是重点观察分支指令“BNEZ R4,LOOP”的执行。同样可以看到,分支指令“BNEZ R4,LOOP”在 IF 阶段将其指令地址送入指令存储器取指的同时,将指令地址与 BTB 中的所有项的第一个字段进行顺次比较。因为在第一个循环周期中已经将该分支指令的地址和其成功分支的目标地址写入了 BTB 中,因此 BTB 中必定存在和该指令地址匹配的项,从而在该分支指令进行 ID 段的同时流水线将 BTB 中匹配项的第二个字段即分支的目标地址送给 PC 寄存器,来取分支目标指令执行,不存在任何延迟。故第二个循环周期所需的时钟周期数为 7 个。下图是第三个循环周期,重点观察循环周期开始指令“LW R1,0(R2)”的执行。
在第三个循环周期中,分支指令的处理和第二个循环周期完全相同,只是在循环周期开始即“LW R1,0(R2)”取指时,比第二个循环周期多了一个暂停。因为第二个循环周期中在这里没有结构冲突,故取指后能顺利进入 ID 段;而在第三个循环周期中由于前一条指令“BNEZR4,LOOP”因 RAW 冲突引起的暂停导致了结构冲突,使“LW R1,0(R2)”不得不在 IF 段暂停一个时钟周期,因此会多出一个时钟周期,故第三个循环周期所需的时钟周期数为 8 个。第四至九十八循环周期和第三个循环周期执行过程完全相同,所需时钟周期数也均为 8个。下图是最后一个循环周期即第 99 个循环周期:可以看到,分支指令“BNEZ R4,LOOP”仍然根据 BTB 转移控制策略执行。因为存在匹配项,所以在该分支指令进行 ID 段时流水线将 BTB 中分支目标地址送给 PC 寄存器,并取分支目标指令。与此同时,该分支指令判断出当前分支条件不满足,分支失败。分支指令由于RAW 冲突将流水线暂停一个时钟周期后,流水线将继续停止一个时钟周期,用来更新 BTB,即从 BTB 中删除以分支指令“BNEZ R4,LOOP”的地址和其成功分支的目标“LW R1,0(R2)”的地址分别作为其两个字段的这一项。然后再取分支指令的后继指令“NOP”来执行,总共也造成了 3 个时钟周期的延迟。故最后一个循环周期执行完所需的时钟周期数为 14 个。综上可得,执行完 99 个循环所需的总时钟周期数为:10+7+8*96+14 = 799.2 、分析 WAR 、WAW 数据相关(1)设计产生 WAR、WAW 数据相关的程序段借鉴 Tomasulo 方法实验中的浮点指令程序段,稍作修改使其执行过程中会产生 WAR、WAW 数据相关。修改后的程序如下图所示:.data.textL.D F8,21(R3)L.D F4,16(R4)MUL.D F2,F4,F6SUB.D F10,F8,F4DIV.D F12,F2,F8ADD.D F8,F10,F4ADD.D F12,F10,F4NOP
结合 Tomasulo 方法实验可以知道:倒数第二条指令“ADD.D F8,F10,F4”和前一条指令“DIV.D F12,F2,F8”之间存在一个WAR 冲突,即 DIV.D 指令要读寄存器 F8 中的值,ADD.D 要写寄存器 F8 中的值,由于 DIV.D指令的执行时间比 ADD.D 指令长,ADD.D 指令可能会先于 DIV.D 指令完成,将执行结果写入寄存器 F8 中,导致 DIV.D 指令可能会读到修改后的 F8 的值。另外,“DIV.D F12,F2,F8”指令和最后的“ADD.D F12,F10,F4”指令之间存在一个 WAW冲突,即 DIV.D 指令要写寄存器 F12,ADD.D 指令也要写寄存器 F12,由于 DIV.D 指令的执行时间比 ADD.D 指令长,ADD.D 指令可能会先于 DIV.D 指令完成,写结果至寄存器 F12。若没有任何防范措施,当 DIV.D 指令完成后又会将其执行结果写至寄存器 F12,修改刚才的 ADD.D指令的执行结果,从而导致结果错误。(2)将该程序导入 WinMIPS64 模拟器,在模拟器菜单栏的 ConfigureArchitecture 中,设置各功能部件的执行时间,如右图所示:其中加/减法部件、乘法部件、除法部件的执行时间分别为 4 个时钟周期、7 个时钟周期、15 个时钟周期。(3)在 Configure 下,选中“Enable Forwarding”选项,即采用定向技术。(4)按 F7 执行该程序,执行结果如下图所示:“DIV.D F12,F2,F8”指令进入除法部件后,由于缺少操作数 F2 的值无法开始执行,等到前面的“MUL.D F2,F4,F6”指令计算出 F2 的值并通过定向技术送到该除法部件后,“DIV.DF12,F2,F8”指令才能够开始执行。在此之前,为了避免“DIV.D F12,F2,F8”指令读到错误的F8,和该指令存在 WAR 冲突的“ADD.D F8,F10,F4”指令即使操作数已经全部就绪也不能开始执行,必须插入 War 暂停,等待“DIV.D F12,F2,F8”指令开始执行后才能开始执行。以此来保证“DIV.D F12,F2,F8”指令不会因“ADD.D F8,F10,F4”指令先执行完而读到修改后的 F8,消除了 WAR 冲突。此外,当最后一条指令“ADD.D F12,F10,F4”进入加法部件时,其所需的操作数 F10和 F4 已经全部就绪,但因为此时和该指令存在 WAW 冲突的“DIV.D F12,F2,F8”指令还没有执行完,使得该指令必须插入 Waw 暂停,不能开始执行,就是为了避免因为“DIV.DF12,F2,F8”指令比“ADD.D F12,F10,F4”指令执行时间长而后执行完,会修改后一条指令的执行结果,造成结果错误。当“DIV.D F12,F2,F8”指令执行完毕后,“ADD.D F12,F10,F4”才可以开始执行,从而消除 WAW 冲突,保证结果的正确性。可见,WinMIPS64 模拟器是采用时钟周期暂停的方法来避免 WAR、WAW 数据相关的。五、实验总结:本次实验主要是借助 WinMIPS64 模拟器来理解读后写、写后写数据相关以及 BTB 转移控制方法。通过在 WinMIPS64 模拟器中执行带有分支指令的循环程序段,理解了使用 BTB转移控制策略处理分支指令的方法;在 Tomasulo 方法实验的基础上,通过在 WinMIPS64 模拟器中执行会产生 WAR、WAW 数据相关的浮点指令程序段,进一步掌握了 WAR、WAW 数据相关的知识。
推荐访问:WARWAWBTB实验 实验 体系结构 第五次