计算机系统结构实验报告
班级 姓名 实验名称 实 验 目 的 、 要 求 实 验 内 容 、 步 骤 及 结 果 实验日期 学号 4-10 实验成绩 实验三、指令调度和延迟分支 实验目的: 1、 加深对指令调度技术的理解; 2、 加深对延迟分支技术的理解; 3、 熟练掌握用指令调度技术解决流水线中的数据冲突的方法; 4、 进一步理解指令调度技术对CPU性能的改进; 5、 进一步理解延迟分支技术对CPU性能的改进。 实验步骤: 1、 启动MIPSsim。 2、 根据2.5节相关内容关于流水线的描述,进一步理解流水线窗口中各段的功能; 3、 选择“配置”--“流水方式”选项; 4、 用指令调度解决流水线中的数据冲突 (1) 启动MIPSsim; (2) 用MIPSsim的“文件”—“载入程序”选项加载schedule.s; (3) 关闭定向功能,“配置”—“定向”; (4) 执行载入程序,通过查看统计数据与始终周期图,找出并记录程序执行过程中各种冲突的次数没发生冲突的指令组合以及程序执行的总周期数; 程序执行的总周期数:33 程序冲突的组合: ADDIU $r1,$r0,A LW $r2,0($r1)与上条写后读冲突; ADD $r4,$r0,$r2 SW $r4,0($r1)与上条指令写后读冲突; LW $r6,4($r1) ADD $r8,$r6,$r1与上条指令写后读冲突; MUL $r12,$r10,$r1 ADD $r16,$r12,$r1与上条指令写后读冲突; ADD $r18,$r16,$r1 与上条指令组件冲突 SW $r18,16($r1) 与上条指令写后读冲突;; LW $r20,8($r1) MUL $r22,$r20,$r14与上条指令写后读冲突; (5) 采用指令调度技术对程序进行指令调度,消除冲突。将调度后的程序写入afer-schedule.s中。 内容如示: .text main: ADDIU $r1,$r0,A MUL $r22,$r20,$r14 LW $r2,0($r1) MUL $r24,$r26,$r14 ADD $r4,$r0,$r2 LW $r6,4($r1) SW $r4,0($r1) ADD $r8,$r6,$r1 MUL $r12,$r10,$r1 ADD $r18,$r16,$r1 ADD $r16,$r12,$r1 SW $r18,16($r1) LW $r20,8($r1) TEQ $r0,$r0 .data A: .word 4,6,8 (6) 载入after-schedule.s; (7) 执行该程序。观察程序在流水线中的执行情况,记录程序执行的总时钟周期数。 总时钟周期数为:21 (8) 根据记录结果,比较调度前与调度后的性能,论述指令调度对 与提高CPU性能的作用; 指令调度后时钟总周期数从33降低到21,通过使用指令调度技术显著地提高了CPU的使用率,大大减少了指令冲突的次数,对提高CPU性能有很大的作用。 5、 用延迟分支减少分支指令对性能的影响。 (1) 启动MIPSsim; (2) 载入branch.s; (3) 关闭延迟分支功能,“配置”—“延迟槽” (4) 执行程序,观察并记录发生分支延迟的时刻; (5) 记录执行改程序所需要的总时钟周期数 (6) 假设延迟槽为一个,对branch.s进行指令调度,然后保存到delayed-branch.s中; 代码如如示: 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 SW $r1,0($r2) BGTZ $r5,loop LW $r1,0($r2) ADD $r7,$r0,$r6 TEQ $r0,$r0 (7) 载入delayed-branch.s; (8) 打开延迟分支功能; (9) 执行该程序,观察其时钟周期图; (10) 记录执行该程序所用的总时钟周期数; 执行总周期数:26 ID端执行了20条指令 (11) 对比上诉两种情况的时钟周期图; (12) 根据记录结果,比较没采用延迟分支和采用了延迟分支的性能之间的不同,论述延迟分支对于条CPU性能的作用。 答:对比两种情况的时钟周期总数可知,在使用延迟槽后,指令在运行到跳转指令附近时,在期望概率上很大部分可能不会出现延迟等待,故能够稍微提高CPU性能,但是在跳转指令较多的程序中,此方法更为实用。 6、补充实验 (1)通过配置菜单,把加法﹑乘法﹑除法部件的个数设置为2个,把延迟都设置为3个时钟周期;用MIPS语言编写一段简单的程序,至少包含数据相关和结构相关,包含循环次数为4的倍数的循环,运行程序。记录程序执行过程中各种相关发生的次数、发生相关的指令组合,以及程序执行的总时钟周期数。 按照要求写程序,但可对样例代码branch改编生成,结果如示: .text main: ADD.D $f2,$f0,$f1 SUB $r0,$r0,$r0 ADDI $r2,$r0,1024 ADDI $r4,$r0,16 ADD $r3,$r0,$r0 loop: LW $r1,0($r2) ADDI $r1,$r1,1 SW $r1,0($r2) ADDI $r3,$r3,4 SUB $r5,$r4,$r3 BGTZ $r5,loop ADD $r7,$r0,$r6 TEQ $r0,$r0 周期以及停顿信息: (2)用循环展开、寄存器换名以及指令调度提高性能 提示: 将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。然后对新的循环体进行寄存器换名和指令调度;运行修改后的程序,记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数。 代码如示: .text main: ADD.D $f2,$f0,$f1 SUB $r0,$r0,$r0 ADDI $r2,$r0,1024 ADD $r3,$r0,$r0 ADDI $r4,$r0,16 loop: LW $r1,0($r2) ADDI $r1,$r1,1 SW $r1,0($r2) LW $r8,32($r2) ADDI $r8,$r8,1 SW $r8,32($r2) LW $r9,64($r2) ADDI $r9,$r9,1 SW $r9,64($r2) LW $r10,96($r2) ADDI $r10,$r10,1 SW $r10,96($r2) LW $r11,128($r2) ADDI $r11,$r11,1 SW $r11,128($r2) ADDI $r3,$r3,16 SUB $r5,$r4,$r3 BGTZ $r5,loop ADD $r7,$r0,$r6 TEQ $r0,$r0 周期以及停顿信息: 当定向技术打开和关闭时结果是否有差异? 答: 当定向技术打开时,如果指令调度技术较为理想则不会有太多的提高,当然如果对指令调度不太成功则会存在较大差异。 Stall是否越少越好? 答:Stall较少对其性能提高有一定的影响,但是当stall降低到一定程度后则不会有很大的提高。 总 结 通过这次实验,对指令系统中各种优化方法有了一定的了解,并且在补充实验中使用集中优化策略的综合,让我对其有了较为系统的认识,对以后编写代码有一定的指导作用。 补充实验中对循环扩展的理解不太充分,只是对大概的流程有了一定的认识,而且对性能的提高不是很好,只减少了20个时钟周期左右,但是CPU使用率明显上升,使得资源得到了更好的利用。 总之,通过这次实验,对实验教程上的策略有了较为深入的了解,总体上实验难度适中。