计算机体系结构cache模拟器实验报告文档格式.docx

上传人:b****1 文档编号:3638029 上传时间:2023-05-02 格式:DOCX 页数:18 大小:187.20KB
下载 相关 举报
计算机体系结构cache模拟器实验报告文档格式.docx_第1页
第1页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第2页
第2页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第3页
第3页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第4页
第4页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第5页
第5页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第6页
第6页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第7页
第7页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第8页
第8页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第9页
第9页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第10页
第10页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第11页
第11页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第12页
第12页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第13页
第13页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第14页
第14页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第15页
第15页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第16页
第16页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第17页
第17页 / 共18页
计算机体系结构cache模拟器实验报告文档格式.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

计算机体系结构cache模拟器实验报告文档格式.docx

《计算机体系结构cache模拟器实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《计算机体系结构cache模拟器实验报告文档格式.docx(18页珍藏版)》请在冰点文库上搜索。

计算机体系结构cache模拟器实验报告文档格式.docx

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/Noofsettag=16/8=2

以上例,字地址16为例,写成二进制为00010010B,其中组数为8,又因为2^3=8,所以字地址取后3位为:

index= 010 B =2,取前29位为:

tag=0…0010B=2。

所以,算法与理论是一致的。

(3)Valid:

有效位。

当通过上述方式寻址找到了数据存放的数据块,接下来判断有效位:

有效位为1,说明数据是有效的,可以从block提取数据;

有效位为0,说明块里的数据是无效的,所以不能从block提取数据,出现miss,此时判断miss类型,同时需要访问内存或下一级存储,将数据放到cache里。

(4)失效类型及判断方法:

判断失效类型,函数misstype(intba,intnb ,intl)。

Compulsorymiss(强制性失效,冷启动):

当第一次访问某一个块的时候,数据是肯定不在块中的,此时出现强制性失效,或者说是冷启动失效。

Capacity miss(容量失效):

所需的数据不能全部调入cache中,块被替换后又被重新访问,意思就是当所有的块都被占满了,这样又有数据希望被调入缓存时,就出现了容量失效。

Conflictmiss(冲突失效):

在组相联或直接映像中,数据想要替换进某一组中,组内的块都被占满了,但是别的组的块有空余,数据只能替换这一组,尽管别的组有空余也不能替换。

这样就出现了冲突失效。

(5)LRU算法实现替换:

LRU替换算法是采用最近最久未使用的块,其中Lru[][]数组存放最近多少次未被使用,因为是采用循环访问,当循环访问到这一组时,把这组所有的块的Lru[][]值都加1,如果成功访问到这一块,数据能从其中取出来,就把这一块的Lru[][]值置0,退出循环。

(6)直接映射、组相联映射、全相联映射:

直接映射:

是特殊的组相联映射,就是相联度为1的组相联映射。

所以采取和组相联一样的程序和算法,当识别该组第一块失效时,直接进行替换,因为有且只有一块。

组相联映射:

当识别该组某块失效时,如果块都被占满,要根据Lru[][]值的大小,判断哪一块被替换掉。

全相联映射:

从上到下cache块存数据,则从上到下循环即可,遇到失效时,要根据Lru[][]值的大小,判断哪一块被替换掉。

二、课后习题

1、习题内容

在CacheSimulator模拟器上模拟如下程序的运行过程:

inti,j,cstride,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次,也就是访问了2000次存储。

结合cache机制,cache大小为256个字节,块大小为16个字节,所以块的个数为256/16=16个。

若为2路组相连,则有16/2=8组。

当第一次访问块时,一定会发生强制性失效,计一次miss。

3、计算及结果

1)直接映像时:

●stride=132

array[0]的块地址为0,映射到cache的块号为0:

0mod16 = 0

array[132]的块地址为132/4=33,映射到cache的块号为1:

33mod16 =1

因为第一次访问cache,0和1一定会发生强制性失效,之后因为调入cache,不会发生失效。

则失效次数为2,则失效率为:

2/20000 =0.01%

ﻩ命中次数为19998次,命中率为:

ﻩﻩﻩ19998/20000 =99.99% =1(近似)

失效类型为强制性失效,次数为2。

●stride=131

array[0]的块地址为0,映射到cache的块号为0:

0modulo16 =0

array[131]的块地址为131/4=32,映射到cache的块号为0:

32modulo 16=0

因为第一次访问cache,0一定会发生强制性失效,之后cache里块号为0的块不断地被替换写入替换写入,此时发生冲突失效。

则失效次数为20000,则失效率为:

ﻩ20000/20000=1=100%

命中率为0。

失效类型为强制性失效次数1,冲突失效次数为19999。

2)2路组相联:

●stride=132

array[0]的块地址为0,映像到cache的组号为0:

