WAR\WAW\BTB实验姓名:王宇航学号:09283020WAR\WAW\BTB实验一、实验目的:通过本实验,理解读后写、写后写数据相关以及转移目标缓冲方法。二、实验内容:1、用WinMIPS64模拟器执行一段循环程序(习题3.4),采用BTB转移控制策略。指出程序每次迭代所需的时钟周期数和程序执行所需的总时钟周期数。2、设计产生WAR、WAW数据相关的程序段,并在WinMIPS64模拟器上执行。三、实验环境操作系统:Windows7旗舰版处理器: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.textDADDIR2,R0,0DADDIR3,R0,396LOOP:LWR1,0(R2)DADDIR1,R1,1SWR1,0(R2)DADDIR2,R2,4DSUBR4,R3,R2BNEZR4,LOOPNOP(3)将该程序导入WinMIPS64模拟器,在模拟器菜单栏的Configure下,选中“EnableBranchTargetBuffer”选项,即采用BTB转移控制策略。(4)按F7执行该程序,重点观察分支指令“BNEZR4,LOOP”的执行,第一个循环周期如下图所示:可以看到,采用BTB转移控制策略后,分支指令“BNEZR4,LOOP”在IF阶段将其PC值即该指令的地址送入指令存储器取指的同时,将指令地址与BTB中的所有项的第一个字段进行顺次比较。由于此时BTB为空,不存在和该分支指令地址匹配的项,所以就把该指令当做普通的指令来执行。下一个时钟周期,该指令进入ID段,其后的指令“NOP”开始取指。在ID段判断出该指令是分支指令并且计算出分支目标地址,但是在该分支指令“BNEZR4,LOOP”和上一条指令“DSUBR4,R3,R2”之间存在一个RAW冲突,引起一个RAW暂停,从而导致了结构冲突,使得其后一条指令“NOP”也无法在下一个时钟周期进行指令译码而必须暂停一个周期。再下一个时钟周期时,流水线停止取指用来更新BTB,即将分支指令“BNEZR4,LOOP”的地址和其成功分支的目标“LWR1,0(R2)”的地址分别作为BTB表中的第一个字段和第二个字段写入BTB中。然后便可以在下一个时钟周期中取分支目标指令来执行了。因此共造成了3个时钟周期的延迟。故第一个循环周期所需的时钟周期数为10个。下图是第二个循环周期,还是重点观察分支指令“BNEZR4,LOOP”的执行。同样可以看到,分支指令“BNEZR4,LOOP”在IF阶段将其指令地址送入指令存储器取指的同时,将指令地址与BTB中的所有项的第一个字段进行顺次比较。因为在第一个循环周期中已经将该分支指令的地址和其成功分支的目标地址写入了BTB中,因此BTB中必定存在和该指令地址匹配的项,从而在该分支指令进行ID段的同时流水线将BTB中匹配项的第二个字段即分支的目标地址送给PC寄存器,来取分支目标指令执行,不存在任何延迟。故第二个循环周期所需的时钟周期数为7个。下图是第三个循环周期,重点观察循环周期开始指令“LWR1,0(R2)”的执行。在第三个循环周期中,分支指令的处理和第二个循环周期完全相同,只是在循环周期开始即“LWR1,0(R2)”取指时,比第二个循环周期多了一个暂停。因为第二个循环周期中在这里没有结构冲突,故取指后能顺利进入ID段;而在第三个循环周期中由于前一条指令“BNEZR4,LOOP”因RAW冲突引起的暂停导致了结构冲突,使“LWR1,0(R2)”不得不在IF段暂停一个时钟周期,因此会多出一个时钟周期,故第三个循环周期所需的时钟周期数为8个。第四至九十八循环周期和第三个循环周期执行过程完全相同,所需时钟周期数也均为8个。下图是最后一个循环周期即第99个循环周期:可以看到,分支指令“BNEZR4,LOOP”仍然根据BTB转移控制策略执行。因为存在匹配项,所以在该分支指令进行ID段时流水线将BTB中分支目标地址送给PC寄存器,并取分支目标指令。与此同时,该分支指令判断出当前分支条件不满足,分支失败。分支指令由于RAW冲突将流水线暂停一个时钟周期后,流水线将继续停止一个时钟周期,用来更新BTB,即从BTB中删除以分支指令“BNEZR4,LOOP”的地址和其成功分支的目标“LWR1,0(R2)”的地址分别作为其两个字段的这一项。然后再取分支指令的后继指令“NOP”来执行,总共也造成了3个时钟周期的延迟。故最后一个循环周期执行完所需的时钟周期数为14个。综上可得,执行完99个循环所需的总时钟周期数为:10+7+8*96+14=799.2、分析WAR、WAW数据相关(1)设计产生WAR、WAW数据相关的程序段借鉴Tomasulo方法实验中的浮点指令程序段,稍作修改使其执行过程中会产生WAR、WAW数据相关。修改后的程序如下图所示:.data.textL.DF8,21(R3)L.DF4,16(R4)MUL.DF2,F4,F6SUB.DF10,F8,F4DIV.DF12,F2,F8ADD.DF8,F10,F4ADD.DF12,F10,F4NOP结合Tomasulo方法实验可以知道:倒数第二条指令“ADD.DF8,F10,F4”和前一条指令“DIV.DF12,F2,F8”之间存在一个WAR冲突,即DIV.D指令要读寄存器F8中的值,ADD.D要写寄存器F8中的值,由于DIV.D指令的执行时间比ADD.D指令长,ADD.D指令可能会先于DIV.D指令完成,将执行结果写入寄存器F8中,导致DIV.D指令可能会读到修改后的F8的值。另外,“DIV.DF12,F2,F8”指令和最后的“ADD.DF12,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下,选中“EnableForwarding”选项,即采用定向技术。(4)按F7执行该程序,执行结果如下图所示:“DIV.DF12,F2,F8”指令进入除法部件后,由于缺少操作数F2的值无法开始执行,等到前面的“MUL.DF2,F4,F6”指令计算出F2的值并通过定向技术送到该除法部件后,“DIV.DF12,F2,F8”指令才能够开始执行。在此之前,为了避免“DIV.DF12,F2,F8”指令读到错误的F8,和该指令存在WAR冲突的“ADD.DF8,F10,F4”指令即使操作数已经全部就绪也不能开始执行,必须插入War暂停,等待“DIV.DF12,F2,F8”指令开始执行后才能开始执行。以此来保证“DIV.DF12,F2,F8”指令不会因“ADD.DF8,F10,F4”指令先执行完而读到修改后的F8,消除了WAR冲突。此外,当最后一条指令“ADD.DF12,F10,F4”进入加法部件时,其所需的操作数F10和F4已经全部就绪,但因为此时和该指令存在WAW冲突的“DIV.DF12,F2,F8”指令还没有执行完,使得该指令必须插入Waw暂停,不能开始执行,就是为了避免因为“DIV.DF12,F2,F8”指令比“ADD.DF12,F10,F4”指令执行时间长而后执行完,会修改后一条指令的执行结果,造成结果错误。当“DIV.DF12,F2,F8”指令执行完毕后,“ADD.DF12,F10,F4”才可以开始执行,从而消除WAW冲突,保证结果的正确性。可见,WinMIPS64模拟器是采用时钟周期暂停的方法来避免WAR、WAW数据相关的。五、实验总结:本次实验主要是借助WinMIPS64模拟器来理解读后写、写后写数据相关以及BTB转移控制方法。通过在WinMIPS64模拟器中执行带有分支指令的循环程序段,理解了使用BTB转移控制策略处理分支指令的方法;在Tomasulo方法实验的基础上,通过在WinMIPS64模拟器中执行会产生WAR、WAW数据相关的浮点指令程序段,进一步掌握了WAR、WAW数据相关的知识。