实验三:指令调度和延迟分支

一、实验目的

  1. 加深对指令调度技术的理解。
  2. 加深对延迟分支技术的理解。
  3. 熟练掌握用指令调度技术来解决流水线中的数据冲突的方法。
  4. 进一步理解指令调度技术对CPU性能的改进。
  5. 进一步理解延迟分支技术对CPU性能的改进。

二、实验内容和步骤
首先要掌握MIPSsim模拟器的使用方法。见文档《MIPSsim使用手册》。

  1. 启动MIPSsim。
  2. 根据2.5节的相关知识中关于流水线各段操作的描述,进一步理解流水线窗口中各段的功能,掌握各流水寄存器的含义(双击各段,就可以看到各流水寄存器的内容)。
  3. 选择“配置”→“流水方式”选项,使模拟器工作于流水方式下。
  4. 用指令调度技术解决流水线中的结构冲突与数据冲突。
    (1)启动MIPSsim。
    (2)用MIPSsim的“文件”→“载入程序”选项来加载schedule.asm(在模拟器所在文件夹下的“样例程序”文件夹中)。
    (3)关闭定向功能。这是通过在“配置”菜单中关闭“定向”(使该项前面没有“√”号)来实现的。
    (4)执行所载入的程序。通过查看统计数据和时钟周期图,找出并记录程序执行过程中各种冲突发生的次数、发生冲突的指令组合,以及程序执行的总时钟周期数。
 执行周期总数:33
 RAW停顿:16    占周期总数的百分比:48.48485%
    其中:
  load停顿:6    占所有RAW停顿的百分比:37.5%
  自陷停顿:1    占周期总数的百分比:3.030303%
  停顿周期总数:17    占周期总数的百分比:51.51515%

发生冲突的指令组合:

ADDIU $r1,$r0,56,LW $r2,0($r1)
LW $r2,0($r1) ,ADD $r4,$r0,$r2
ADD $r4,$r0,$r2 ,SW $r4,0($r1)
SW $r4,0($r1) ,LW $r6,4($r1)
LW $r6,4($r1),ADD $r8,$r6,$r1
MUL $r12,$r10,$r1,ADD $r16,$r12,$r1
ADD $r16,$r12,$r1 ,ADD $r18,$r16,$r1
ADD $r18,$r16,$r1 , SW $r18,16($r1)
LW$r20,8($r1),MUL $r22,$r20,$r14
MUL $r22,$r20,$r14 , MUL $r24,$r26,$r14

(5)采用指令调度技术对程序进行指令调度,消除冲突。将调度后的程序保持到 after-schedule.asm中。
(6)载入after-schedule.asm。

.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

(7)执行该程序,观察程序在流水线中的执行情况,记录程序执行的总时钟周期数;

执行周期总数:21
    ID段执行了15条指令
  硬件配置:
    内存容量:4096 B
    加法器个数:1    执行时间(周期数):6
    乘法器个数:1    执行时间(周期数)7    
    除法器个数:1    执行时间(周期数)10    
    定向机制:不采用
  停顿(周期数):
    RAW停顿:4    占周期总数的百分比:19.04762%
    其中:
      load停顿:1    占所有RAW停顿的百分比:25%
      浮点停顿:0    占所有RAW停顿的百分比:0%
    WAW停顿:0    占周期总数的百分比:0%
    结构停顿:0    占周期总数的百分比:0%
    控制停顿:0    占周期总数的百分比:0%
    自陷停顿:1    占周期总数的百分比:4.761905%
    停顿周期总数:5    占周期总数的百分比:23.80952%

(8)根据记录结果,比较调度前和调度后的性能。论述指令调度对于提高CPU性能的作用。

指令调度可以消除部分的数据冲突,提高了CPU的使用率,减少了指令冲突的次数,提高了CPU性能,性能提高为调度前的33/21=1.57倍。
  1. 用延迟分支减少分支指令对性能的影响。
    (1)启动MIPSsim。
    (2)载入branch.asm。
    (3)关闭延迟分支功能。这是通过在“配置”→“延迟槽”选项来实现的。
    (4)执行该程序。观察并记录发生分支延迟的时刻
分支延迟发生的时刻:6913212428

(5)记录执行该程序所花的总时钟周期数。

执行周期总数:38

(6)假设延迟槽为一个,对branch.asm进行指令调度,然后保存到“delayed-branch.asm”中。

.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
SW $r1,0($r2)
BGTZ $r5,loop
ADD $r7, $r0, $r6
TEQ $r0, $r0

(7)载入delayed-branch.asm。
(8)打开延迟分支功能。
(9)执行该程序,观察其时钟周期图。
(10)记录执行该程序所花的总时钟周期数。

执行周期总数:26

(11)对比上述两种情况下的时钟周期图。
(12)根据记录结果,比较没采用延迟分支和采用了延迟分支的性能。论述延迟分支对于提高CPU性能的作用。

通过比较两者时钟周期数,可得:在使用延迟槽后,时钟周期数比没有使用延迟槽情况耗费得少。指令在运行到BGEZAL跳转指令时很可能不会出现延迟等待,能够在一定程度上提高CPU的性能。

你可能感兴趣的:(计算机系统结构,计算机系统结构)