循环展开及指令调度.docx
《循环展开及指令调度.docx》由会员分享,可在线阅读,更多相关《循环展开及指令调度.docx(16页珍藏版)》请在冰豆网上搜索。
循环展开及指令调度
实验项目
名称
循环展开及指令调度
实验
目的及要求
1.加深对循环级并行性、指令调度技术、循环展开技术以及寄存器换名技术的理解;
2.熟悉用指令调度技术来解决流水线中的数据相关的方法;
3.了解循环展开、指令调度等技术对CPU性能的改进。
实验
内容
1.用指令调度技术解决流水线中的结构相关与数据相关
(1)用MIPS汇编语言编写代码文件*.s,程序中应包括数据相关与结构相关(假设:
加法﹑乘法﹑除法部件各有2个,延迟时间都是3个时钟周期)
(2)通过Configuration菜单中的“Floatingpointstages”选项,把加法﹑乘法﹑除法部件的个数设置为2个,把延迟都设置为3个时钟周期;
(3)用winMIPS64运行程序。
记录程序执行过程中各种相关发生的次数、发生相关的指令组合,以及程序执行的总时钟周期数;
(4)采用指令调度技术对程序进行指令调度,消除相关;
(5)用winMIPS64运行调度后的程序,观察程序在流水线中的执行情况,记录程序执行的总时钟周期数;
(6)根据记录结果,比较调度前和调度后的性能。
论述指令调度对于提高CPU性能的意义。
2.用循环展开、寄存器换名以及指令调度提高性能
(1)用MIPS汇编语言编写代码文件*.s,程序中包含一个循环次数为4的整数倍的简单循环;
(2)用winMIPS64运行该程序。
记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;
(3)将循环展开3次,将4个循环体组成的代码代替原来的循环体,并对程序做相应的修改。
然后对新的循环体进行寄存器换名和指令调度;
(4)用winMIPS64运行修改后的程序,记录执行过程中各种相关发生的次数以及程序执行的总时钟周期数;
(5)根据记录结果,比较循环展开、指令调度前后的性能。
实验步骤
1.用指令调度技术解决流水线中的结构相关与数据相关
1) 代 码:
divf f2,f5,f6
divf f1,f2,f6
divf f3,f1,f5
divf f0,f4,f7
addf f14,f0,f6
addf f15,f5,f7
multf f20,f4,f6
multf f21,f5,f7
2)设置运算部件个数以及运算时钟周期数
图1
图2.Pipeline图
以下为出现的数据相关
图3
先写后读相关
图4
由于只有两个除法部件,所以出现了功能部件的冲突。
总的执行周期是38指令调度后代码:
将无关指令放在一起执行,相关指令分开尽量避免数据相关
divf f2,f5,f6
multf f20,f4,f6
multf f21,f5,f7
divf f1,f2,f6
addf f15,f5,f7
divf f3,f1,f5
divf f0,f4,f7
addf f14,f0,f6
图5.Pipeline图
图6.Statistics图
总执行时钟周期为35个。
(6)指令调度后,数据相关减少了,总时钟周期数减少了,效能提高了。
调度前的时钟周期数为38,调度后的时钟周期数减少为35,加速比 = 38/35= 1.08
2.用循环展开、寄存器换名以及指令调度提高性能
带循环指令
代码:
求四个1相加的和,结果存在r2中
.text
.globalmain
main:
addir1,r0,#4
addir2,r0,#0
Loop:
sgtr3,r1,r0
bnezr3,Sub1
trap0Sub1:
addir2,r2,#1
subir1,r1,#1
jLoop
结果:
总时钟周期是42个,5rawstalls,循环了4次,结果
r2=4
图7
循环展开:
代码:
.text
.globalmain
main:
addir1,r0,#4
addir2,r0,#0
addir2,r2,#1
subir1,r1,#1
addir2,r2,#1
subir1,r1,#1
addir2,r2,#1
subir1,r1,#1
addir2,r2,#1
subi r1,r1,#1
trap 0
结果:
总时钟周期是15个,0 raw stalls,执行了4次,结果r2 = 4
图8
原因的对比:
是因为LOOP指令执行完后会有一个nop指令的延迟。
图9
多Cache一致性:
实验目的
1、加深对多CACHE一致性的理解。
2、进一步掌握解决多CACHE一致性的目录协议和监听协议的基本思想。
3、掌握在各种情况下,目录协议和监听协议是如何工作的。
给出进行操作的类
型以及CACHE块状态的变化情况
模拟器使用方法简介(目录式)
该模拟器模拟4个CPU(A、B、C、D)访存的工作过程。
每个CPU中都有一个Cache,该Cache包含有4个块,其块地址为0-3。
分布式存储器中有32个块,其块地址为0-31。
每个块状态用色块表示,其中灰色为“无效”状态,淡青色为“共享”状态,橘红色为“独占”。
主存中块的状态由其右边的目录项的颜色来表示,未缓冲状态由黄色来表示,其他两种状态同Cache块。
对于每一个CPU都可以指定所要进行的访问是读还是写(从列表中选),并在输入框中输入所要访问的主存块号,然后用鼠标单击在其右边的标有“↓”的按钮,模拟器就将开始演示该访问的工作过程。
图10
模拟器简介(监听协议)
该模拟器模拟4个CPU(A、B、C、D)访存的工作过程。
每个CPU中都有一个Cache,该Cache包含有4个块,其块地址为0-3。
集中共享存储器中有32个块,其块地址为0-31。
每个块状态用色块表示,其中灰色为“无效”状态,淡青色为“共享”状态,橘红色为“独占”。
对于每一个CPU都可以指定所要进行的访问是读还是写(从列表中选),并在输入框中输入所要访问的主存块号,然后用鼠标单击在其右边的标有“↓”的按钮,模拟器就将开始演示该访问的工作过程。
图11
实验步骤(目录协议)
对于以下访问序列,写出目录协议所进行的操作。
所进行的访问
目录协议所进行的操作
CPUA读第6块
1.读;2.不命中;3本地:
向宿主结点发读不命中(A,6)消息;4.宿主:
把数据块送给本地结点;5.共享集合为:
{A}
CPUB读第6块
1.读;2.不命中;3.本地:
向宿主结点发读不命中(B,6)消息;
4.宿主:
把数据块发送给本地结点;5.共享集合为:
{A}+{B}
CPUD读第6块
1.读;2.不命中;3.本地:
向宿主结点发读不命中(D,6)消息;
4.宿主:
把数据块发送给本地结点;5.共享集合为:
{A,B}+{D}
CPUB写第6块
1.写;2.命中;3.本地:
向宿主结点发写命中(
,6)消息,宿主:
向远程结点A发作废(6)消息,宿主:
向远程结点D发作废(6)消息;4.共享集合为:
{B}
CPUC读第6块
1读;2.不命中;3.本地:
向宿主结点发读不命中(C,6)消息;
4.宿主:
给远程结点发取数据块(6)的消息;5.远程:
把数据块送给宿主结点;6.宿主:
把数据块送给本地结点;7.共享集合为:
{B}+{C}
CPUD写第20块
1.写;2.不命中;3.本地:
向宿主结点发写不命中(D,20)消息;4.宿主:
把数据块发送给本地结点;5.共享集合为:
{D}
CPUA写第20块
1.写;2.不命中;3.本地:
向宿主结点发写不命中(A,20)消息;4.宿主:
给远程结点发送取并作废(20)消息;5.远程:
把数据块送给宿主结点把Cache中的该块作废;6.宿主:
把数据块送给本地结点;7.共享集合为:
{A}
CPUD写第6块
1.写;2.不命中;3.本地:
向宿主结点发写不命中(D,6)消息;4.宿主:
向远程结点发作废(6)消息;5.宿主:
向远程结点发作废(6)消息;6.宿主:
把数据块送给本地结点;7.共享集合为:
{D}
CPUA读第12块
1.写;2.不命中;3.本地:
向被替换块的宿主结点发写回并修改共享集(A,20)消息;4.本地:
向宿主结点发写不命中(A,20)消息;5.宿主:
把数据块送给本地结点;6.共享集合为:
{A}
实验步骤(监听协议)
对于以下访问序列,写出监听协议所进行的操作。
所进行的访问
是否发生替换
是否发生写回
监听协议所进行的操作
CPUA读第5块
否
否
读;不命中;读不命中;数据送回
CPUB读第5块
否
否
读;不命中;读不命中;数据送回
CPUC读第5块
否
否
读;不命中;读不命中;数据送回
CPUB写第5块
否
发生
写,命中;作废A,C中的数据5,
CPUD读第5块
发生
否
读;不命中;读不命中;写回;数据送回
CPUB写第21块
发生
发生
写;不命中;写不命中;用数据21替换原来的数据5
CPUA写第23块
否
发生
写;不命中;写不命中;写回;数据送回
CPUC写第23块
发生
发生
写;不命中;写不命中;替换;写回;数据送回
CPUB读第29块
否
否
读;不命中;读不命中;数据送回
CPUB写第5块
替换
发生
写;不命中;写不命中;替换;写回;数据送回
实验环境
windows
实验结果与
分析
a)指令调度技术可以明显的优化指令执行的效率,通过指令调度使得功能部件被尽可能的充分使用,从而进一步加强指令执行的效率;
b) 循环在执行时会出现不同循环次数的执行过程中出现相关,导致数量增加,通过寄存器换名等方法,使得这种相关性数量下降。
教师评语
注:
可根据实际情况加页