1、计算机体系结构cache模拟器实验报告 计算机体系结构Cache模拟器实验实验报告 姓名 崔雪莹 学号 22816 班级 计科122班 老师 董岚 2015年 06月0日一、 阅读分析附件模拟器代码 22、关键算法3二、 课后习题5、习题内容 52、题目分析53、计算及结果64、模拟器上实验结果检验 7三、 整体分析 、三种映射方式对Cache效率的的影响8、blc块大小与Cace容量对che效率的影响3、Cc容量与相连度对Cahe效率的影响 91、关于模拟器的思考 102、关于整个实验的思考1一、阅读分析附件模拟器代码1、关键参数(1)用户可见参数:(用户通过命令行输入参数)参数名含义值备注
2、chice映像方式选项1/2/1为直接映射,2为组相连映射,3为全相连映射cacesizeCach大小16/18256以字节为单位lckszock大小1/24以字为单位assoc相连度1/2/16ssoc路组相连(-way)accescount请求次数待输出等于projt.txt的值个数hicnt命中次数待输出成功在Cache找到次数hrate命中率待输出itae= hicount/accesscountmiso未命中次数待输出没在Cach找到次数misscot= 1hitcountmissrate未命中率待输出MsRate= mcon/aesscounc1c ,cc ,3c失效次数待输出分别
3、为三种失效类型的次数(2)程序内部主要参数:(代码内部重要参数)参数名含义计算备注blockinbe块的字节大小=lockze*4每一个块占多少字节NOofloc块个数=chsiz/bocinbytach中多少个块NOofet组个数=Oofblok/asoc块分成了多少个组byearray要访问的数据的字节地址projectx中的值poject.x文件数据赋给了ytearay数组wodress要访问的数据的字地址=ytarray/4blkize是字为单位的,就是说一个block占多少个字,所以数据也要求字地址lcadres数据的块地址wordaddress/bloksize数据在第几块inde
4、x索引位(组地址)=bckadrsj%Ooset若Nooet=2m,则块地址低m位为索引位(组地址)。tg标识位(组内寻址)blokaddress/NOoset块地址高(3-m)位为标识位,用于确定组内哪块数据,narandez1中存放alid有效位有效为,失效为0判断该ce块数据是否有效*是因为没有真正定义,只是存放nerayind中lridexz最近未被使用次数每次加,被重写置0替换时,替换掉lridex值最大的那个块、关键算法注:这里不粘贴代码,只是进行简单的代码算法说明(1)块地址表示:注:图是我按照自己的想法自己画的,可能有些地方并不准确,望老师指正。图中以一个例子来解释cae模拟器
5、中block和数据地址的关系,以及和组地址和标志位的关系。 (2)Ie与tg:由上面计算:inde blocdress % NOofseidx = 16 % 8 = 2tag blockddre / Noofset ag= 6/8 2以上例,字地址为例,写成二进制为010010B,其中组数为8,又因为3=8,所以字地址取后3位为:inex= 01 =2 ,取前2位为:a = 000B = 2 。所以,算法与理论是一致的。(3)Vid:有效位。当通过上述方式寻址找到了数据存放的数据块,接下来判断有效位:有效位为1,说明数据是有效的,可以从bock提取数据;有效位为0,说明块里的数据是无效的,所以
6、不能从block提取数据,出现mss,此时判断is类型,同时需要访问内存或下一级存储,将数据放到cache里。(4)失效类型及判断方法:判断失效类型,函数misstype(nt ba,int n ,int )。Comulo ms(强制性失效,冷启动):当第一次访问某一个块的时候,数据是肯定不在块中的,此时出现强制性失效,或者说是冷启动失效。Cpciy mis(容量失效):所需的数据不能全部调入cach中,块被替换后又被重新访问,意思就是当所有的块都被占满了,这样又有数据希望被调入缓存时,就出现了容量失效。Confictss(冲突失效):在组相联或直接映像中,数据想要替换进某一组中,组内的块都被
7、占满了,但是别的组的块有空余,数据只能替换这一组,尽管别的组有空余也不能替换。这样就出现了冲突失效。(5)LRU算法实现替换:LR替换算法是采用最近最久未使用的块,其中ru数组存放最近多少次未被使用,因为是采用循环访问,当循环访问到这一组时,把这组所有的块的Lru值都加1,如果成功访问到这一块,数据能从其中取出来,就把这一块的ru值置0,退出循环。(6)直接映射、组相联映射、全相联映射:直接映射:是特殊的组相联映射,就是相联度为1的组相联映射。所以采取和组相联一样的程序和算法,当识别该组第一块失效时,直接进行替换,因为有且只有一块。组相联映射:当识别该组某块失效时,如果块都被占满,要根据Lu值
8、的大小,判断哪一块被替换掉。全相联映射:从上到下che块存数据,则从上到下循环即可,遇到失效时,要根据ru值的大小,判断哪一块被替换掉。二、课后习题1、习题内容在CachSulato模拟器上模拟如下程序的运行过程:nt,,cstrid,aray256 o(i0;i1000;+) for(=0;j256;j=jstid) c = arraj5;假设Cac总大小是56个字节,且块大小为1字节(4个字)。同时假设内存当中只有这一个程序在运行,而且整形数字的长度为一个字长(字长为3位),在直接相连映射下,stribe分别等于13、11时程序的运行结果,并分析原因。而当采用两路组相连时又会有什么结果并分
9、析原因。2、题目分析当strie = 13/31时,程序相当于循环访问内存偏移地址为和地址32/3的内容,循环100次,也就是访问了次存储。结合che机制,cche大小为256个字节,块大小为16个字节,所以块的个数为25/16 = 16个。若为2路组相连,则有16/2 8组。当第一次访问块时,一定会发生强制性失效,计一次miss。3、计算及结果1)直接映像时:stri=132ar0的块地址为0,映射到che的块号为0:0 mod 16=0ra13的块地址为124 = 33,映射到che的块号为:3mod16 = 1因为第一次访问cache,和1一定会发生强制性失效,之后因为调入ahe,不会发
10、生失效。则失效次数为2,则失效率为: /2000 0.01% 命中次数为19998次,命中率为: 199/2000=99.9% 1(近似)失效类型为强制性失效,次数为2。strde=13array0的块地址为0,映射到ache的块号为0:0 dulo1 0ray13的块地址为131/ 3,映射到ch的块号为0:32 modulo 6 = 0因为第一次访问cache,0一定会发生强制性失效,之后cch里块号为的块不断地被替换写入替换写入,此时发生冲突失效。则失效次数为200,则失效率为: 20/000 = 1= 100%命中率为0。失效类型为强制性失效次数1,冲突失效次数为199。2)2路组相联
11、:strid=1arry0的块地址为,映像到ach的组号为0:0dulo8 = 0aa132的块地址为13/4 = 3,映像到cache组号为1:33 odulo8 = 1因为第一次访问cache,0和1一定会发生强制性失效,之后因为调入cah,不会发生失效。则失效次数为2,则失效率为:2/000 = %命中次数为19998次,命中率为: 199982000=99.9 = 1(近似) 失效类型为强制性失效,次数为2。ride131ara0的块地址为0,映像到ache组号为:0 modl 0array3的块地址为131/4 = 3,映像到cache组号为:3 modulo = 因为第一次访问ca
12、he,0和1一定会发生强制性失效,之后因为是2路组相联,array0与array131都在0组,不会发生失效,则失效次数为2,失效率为:/200 = 0.01%命中次数为199次,命中率为: 999820000 999%=1(近似)失效类型为强制性失效,次数为2。4、模拟器上实验结果检验注:因为例题的循环次数为000,为了便于实验,我将循环次数设置为00,结果参照100的计算,原理是一致的。因为实际11/13都是字地址,而roect.tx设置的是字节地址,所以将oject.tt里值设置为 和2*4/13*4循环次,设置cche大小为26,lck大小为4,可以分别看到直接映射和2路组相连映射的结
13、果为:直接映射tride2std=131s count2 200miss ra 0.0 .00htcount18 0hit rae 0.990accesscoun 200 200c1(强制性失效) 2c(容量性失效) 0 0c3c(冲突性失效)0 12路组相连映射srie=13tri=1miss unt2 2mis rte.0101htcunt8198hit ate 09 0.99accesscunt20200c1c(强制性失效) 22c2c(容量性失效)00c3c(冲突性失效) 可以看到实验结果与计算是一致的(因为循环次数10,所以实验结果小数点要后移两位)。同时对习题1的思考(见后)也证明
14、是正确的。(1)直接映射:tide 32 截图(2)直接映射:tide 13 截图(3)2路组相连:stide = 132 截图(4)2路组相连:strde3 截图三、整体分析1、三种映射方式对ache效率的的影响其他相同条件:bloc大小为,组相连相连度为4,prec.tt为00个0100的随机数。ce容量(字节)映射方式直接映射组相连全相连640.940.930.25180.870.8750.65256070.790.7855120.0.630.611024.0000.50 生成图表:此时可以看到:1.直接映射的失效率高,组相连失效率中等,全相连失效率最低2.随着ahe容量的增加,失效率越
15、小。3.当cache容量为14时,因为数据取值的原因,三种方式失效率相等,说明当cche容量足够大,三种方式失效率是一样的。2、loc块大小与ac容量对Cache效率的影响其他相同条件:直接映射,相连度为1,project.txt为200个00的随机数。块大小(字)Cach容量(字节)6412825652024.940.8850.30.770.6920.40.870.79.60.504.95.9050.800.635.3.95.890.7850.750.5 生成图表:此时可以看到:1.对于给定的cach容量如64字节,当块大小增加时,失效率先是下降,后来反而上升了。2.Cach容量越大,使其失
16、效率达到最低的块的大小就越大。3.因为取得数据样本是随机的,不是连续的,实验数据并不是十分准确,比如ce容量8时,块大小出现两次失效率3、Cache容量与相连度对che效率的影响其他相同条件:组相连,块大小,roct.tt为200个0100的随机数。Cace容量(字节)相连度/路1480.940.930.9150.90512885.87.860.256.850.6508007820.645060.670.660205350.5.5350.535生成图表:此时可以看到:1.提高相连度会使失效率下降。2.因为取得数据样本是随机的,不是连续的,实验数据并不是十分准确。3.当容量为124时,也就是cc
17、一定大时,失效率没什么区别。4、三种失效类型影响因素(1)相连度对三种失效类型影响:其他相同条件:cche大小为56,bloc大小为2,组相连,proecttx为200个0000的随机数。相连度(路)总失效率总失效次数失效类型强制性失效容量失效冲突失效10.71561011080101074134.765151074580.7857107455.5157107464 可以看出:1.强制性失效,即冷启动,不受相连度的影响。2.容量失效基本不受相连度影响,但因为数据偶然性,出现增大趋势。3.冲突失效随着相连度的增加而降低。(2)Cach容量对三种失效类型影响:其他相同条件:lock大小为2,组相连
18、度为,projectxt为20个000的随机数。ache容量(字节)总失效率总失效次数失效类型(相对百分比)强制性失效容量失效冲突失效40.1861081128.8717417625075151415510.62810713810240535110700可以看出:1.容量越大,失效率越小。2.强制性失效不受容量大小的影响。3.容量失效随着容量的增加而大大减小。4.冲突失效不受容量大小的影响。四、实验思考和感受1、关于模拟器的思考 Cche大小可选为/6428/256,因为代码写了,但是没有增加选项。但是,我考虑因为6实在太小了,没什么意义。打开文件名字为projt.xt,修改文件名。 个人感觉
19、有地方不太合适,因为直接映像就是特殊的组相联映射,所以相联度一定为1,但是代码中并没有设计这一点,当一个完全不懂得人使用时,很有可能设置相联度大于1,造成错误。另外我觉得可以把三种方式各封装在一个自己的函数里,这样代码更加清晰。 有困惑我的问题,我是通过阅读代码才比较清晰的理解cache实现的,但是模拟器给出的地址映射的方法是将数据字节地址转换为字地址,又将字地址转换为块地址,对块地址进行取模运算。而习题1是直接对字地址进行取模运算,方法明显不一致。通过我重新阅读习题的题目,发现实际习题1的132/31是字地址,因为定义的 rray数组定义的是整数字长,所以13/指的是地址为字地址,例如两个地
20、址之间是一个整数字长。、关于整个实验的思考这次实验是我大学做的最用心的一次实验,没有之一。我在仔细的阅读实验代码后,知道了内存的物理地址是怎样转换为cach的块号或组号的。我根据自己的理解,画了一个模拟寻址图,更加清晰的知道原理,理顺清楚到底是怎么一回事,收获很大。在做整体分析时,我采用图表折线图的方式,更加直观的看出数据的走势。但是我最初的设想采样样本是像一条平滑的曲线一样,自动的生成一组相对连续的数据,但是我只会生成随机数。而随机数是离散的,所以,以后有机会,我希望采用连续数据的样本,重新得出更加准确的结果。总体来说,实验还是相对简单的,但是注重理解。理论与实践结合起来,加深了我对che部分学习的理解,同时,也锻炼了我自主思考,自主学习的能力。比如,整体分析部分,采用不同变量结果比较方法等等。希望在今后的学习当中,继续保持,继续进步。