0modulo8=0

array[132]的块地址为132/4= 33,映像到cache组号为1:

33 modulo8= 1

因为第一次访问cache,0和1一定会发生强制性失效,之后因为调入cache,不会发生失效。

2/20000=0.01%

命中次数为19998次,命中率为:

ﻩ19998/20000 = 99.99%=1(近似)

ﻩﻩ失效类型为强制性失效,次数为2。

●stride=131

array[0]的块地址为0,映像到cache组号为:

0modulo 8=0

array[131]的块地址为131/4 =32,映像到cache组号为:

32modulo8= 0

因为第一次访问cache,0和1一定会发生强制性失效,之后因为是2路组相联,array[0]与array[131]都在0组,不会发生失效,则失效次数为2,失效率为:

2/20000 = 0.01%

命中次数为19998次,命中率为:

ﻩﻩ19998/20000= 99.99%=1(近似)

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

misscount

 2

200

missrate

0.01

 1.00

hitcount

 198

 0

hitrate

 0.99

0

accesscount

 200

 200

c1c(强制性失效)

2

c2c(容量性失效)

c3c(冲突性失效)

 0

2路组相连映射

stride=132

stride=131

misscount

 2

miss rate

0.01

0.01

hitcount

198

198

hitrate

0.99

 0.99

accesscount

200

 200

c1c(强制性失效)

c2c(容量性失效)

可以看到实验结果与计算是一致的(因为循环次数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

256

512

1024

1

0.94

0.885

0.83

0.77

0.69

2

0.94

0.87

0.68

0.50

4

0.95

0.905

0.80

0.635

0.30

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容量(字节)

相连度/路

8

64

0.93

0.915

0.905

0.875

0.87

0.86

0.87

256

0.765

0.80

0.78

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的随机数。

相连度(路)

总失效率

总失效次数

失效类型

强制性失效

容量失效

冲突失效

0.78

156

107

38

11

160

40

13

0.765

153

107

41

5

0.785

157

45

16

0.785

157

46

 可以看出:

1.强制性失效,即冷启动,不受相连度的影响。

2.容量失效基本不受相连度影响,但因为数据偶然性,出现增大趋势。

3.冲突失效随着相连度的增加而降低。

(2)Cache容量对三种失效类型影响:

block大小为2,组相连度为4,project.txt为200个0~1000的随机数。

cache容量(字节)

失效类型(相对百分比)

186

78

128

174

107

65

0.765

153

41

512

0.64

128

13

0.535

可以看出:

1.容量越大,失效率越小。

2.强制性失效不受容量大小的影响。

3.容量失效随着容量的增加而大大减小。

4.冲突失效不受容量大小的影响。

四、实验思考和感受

1、关于模拟器的思考

Cache大小可选为16/64/128/256,因为代码写了,但是没有增加选项。

但是,我考虑因为16实在太小了,没什么意义。

打开文件名字为project.txt,修改文件名。

 个人感觉有地方不太合适,因为直接映像就是特殊的组相联映射,所以相联度一定为1,但是代码中并没有设计这一点,当一个完全不懂得人使用时,很有可能设置相联度大于1,造成错误。

另外我觉得可以把三种方式各封装在一个自己的函数里,这样代码更加清晰。

有困惑我的问题,我是通过阅读代码才比较清晰的理解cache实现的,但是模拟器给出的地址映射的方法是将数据字节地址转换为字地址,又将字地址转换为块地址,对块地址进行取模运算。

而习题1是直接对字地址进行取模运算,方法明显不一致。

通过我重新阅读习题1的题目,发现实际习题1的132/131是字地址,因为定义的intarray[]数组定义的是整数字长,所以132/131指的是地址为字地址,例如两个地址之间是一个整数字长。

2、关于整个实验的思考

这次实验是我大学做的最用心的一次实验,没有之一。

我在仔细的阅读实验代码后,知道了内存的物理地址是怎样转换为cache的块号或组号的。

我根据自己的理解,画了一个模拟寻址图,更加清晰的知道原理,理顺清楚到底是怎么一回事,收获很大。

在做整体分析时,我采用图表折线图的方式,更加直观的看出数据的走势。

但是我最初的设想采样样本是像一条平滑的曲线一样,自动的生成一组相对连续的数据,但是我只会生成随机数。

而随机数是离散的,所以,以后有机会,我希望采用连续数据的样本,重新得出更加准确的结果。

总体来说,实验还是相对简单的,但是注重理解。

理论与实践结合起来,加深了我对cache部分学习的理解,同时,也锻炼了我自主思考,自主学习的能力。

比如,整体分析部分,采用不同变量结果比较方法等等。

希望在今后的学习当中,继续保持,继续进步。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2