网站首页轮播,商用高端网站设计新感觉建站,ppt模板大全app,哈尔滨企业建站模板2.1 实验目的
加深对计算机流水线基本概念的理解#xff1b;
理解MIPS结构如何用5段流水线来实现#xff0c;理解各段的功能和基本操作#xff1b;
加深对结构冲突/数据冲突/控制冲突的理解#xff1b;
进一步理解解决数据冲突的方法#xff0c;掌握如何应用定向技术来…2.1 实验目的
加深对计算机流水线基本概念的理解
理解MIPS结构如何用5段流水线来实现理解各段的功能和基本操作
加深对结构冲突/数据冲突/控制冲突的理解
进一步理解解决数据冲突的方法掌握如何应用定向技术来减少数据冲突引起的停顿并加深对指令调度技术和延迟分支技术的理解
2.2 实验平台
实验平台采用指令级和流水线操作级模拟器MIPSsim。
2.3 实验内容
阅读理解课件第3章的“3.4节 流水线的相关与冲突”97屏-127屏。
1启动MIPSsim选择“配置-流水方式”选项使模拟器工作在流水方式下。
2观察分析结构冲突对CPU性能的影响
加载样例程序structure_hz.s执行该程序用连续执行方式。分析结构冲突的原因记录结构冲突引起的停顿时钟周期数。注模拟器中浮点加法执行段时间默认6个周期
把浮点加法器的个数改为6个配置-常规配置-浮点加法器个数 改为6再重复上一步的工作。总结解决结构冲突的方法。 结构冲突在流水线处理机中某种指令组合因为资源冲突而不能正常执行。
导致此结构冲突的原因资源份数不够。
在该流水线中只有一个加法器导致下一条指令在第三周期执行加法操作时加法器被第一条加法指令占用此时只能等待第一条指令加法操作执行完毕让出加法器。 可见结构冲突引起的停顿时钟周期数为35。
而当我们将浮点加法器的个数改为6个时再次执行程序。 可见结构冲突引起的停顿时钟周期数为0成功解决了结构冲突问题。
3观察数据冲突并用定向技术来减少停顿
数据冲突当相关的指令彼此靠得足够近时它们在流水线中的重叠执行或者重新排序会改变指令读/写操作数的顺序使之不同于它们串行执行时的顺序则发生了数据冲突。
(a)
全部复位加载data_hz.s关闭定向功能“配置-定向”无对勾单步执行该程序查看时钟周期图记录分析在什么时刻发生了RAW写后读冲突只需运行到第一条分支指令BGTZ $r4, loop执行完。记录数据冲突引起的停顿时钟周期数可在统计窗口查看到。
1. 因为指令LW在第三个周期需要读取r2寄存器中的数据而第一条指令ADDIU在第四周期才会进行到写回周期WB在第四周期前半将相加后的结果写入r2之中所以LW指令需要等到第四周期才能执行指令译码/读寄存器周期ID在第四周期后半读r2寄存器中的数据。 2-3. 因为指令ADD在第五个周期需要读r1寄存器中的数据而指令LW在第七周期才会进行到写回周期WB在第七周期前半将值写入r1之中所以ADD指令需要等到第七周期才能执行指令译码/读寄存器周期ID在第七周期后半读r1寄存器中的数据。 4-5. 因为指令SW在第八个周期需要读r1寄存器中的数据而指令ADD在第十周期才会进行到写回周期WB在第十周期前半将值写入r1之中所以SW指令需要等到第十周期才能执行指令译码/读寄存器周期ID在第十周期后半读r1寄存器中的数据。 6-7. 因为指令ADDI在第十二个周期需要读r5寄存器中的数据而指令LW在第十四周期才会进行到写回周期WB在第十四周期前半将值写入r5之中所以ADDI指令需要等到第十四周期才能执行指令译码/读寄存器周期ID在第十四周期后半读r5寄存器中的数据。 8-9. 因为指令SUB在第十六个周期需要读r3、r2寄存器中的数据而指令ADDI在第十八周期才会进行到写回周期WB在第十八周期前半将值写入r2之中所以SUB指令需要等到第十八周期才能执行指令译码/读寄存器周期ID在第十八周期后半读r2寄存器中的数据。 10-11. 因为指令BGTZ在第十九个周期需要读r4寄存器中的数据而指令SUB在第二十一周期才会进行到写回周期WB在第二十一周期前半将值写入r4之中所以BGTZ指令需要等到第二十一周期才能执行指令译码/读寄存器周期ID在第二十一周期后半读r4寄存器中的数据。 12. 同2-3.
总结
可以看到RAW停顿在第0-24周期之间一共发生了12次。 (b)
打开定向功能单步执行查看时钟周期图分析定向功能使用后减少了多少数据停顿分析每一处定向为何要如此实现并分析在什么时刻还有RAW停顿未消除原因是什么只需运行到第一条分支指令BGTZ $r4, loop执行完。
原1. 指令LW在第三个周期需要读取r2寄存器中的数据而第一条指令ADDIU在第三周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被送至LW指令的ALU的入口处减少了停顿的发生。 原2-3.1.-load停顿 因为指令ADD在第四个周期需要读r1、r3寄存器中的数据而指令LW在第五周期访存周期MEM才会得到r1中的结果所以ADD指令需要等到第五周期才能执行指令译码周期ID。 可以看到指令LW在第五周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被送至ADD指令的ALU的入口处减少了停顿的发生。 原4-5. 指令SW需要将寄存器r1中的数值存入存储器中指令ADD在第七周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至SW指令的MEM段的入口处减少了停顿的发生。 另外LW指令需要从寄存器r1中取出数值指令ADD在第七周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值也会被直接送至LW指令的EX段的入口处减少了停顿的发生。
原6-7.2.-load停顿 指令ADDI需要取出r5中的值指令LW在第九周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至ADDI指令的EX段的入口处所以ADDI指令需要等待一个周期。 原8-9. 指令SUB需要取出r3、r2中的值指令ADDI在第十一周期EX段执行完之后EX段和MEM段之间的流水寄存器中保存的数值将会被直接送至SUB指令的EX段的入口处减少了停顿的发生。 原10-11.3. 指令BGTZ需要取出r4中的值并将其与0作比较指令SUB在EX段执行完之后EX段和MEM段之间的流水寄存器中保存的数值将会被直接送至BGTZ指令的ID段的入口处所以BGTZ指令需要等待一个周期。 总结
可以看到定向功能减少了9次数据停顿一共发生了三次RAW停顿其中有两次为load停顿。 用指令调度技术解决流水线中的数据冲突
全部复位在MIPSsim中载入schedule.s样例程序。
(a)
打开定向功能执行该程序用连续执行方式分析哪几个地方还有数据冲突停顿记录程序执行的总时钟周期数。 连续执行之后可以看到一共发生了三次RAW停顿。
1. 指令ADD需要取出r0、r2中的值指令LW在第四周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至ADD指令的EX段的入口处所以ADD指令需要等待一个周期。 2. 指令ADD需要取出r6、r1中的值指令LW在第八周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至ADD指令的EX段的入口处所以ADD指令需要等待一个周期。 3. 指令MUL需要取出r20、r14中的值指令LW在第十五周期MEM段执行完之后MEM段和WB段之间的流水寄存器中保存的数值将会被直接送至MUL指令的EX段的入口处所以MUL指令需要等待一个周期。 总结
程序执行的总时钟周期数为20。 (b)
自己采用调度技术对schedule.s程序进行指令调度自己修改源程序完全消除数据冲突。将调度修改后的程序重新命名为afer-schedule.s。
afer-schedule.s
.text
main:
ADDIU $r1,$r0,A
LW $r2,0($r1) SW $r4,0($r1)
ADD $r4,$r0,$r2 LW $r6,4($r1) MUL $r12,$r10,$r1
ADD $r8,$r6,$r1 ADD $r16,$r12,$r1
ADD $r18,$r16,$r1
SW $r18,16($r1)
LW $r20,8($r1) MUL $r24,$r26,$r14
MUL $r22,$r20,$r14 TEQ $r0,$r0
.data
A:
.word 4,6,8
(c)
CPU复位载入afer-schedule.s执行该程序记录程序执行的总时钟周期数。
指令调度前 指令调度后
连续执行可见已完全消除数据冲突时钟周期数为17相比指令调度前执行周期总数少了3。 总结
指令调度可以通过在编译时让编译器重新组织指令顺序来消除冲突。仅改变了指令执行的顺序使得本来需要等待的指令后执行在不影响整体程序的执行结果的同时让无需等待的指令先执行使得后执行的指令无需等待达到了减少数据冲突的目的使指令的平均执行周期减少了性能因此而提高了。
5) 用延迟分支技术延迟槽减少分支指令对性能的影响
a
全部复位在MIPSsim中载入branch.s样例程序关闭延迟槽功能执行该程序用连续执行方式记录发生分支延迟的时刻记录该程序执行的总时钟周期数。 连续执行之后可以看到一共有两条分支指令其中分支成功1条分支失败一条。共发生两个周期的控制冲突。执行周期总数为38。
1. 一旦流水线的译码段ID检测到分支指令第17周期就暂停其后的所有指令的执行直到确定是否成功并计算出新的PC值然后按照新的PC值取指第18周期。 2. 一旦流水线的译码段ID检测到分支指令第32周期就暂停其后的所有指令的执行直到确定是否成功并计算出新的PC值然后按照新的PC值取指第33周期。 b
对branch.s程序进行指令调度自己修改源程序使用从前调度法将调度后的程序重新命名为delayed-branch.s。注模拟器中延迟槽默认为1个。 delayed-branch.s
.text
main:
ADDI $r2,$r0,1024
ADD $r3,$r0,$r0
ADDI $r4,$r0,8 loop:
LW $r1,0($r2)
ADDI $r3,$r3,4
ADDI $r1,$r1,1
SUB $r5,$r4,$r3
BGTZ $r5,loop
SW $r1,0($r2) ADD $r7,$r0,$r6
TEQ $r0,$r0
c
全部复位后载入delayed-branch.s打开延迟槽功能执行该程序观察其时钟周期图记录程序执行的总时钟周期数。
原1. 在延迟槽中放入SW $r1,0($r2)指令从逻辑上“延长”分支指令的执行时间把延迟分支看成是由原来的分支指令和延迟槽中的指令构成不管分支是否成功都要按顺序执行延迟槽中的指令SW $r1,0($r2)。 原2. 在延迟槽中放入SW $r1,0($r2)指令从逻辑上“延长”分支指令的执行时间把延迟分支看成是由原来的分支指令和延迟槽中的指令构成不管分支是否成功都要按顺序执行延迟槽中的指令SW $r1,0($r2)。 不采用延迟槽 采用延迟槽 可以看到采用延迟槽时执行周期总数为26比不采用延迟槽少12。控制停顿数为0比不采用延迟槽少2。
总结
延迟槽技术从逻辑上“延长”分支指令的执行时间把延迟分支看成是由原来的分支指令和延迟槽中的指令构成不管分支是否成功都要按顺序执行延迟槽中的指令。可以将分支指令后应执行的指令或者与分支无关的指令放入延迟槽中使其在原本暂停指令执行的时间执行使指令的平均执行周期减少了性能因此而提高了。