系统结构流水线工作分析报告_流水线工作成果与总结
系统结构流水线工作分析报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“流水线工作成果与总结”。
《计算机系统结构课内实验》
实验报告
一、实验目的及要求
1、加深对计算机流水线基本概念的理解;
2、理解MIPS结构如何用5段流水线来实现,理解各段的功能和基本 操作;
3、加深对数据冲突、结构冲突的理解,理解这两类冲突对CPU性能的影响。
4、进一步理解解决数据冲突的方法,掌握如何 应用定向技术来减少数据冲突引起的停顿。加深对计算机流水线基本概念的理解;
二、实验环境
采用指令级和流水线操作级模拟器WinDLX;
三、实验内容
1、用WinDLX模拟器进行结构相关的分析
①生成汇编程序structure_d.s。用WinDLX模拟器运行该程序。②通过模拟,找出存在结构相关的指令对,以及导致结构相关的部件。③记录由结构相关引起的暂停时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。
2、用WinDLX模拟器进行数据相关分析
①添加data.s程序。
②通过Configuration菜单中的选项,设定在不采用定向技术的情况下,用WinDLX模拟器运行程序data_d.s。记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。
③在采用定向技术的情况下,用WinDLX模拟器再次运行程序data_d.s。记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,计算暂停时钟周期数占总执行周期数的百分比。
3、用WinDLX模拟器分析指令调度
①生成schedule-before.s及schedule-after.s程序。
②通过Configuration菜单中的选项,将除法单元数设置为3,将
加法﹑乘法﹑除法的延迟设置为3个时钟周期。③用WinDLX模拟器运行调度前的程序schedule-before.s。记录
程序执行过程中各种相关发生的次数以及程序执行的总时钟周期数。
④用WinDLX模拟器运行调度后的程序schedule-after.s,记录程序执行过程中各种相关发生的次数以及程序执行的总时钟周期数。
4、综合改进
在WinDLX上运行如下代码序列包含各种类型的冲突: ① 在没有任何其他定向(或旁路)硬件的支持下,假设采用排空流水线的策略处理分支指令,那么执行上述代码需要多少个时钟周期?
②假设该流水线有正常的定向路径,且采用预测分支失败的策略处理分支指令,那么执行上述代码需要多少个时钟周期? ③假设该流水线有正常的定向路径和一个单周期延迟分支,请对该循环中的指令进行调度,但是不能增加指令的条数。计算执行上述代码所需要的时钟周期数。
四、实验步骤
1、用WinDLX模拟器进行结构相关的分析
①用WinDLX打开structure_d.s程序,单步执行,查看
Clock Cycle Diagram窗口;
②指令“ADDI
R2, R2, #8 ”和指令“LD
F0, 0(R2)”
R2, R2, #8”、“ADDI
R3,发生结构冲突;指令ADDI
R3, #8” 和“SUBI R5, R5, #1”这三条指令和“ADDD
F4, F0, F2”存在结构相关。
由图3可知,程序总共执行了117个时钟周期,所以暂停时钟数占总执行周期的百分比为:20/117 = 17.09 %。
2、用WinDLX模拟器分析数据相关
①用WinDLX打开data_d.s程序,配置Configuration菜单中的选项,设定不采用定向技术。Statistics窗口内容如下:
在不采用定向技术的情况下,data_d.s程序总过执行了202个时钟周期,其中由数据相关引起的暂停周期为104个,占总执行周期的51.48%。
②设定采用定向技术。记录数据相关引起的暂停时钟周期数以及程序执行的总时钟周期数,Statistics窗口内容如下:
采用定向技术之后,data_d.s程序总过执行了128个时钟周期,其中由数据相关引起的暂停周期为30个,占总执行周期的23.44%。
3、用WinDLX模拟器分析指令调度
①用WinDLX模拟器运行调度前的程序schedule-before.s,通过Configuration菜单中的选项,将除法单元数设置为3,将加法﹑乘法﹑除法的延迟设置为3个时钟周期。记录程序执行过程中各种相关发生的次数以及程序执行的总时钟周期数。Statistics窗口内容如下:
程序执行的总时钟周期数为31,总暂停周期数为16,其中写后读相关(RAW)暂停周期为9个,Trap 暂停周期为7个。②用WinDLX模拟器运行调度前的程序schedule_later.s。记录程序执行过程中各种相关发生的次数以及程序执行的总时钟周期数。Statistics窗口内容如下:
schedule_after.s 程序执行的总时钟周期数为25,总暂停周期数为9,其中写后读相关(RAW)暂停周期为3个,Trap 暂停周期为6个。
4、综合改进
①生成final_before.s:配置Configuration菜单中的选项,设定不采用定向技术。程序在一个循环周期内的流水线时空图如下所示:
由图中分支指令后的trap指令的执行可以看出,WinDLX对分支指令采用的是预测分支失败的方法,即在分支指令取指后的下一个周期取下一条指令。当分支指令跳转成功时,流水线就把在分支指令之后取出的所有指令转化为空操作,并按分支目标地址重新取指令执行。可以看出,执行一个循环需要-15-(-30)=15个周期。在一个循环周期内,指令序列的流水线时空图如下所示:
S代表R-Stall。与WinDLX中运行出的流水线时空图不同之处在于,这里采用的是排空流水线处理分支指令,即在第15时钟周期,当流水线在ID段检测到分支指令“BNEZ R4, LOOP”后,就暂停执行其后的所有指令,直到分支指令到达MEM段,确定是否分支成功并计算出新的PC值为止。这里,因为分支成功,所以重新取指令“LW R1, 0(R2)”执行。由图9可以看出,执行完一个循环需要的时钟周期数为:18-1 =17.由于R3 =R2 + 396,因此共有396/4 = 99个循环。故执行完整个程序所需要的时钟周期数为 17×98 + 18 = 1684。
②运行final_before.s,配置设定采用定向技术。程序在一个循环周期内的流水线时空图如下所示:
由上述可知WinDLX对分支指令采用的是预测分支失败的方法。且由图10可以看出,在采用定向的条件下,执行一个循环需要-2-(-11)= 9个周期。
在一个循环周期内,指令序列的流水线时空图如下所示:
与WinDLX中运行出的流水线时空图不同之处在于,这里分支指令后没有“TRAP #0”指令。因而在采用预测分支失败的策略处理分支指令的情况下,流水线中继续流水的是“LW R1, 0(R2)”指令。分支成功后重新取指令“LW R1, 0(R2)”执行。
由图可知,执行完一个循环需要的时钟周期数为:11-1 =10。
执行完整个程序所需要的时钟周期数为 10×98 + 11 = 991。③对该循环中的指令进行调度,采用的调度方法为:将独立执行的指令“ADDIR2, R2, #4”前移至“LW R1, 0(R2)”后;将分支指令前的一条指令“SW 0(R2), R1”修改为“SW-4(R2), R1”,后移至分支指令“BNEZ R4, LOOP”后作为延迟槽中的指令.将调度后的程序保存为final_after.s,设定为采用定向技术,运行该程序。在一个循环周期内,该指令序列的流水线时空图如下所示:
由上图可以看出,在采用预测分支失败的策略处理分支指令时,分支指令“BNEZ R4, LOOP”跳转成功后,停止了其后继指令“SW-4(R2), R1”的执行,直接转向分支目标指令“LW R1, 0(R2)”处执行。在这种情况下,执行一个循环需要-3-(-10)=7个时钟周期。
在一个循环周期内,指令序列的流水线时空图如下所示:
与WinDLX中运行出的流水线时空图不同之处在于,这里是采用单周期延迟分支的方法处理分支指令的,延迟槽中的指令为“SW-4(R2), R1”。虽然分支能够成功,但
是仍然要把延迟槽指令顺利执行完。
可知,执行完一个循环需要的时钟周期数为:7-1 =6。
执行完整个程序所需要的时钟周期数为 6×98 + 11 = 598。
五、实验结果
1、由上述记录可知,通过定向技术,减少了数据相关所引起的暂停周期的数量,缩短了程序的执行周期,整个性能是原来的1.58倍。
2、经调度之后,程序执行的总时钟周期数从31减到了25,同时各种类型的暂停周期数也相应了减少了。通过编译器重新组织代码顺序来实现“指令调度”,消除了一部分的暂停周期,使流水线性能得到了提高。
六、总结
解决结构相关通常需要采用流水线功能单元的方法或资源重复的方法。流水线功能单元的方法引入的暂停影响了流水线的性能,对流水线机器而言,如果要在每个时钟周期内,能够支持取指令操作和对数据的存储访问操作同时进行,而又不发生结构相关,那么存储总线的带宽必须要加倍。所以在解决该问题时要在性能和开销两方面进行权衡。
通过本次实验,我对WinDLX的流水线运行分析,包括流水线单步执行、每个流水段功能、流水线建立与排空、定向技术等内容有了很好的掌握。
七、附录(源程序清单)
1.structrue_d.s
LHI
R2,(A>>16)&0xFFFF
ADDUI
R2, R2, A&0xFFFF
LHI
R3,(B>>16)&0xFFFF
ADDUI
R3, R3, B&0xFFFF
ADDU
R4, R0, R3
loop:
LD
F0, 0(R2)
LD
F4, 0(R3)
ADDD
F0, F0, F4
ADDD
F2, F0, F2;
ADDI
R2, R2, #8
ADDI
R3, R3, #8
SUB
R5, R4, R2
BNEZ
R5, loop
TRAP
#0
;;Exit
A:
.double 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
B:
.double 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
2.data_d.s
LHI
R2,(A>>16)& 0xFFFF
ADDUI R2, R2, A & 0xFFFF
LHI
R3,(B>>16)&0xFFFF
ADDUI R3, R3, B&0xFFFF
loop:
LW
R1, 0(R2)
ADD
R1, R1, R3
SW
0(R2), R1
LW
R5, 0(R1)
ADDI
R5, R5, #10
ADDI
R2, R2, #4
SUB
R4, R3, R2
BNEZ
R4, loop
TRAP
#0
A:.word 0, 4, 8, 12, 16, 20, 24, 28, 32, 36
B:.word 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
3.schedule_before.s.data.global
ONE ONE:
.word 1.text.global main main: lf
f1,ONE
cvti2f f7,f1
;nop;
divf f1,f8,f7;move Y=(f8)into f1 divf f2,f9,f7;move Z=(f9)into f2 addf f3,f1,f2 divf f10,f3,f7;move f3 into X=(f10)divf f4,f11,f7;move B=(f11)into f4 divf f5,f12,f7;move C=(f12)into f5 multf f6,f4,f5 divf f13,f6,f7;move f6 into A=(f13)Finish:
trap 0 4.schedule_later.s.data
ONE:
main:
.global ONE.word 1.text.global main lf cvti2f nop divf divf divf divf addf f1,ONE;turn divf into a move f7,f1;by storing in f7 1 in
;floating-point format f1,f8,f7;move Y=(f8)into f1 f2,f9,f7;move Z=(f9)into f2 f4,f11,f7;move B=(f11)into f4 f5,f12,f7;move C=(f12)into f5 f3,f1,f2
Finish:
multf divf divf
trap f6,f4,f5 f10,f3,f7;move f3 into X=(f10)f13,f6,f7;move f6 into A=(f13)0 5.final_before.s
6.final_after.s