资源描述
计算机体系构造——
Cache模仿器实验
实验报告
姓名 崔雪莹
学号 12281166
班级 计科1202班
教师 董岚
06月07日
一、 阅读分析附件模仿器代码 2
1、核心参数 2
2、核心算法 3
二、课后习题 5
1、习题内容 5
2、题目分析 5
3、计算及成果 6
4、模仿器上实验成果检查 7
三、 整体分析 8
1、三种映射方式对Cache效率影响 8
2、block块大小与Cache容量对Cache效率影响 8
3、Cache容量与相连度对Cache效率影响 9
4、三种失效类型影响因素 9
四、 实验思考和感受 10
1、关于模仿器思考 10
2、关于整个实验思考 10
一、 阅读分析附件模仿器代码
1、核心参数
(1) 顾客可见参数:(顾客通过命令行输入参数)
参数名
含义
值
备注
choice
映像方式选项
1/2/3
1为直接映射,2为组相连映射,
3为全相连映射
cachesize
Cache大小
16/64/128/256
以字节为单位
blocksize
Block大小
1/2/4
以字为单位
assoc
相连度
1/2/4/8/16
assoc路组相连(n-way)
accesscount
祈求次数
待输出
等于project.txt值个数
hitcount
命中次数
待输出
成功在Cache找到次数
hitrate
命中率
待输出
HitRate= hitcount/accesscount
misscount
未命中次数
待输出
没在Cache找到次数
misscount = 1-hitcount
missrate
未命中率
待输出
MissRate= misscount/accesscount
c1c ,c2c ,c3c
失效次数
待输出
分别为三种失效类型次数
(2)程序内部重要参数:(代码内部重要参数)
参数名
含义
计算
备注
blockinbyte
块字节大小
=blocksize*4
每一种块占多少字节
NOofblock
块个数
=cachesize/blockinbyte
Cache中多少个块
NOofset
组个数
=NOofblock/assoc
块提成了多少个组
bytearray[]
要访问数据字节地址
=projec.txt中值
project.txt文献数据赋给了bytearray[]数组
wordaddress[]
要访问数据字地址
=bytearray[j]/4
blocksize是字为单位,就是说一种block占多少个字,因此数据也规定字地址
blockaddress[]
数据块地址
=wordaddress[]/blocksize
数据在第几块
index
索引位(组地址)
=blockaddress[j]%NOofset
若Noofset=2^m,则块地址低m位为索引位(组地址)。
tag
标记位(组内寻址)
=blockaddress[j]/NOofset
块地址高(32-m)位为标记位,用于拟定组内哪块数据,newarray[index][z+1]中存储
*valid
有效位
有效为1,失效为0
判断该cache块数据与否有效*是由于没有真正定义,只是存储newarray[index][z]中
lru[index][z]
近来未被使用次数
每次加1,被重写置0
替代时,替代掉lru[index][]值最大那个块
2、核心算法
注:这里不粘贴代码,只是进行简朴代码算法阐明
(1) 块地址表达:
注:图是我按照自己想法自己画,也许有些地方并不精确,望教师指正。图中以一种例子来解释cache模仿器中block和数据地址关系,以及和组地址和标志位关系。
(2) Index与tag:
由上面计算: index = blockaddress % NOofset index = 16 % 8 = 2
tag = blockaddress / Noofset tag = 16/8 = 2
以上例,字地址16为例,写成二进制为0001 0010 B,其中组数为8,又由于2^3=8,因此字地址取后3位为:index = 010 B = 2 ,取前29位为:tag = 0…0010 B = 2 。因此,算法与理论是一致。
(3) Valid:
有效位。当通过上述方式寻址找到了数据存储数据块,接下来判断有效位:
有效位为1,阐明数据是有效,可以从block提取数据;
有效位为0,阐明块里数据是无效,因此不能从block提取数据,浮现miss,此时判断miss类型,同步需要访问内存或下一级存储,将数据放到cache里。
(4) 失效类型及判断办法:
判断失效类型,函数misstype(int ba ,int nb ,int l)。
Compulsory miss(强制性失效,冷启动):当第一次访问某一种块时候,数据是必定不在块中,此时浮现强制性失效,或者说是冷启动失效。
Capacity miss(容量失效):所需数据不能所有调入cache中,块被替代后又被重新访问,意思就是当所有块都被占满了,这样又有数据但愿被调入缓存时,就浮现了容量失效。
Conflict miss(冲突失效):在组相联或直接映像中,数据想要替代进某一组中,组内块都被占满了,但是别组块有空余,数据只能替代这一组,尽管别组有空余也不能替代。这样就浮现了冲突失效。
(5) LRU算法实现替代:
LRU替代算法是采用近来最久未使用块,其中Lru[][]数组存储近来多少次未被使用,由于是采用循环访问,当循环访问到这一组时,把这组所有块Lru[][]值都加1,如果成功访问到这一块,数据能从其中取出来,就把这一块Lru[][]值置0,退出循环。
(6) 直接映射、组相联映射、全相联映射:
直接映射:是特殊组相联映射,就是相联度为1组相联映射。因此采用和组相联同样程序和算法,当辨认该组第一块失效时,直接进行替代,由于有且只有一块。
组相联映射:当辨认该组某块失效时,如果块都被占满,要依照Lru[][]值大小,判断哪一块被替代掉。
全相联映射:从上到下cache块存数据,则从上到下循环即可,遇到失效时,要依照Lru[][]值大小,判断哪一块被替代掉。
二、 课后习题
1、 习题内容
在CacheSimulator模仿器上模仿如下程序运营过程:
int i,j,c stride,array[256]
for(i=0;i<10000;i++)
for(j=0;j<256;j=j+stride)
c = array[j]+5;
假设Cache总大小是256个字节,且块大小为16字节(4个字)。
同步假设内存当中只有这一种程序在运营,并且整形数字长度为一种字长(字长为32位),在直接相连映射下,stribe分别等于132、131时程序运营成果,并分析因素。而当采用两路组相连时又会有什么成果并分析因素。
2、 题目分析
当stribe = 132/131 时,程序相称于循环访问内存偏移地址为0和地址132/131内容,循环10000次,也就是访问了次存储。
结合cache机制,cache大小为256个字节,块大小为16个字节,因此块个数为256/16 = 16个。若为2路组相连,则有16/2 = 8组。
当第一次访问块时,一定会发生强制性失效,计一次miss。
3、 计算及成果
1) 直接映像时:
l stride=132
array[0]块地址为0,映射到cache块号为0:
0 mod 16 = 0
array[132]块地址为132/4 = 33,映射到cache块号为1:
33 mod 16 = 1
由于第一次访问cache,0和1一定会发生强制性失效,之后由于调入cache,不会发生失效。则失效次数为2,则失效率为:
2/0 = 0.01%
命中次数为19998次,命中率为:
19998/0 = 99.99% = 1(近似)
失效类型为强制性失效,次数为2。
l stride=131
array[0]块地址为0,映射到cache块号为0:
0 modulo 16 = 0
array[131]块地址为131/4 = 32,映射到cache块号为0:
32 modulo 16 = 0
由于第一次访问cache,0一定会发生强制性失效,之后cache里块号为0块不断地被替代写入替代写入,此时发生冲突失效。则失效次数为0,则失效率为:
0/0 = 1 = 100%
命中率为0。失效类型为强制性失效次数1,冲突失效次数为19999。
2) 2路组相联:
l stride=132
array[0]块地址为0,映像到cache组号为0:
0 modulo 8 = 0
array[132]块地址为132/4 = 33,映像到cache组号为1:
33 modulo 8 = 1
由于第一次访问cache,0和1一定会发生强制性失效,之后由于调入cache,不会发生失效。则失效次数为2,则失效率为:
2/0 = 0.01%
命中次数为19998次,命中率为:
19998/0 = 99.99% = 1(近似)
失效类型为强制性失效,次数为2。
l stride=131
array[0]块地址为0,映像到cache组号为:
0 modulo 8 = 0
array[131]块地址为131/4 = 32,映像到cache组号为:
32 modulo 8 = 0
由于第一次访问cache,0和1一定会发生强制性失效,之后由于是2路组相联,array[0]与array[131]都在0组,不会发生失效,则失效次数为2,失效率为:
2/0 = 0.01%
命中次数为19998次,命中率为:
19998/0 = 99.99% = 1(近似)
失效类型为强制性失效,次数为2。
4、 模仿器上实验成果检查
注:由于例题循环次数为10000,为了便于实验,我将循环次数设立为100,成果参照100计算,原理是一致。由于实际131/132都是字地址,而project.txt设立是字节地址,因此将project.txt里值设立为0 和 132*4/131*4 循环100次,设立cache大小为256,block大小为4,可以分别看到直接映射和2路组相连映射成果为:
直接映射
stride=132
stride=131
miss count
2
200
miss rate
0.01
1.00
hit count
198
0
hit rate
0.99
0
access count
200
200
c1c(强制性失效)
2
2
c2c(容量性失效)
0
0
c3c(冲突性失效)
0
198
2路组相连映射
stride=132
stride=131
miss count
2
2
miss rate
0.01
0.01
hit count
198
198
hit rate
0.99
0.99
access count
200
200
c1c(强制性失效)
2
2
c2c(容量性失效)
0
0
c3c(冲突性失效)
0
0
可以看到实验成果与计算是一致(由于循环次数100,因此实验成果小数点要后移两位)。同步对习题1思考(见后)也证明是对的。
(1) 直接映射:stride = 132 截图
(2) 直接映射:stride = 131 截图
(3) 2路组相连:stride = 132 截图
(4) 2路组相连:stride = 131 截图
三、 整体分析
1、 三种映射方式对Cache效率影响
其她相似条件:block大小为2,组相连相连度为4,project.txt为200个0~1000随机数。
cache容量(字节)
映射方式
直接映射
组相连
全相连
64
0.94
0.935
0.925
128
0.87
0.875
0.865
256
0.79
0.79
0.785
512
0.68
0.63
0.61
1024
0.50
0.50
0.50
生成图表:
此时可以看到:
1. 直接映射失效率高,组相连失效率中档,全相连失效率最低
2. 随着cache容量增长,失效率越小。
3. 当cache容量为1024时,由于数据取值因素,三种方式失效率相等,阐明当cache容量足够大,三种方式失效率是同样。
2、 block块大小与Cache容量对Cache效率影响
其她相似条件:直接映射,相连度为1,project.txt为200个0~1000随机数。
块大小(字)
Cache容量(字节)
64
128
256
512
1024
1
0.94
0.885
0.83
0.77
0.69
2
0.94
0.87
0.79
0.68
0.50
4
0.95
0.905
0.80
0.635
0.30
8
0.945
0.89
0.785
0.575
0.155
生成图表:
此时可以看到:
1. 对于给定cache容量如64字节,当块大小增长时,失效率先是下降,日后反而上升了。
2. Cache容量越大,使其失效率达到最低块大小就越大。
3. 由于获得数据样本是随机,不是持续,实验数据并不是十分精确,例如cache容量128时,块大小浮现两次失效率
3、 Cache容量与相连度对Cache效率影响
其她相似条件:组相连,块大小2,project.txt为200个0~1000随机数。
Cache容量(字节)
相连度/路
1
2
4
8
64
0.94
0.93
0.915
0.905
128
0.875
0.87
0.86
0.87
256
0.785
0.765
0.80
0.78
512
0.645
0.64
0.67
0.66
1024
0.535
0.535
0.535
0.535
生成图表:
此时可以看到:
1. 提高相连度会使失效率下降。
2. 由于获得数据样本是随机,不是持续,实验数据并不是十分精确。
3. 当容量为1024时,也就是cache一定大时,失效率没什么区别。
4、 三种失效类型影响因素
(1)相连度对三种失效类型影响:
其她相似条件:cache大小为256,block大小为2,组相连,project.txt为200个0~1000随机数。
相连度(路)
总失效率
总失效次数
失效类型
强制性失效
容量失效
冲突失效
1
0.78
156
107
38
11
2
0.80
160
107
40
13
4
0.765
153
107
41
5
8
0.785
157
107
45
5
16
0.785
157
107
46
4
可以看出:
1. 强制性失效,即冷启动,不受相连度影响。
2. 容量失效基本不受相连度影响,但由于数据偶尔性,浮现增大趋势。
3. 冲突失效随着相连度增长而减少。
(2)Cache容量对三种失效类型影响:
其她相似条件:block大小为2,组相连度为4,project.txt为200个0~1000随机数。
cache容量(字节)
总失效率
总失效次数
失效类型(相对比例)
强制性失效
容量失效
冲突失效
64
0.93
186
107
78
1
128
0.87
174
107
65
2
256
0.765
153
107
41
5
512
0.64
128
107
13
8
1024
0.535
107
107
0
0
可以看出:
1. 容量越大,失效率越小。
2. 强制性失效不受容量大小影响。
3. 容量失效随着容量增长而大大减小。
4. 冲突失效不受容量大小影响。
四、 实验思考和感受
1、关于模仿器思考
Cache大小可选为16/64/128/256,由于代码写了,但是没有增长选项。但是,我考虑由于16实在太小了,没什么意义。
打开文献 名字为project.txt,修改文献名。
个人感觉有地方不太适当,由于直接映像就是特殊组相联映射,因此相联度一定为1,但是代码中并没有设计这一点,当一种完全不懂得人使用时,很有也许设立相联度不不大于1,导致错误。此外我觉得可以把三种方式各封装在一种自己函数里,这样代码更加清晰。
有困惑我问题,我是通过阅读代码才比较清晰理解cache实现,但是模仿器给出地址映射办法是将数据字节地址转换为字地址,又将字地址转换为块地址,对块地址进行取模运算。而习题1是直接对字地址进行取模运算,办法明显不一致。通过我重新阅读习题1题目,发现实际习题1132/131是字地址,由于定义int array[]数组定义是整数字长,因此132/131指是地址为字地址,例如两个地址之间是一种整数字长。
2、关于整个实验思考
这次实验是我大学做最专心一次实验,没有之一。我在仔细阅读实验代码后,懂得了内存物理地址是如何转换为cache块号或组号。我依照自己理解,画了一种模仿寻址图,更加清晰懂得原理,理顺清晰究竟是怎么一回事,收获很大。
在做整体分析时,我采用图表折线图方式,更加直观看出数据走势。但是我最初设想采样样本是像一条平滑曲线同样,自动生成一组相对持续数据,但是我只会生成随机数。而随机数是离散,因此,后来有机会,我但愿采用持续数据样本,重新得出更加精确成果。
总体来说,实验还是相对简朴,但是注重理解。理论与实践结合起来,加深了我对cache某些学习理解,同步,也锻炼了我自主思考,自主学习能力。例如,整体分析某些,采用不同变量成果比较办法等等。但愿在此后学习当中,继续保持,继续进步。
展开阅读全文