CSAPP:缓存实验

前言

  • 本文用于记录之前做实验的一些信息,可能思路有些凌乱,谨慎参考!

搭建环境与分析脚本

  1. 实验valgrind安装
    先将这个文件拖动到64位的ubuntu系统进行解压(注意:在ubuntu下解压而非在window下解压)在这里插入图片描述,将解压后的文件在终端打开,输入./configure make make install安装;不知道为什么安装失败了,所以尝试了下面的方法
    或者输入sudo apt install valgrind安装成功;输入valgrind --version显示版本信息检查是否安装成功
    在这里插入图片描述
  2. 学会PartA部分参考引用csim-ref模拟器使用命令行参数及使用方法
    该模拟器有使用的命令行参数有./csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile>
    -h:打印使用信息的可选帮助标志
    -v:显示跟踪信息的可选详细标志
    -s (s):集合索引位数(S=2^s是集合数)
    -E :相关性(每组的行数)
    -b :块位数(B = 2^b是块大小)
    -t :重新显示valgrind追踪函数的名称
    使用方法
    linux> ./csim-ref -s 4 -E 1 -b 4 -t traces/yi.trace可以打印出
    hits:4 misses:5 evictions:3
    linux> ./csim-ref -v -s 4 -E 1 -b 4 -t traces/yi.trace可以打印出详细信息
    在这里插入图片描述
  3. 认识yi.trace中各项(I, L, S, M)操作含义,并运行在缓存模型(参数-v -s 4 -E 1 -b 4)上,能逐条分析trace文件操作且对比LRU(最近最少使用的)替换策略,能分析hit、miss、eviction结果产生过程
    I表示指令负载,L表示数据负载,S表示数据存储,M表示数据修改
    L 10对于地址0x10进行访问:(标蓝的表示组索引)
    0x10=0000…0001 0000,块偏移值为最低四位,故组索引s=1;一开始的时候cache是空的,因此第一次访问的时候为miss。
    执行指令M 20,连续对地址0x20进行连续两次访问:0x20=000…0010 0000,组索引s=2;
    所以第一次访问的时候没有要的内容,访问结果为miss;然后cache从低一级存储器读取第一次访问需要的内容,第二次访问的时候有需要的内容且标记位相等,所以第二次访问的时候结果为hit;
    L 22对地址0x22进行访问:0x22=000…0010 0100,组索引s=2;由于操作2以将该块存入高速缓存且标记位都相等,故结果为hit;
    S 18对地址0x18进行访问:0x18=000…0001 1000,组索引s=1;由于之前的操作,该块已存入高速缓存且标记位都为0,故访问结果为hit
    L 110对地址0x110进行访问:0x110=000…0001 0001 0000 故组索引s=1;操作4将该块存入高速缓存了但标记位不相等,故访问结果为miss,发生一次eviction;
    L 210对地址0x210进行访问:0x210=000…0010 0001 0000,故组索引s=1,这里标记位为2跟操作5读取新的行的标记位不匹配,故访问结果为miss,cache读取新的行,发生一次eviction。
    M 12对地址0x12进行连续两次访问:0x12=000…0001 0010,组索引s=1;第一次访问结果为miss,因为在操作6的时候发生了一次行替换把该块驱逐了即使标记位相等,cache重新读取该块,发生一次eviction,那么第二次肯定为hit。(跟操作1类似的)
    故总共:hits=4 ; miss=5;eviction=3;
    在这里插入图片描述

创建与释放缓存

  1. 编写解析输入参数get_Opt()函数体,参考csim-ref容错(-h选项)的帮助信息打印helpPrint(), 及检查命令行输入参数合法性的cheeckOptArg()【原型1】
    在这里插入图片描述
    在这里插入图片描述
  2. 编写创建和始放部分代码的程序。初始化模拟缓存initCache()处理获取组数行数,分配组内存,分配行内存并清零有效位和Lru计数值;释放内存函数freeCache()(先行后组)【原型2】
    在这里插入图片描述
  3. 检验主函数代码编写和结果分析。要求有显示各组信息putSets()函数。能在错误输入命令行参数是输出帮忙信息。
    在这里插入图片描述
    在这里插入图片描述

任务二

  1. 编写更新Lru计数值的函数代码。当某组中的某行hit或加载缓存成功时将这一行的Lru计数值赋值为最大值,而该组中其他行Lru计数值全部减一。
    在这里插入图片描述

  2. 编写查找某组中牺牲行的函数代码。遍历找出这组的Lrui计数值最小的一行,作为牺牲行
    在这里插入图片描述

  3. 编写命中判断的函数代码。命中要符合:组索引匹配、标记位相同且该行有效位为1。命中后更新Lru计数值。[原型1]
    在这里插入图片描述

  4. 编写更新高速缓存cache的函数代码。L、S、M操作时会使用本函数,判断组是否满来分为牺牲行或不牺牲行。组的每行的有效位全为1表示全满。加载新的数据块要更新有效位为1,更新标记位,更新Lru计数值。[原型2]
    在这里插入图片描述

  5. 检验LRU主函数代码编写与结果分析。假设cache模型(如s1E2b2);判定不命中时调用更新cache的Lru运行脚本函数(参数为缓存指针、组号、标记位) ;逐行显示各组情况的函数。能在一段Lru运行脚本后通过输出信息检验出正常LRU算法行为。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    初始化cache的时候valid=0,LruNumber=0,根据s=1得到缓存有两组,E=2得到每组有两行;运行runLru函数,令组号为0,tag=3,发现此时ismiss=1,所以没有命中,说明此时缓存中没有与之相同的数据,故将数据加载到第一行;valid=1,tag=3,LruNumber=999,其他行的LruNumber=-1;

  6. 编写加载数据的L命令处理函数代码。注意getopt详细模式(-v选项)时,需要打印出相应结果miss或hit或eviction
    在这里插入图片描述

  7. 编写存储数据的S命令处理函数和修改数据的M命令处理函数[原型1]
    在这里插入图片描述

  8. 编写获取trace脚本操作地址中的组索引与标记位的函数。[原型2] /获取地址中的组索引/
    在这里插入图片描述

  9. 检验LRU主函数代码编写与结果分析。在之前csim. c基础上, 进一步编写主函数:用fscanf ()函数读取trace文件并分支处理LSM命令;最后要调用printSummary()输出hit、miss和eviction各项总数以及释放内存。make 后比较csim与csim-ref在缓存s4E1b4模型上运行yi. trace脚本结果
    在这里插入图片描述
    在这里插入图片描述
    两个函数的命中、不命中、牺牲次数一样

跟踪与分析实例转置函数

  1. 实验test-trans, 以M32N32矩阵为例,并通过csim-ref详细选项(-v)在缓存跟踪trace. f文件中观察结果
    将目录切换至cachelab-handout所在目录下,输入”make”+”./test-trans -M 32 -N 32”
    在这里插入图片描述
  2. 编写csim.c处理本条命令行同时输出显示标记位和组号
    在这里插入图片描述
    在这里插入图片描述
  3. 实验test-trans以M4N4矩阵为例,并分析示例函数miss过多原因。利用csim模拟器详细模式输出结果;利用L和S地址来定位16个L和S操作;记录各命令行对应的数组A和B元素标号(如A[0][1]) ;结合组号、标记位和缓存操作的结果(hit或miss eviction) 分析conflict miss产生原因。注意:数组B和A相同的下标元素是映射到缓存中同一个组
    在这里插入图片描述
    可以观察到L、S成对出现16次,这说明着一次是对数组A进行操作,一次是对数组B进行操作,数组A、B均为4x4的二维数组
    分析原因:miss过多的原因是在访问两个数组的过程中存在太多的冲突不命中,而造成传统不命中的原因是B数组与A数组中下标相同的元素会映射到同一个cache块,如上述的2~6步骤,就是不断地发生了冲突不命中

分块编写N32装置

  1. 实验test-trans 以M32N32矩阵为例,并分析示例函数miss过多原因。跟踪结果输出在文件上(>****. txt选项) ;结合trace中一部分命令行(如A[0][0]B[0][0]~ A[0][9]B[9][0])组号、标记位和缓存操作的结果(hit或miss eviction) 分析数组A按行访问miss产生原因和数组B按列访问miss产生原因。
    分析:示例函数miss过多原因是在访问两个数组的过程中存在太多的冲突不命中以及初始化的时候缓存是空的,所以会产生很多的cold miss(冷不命中),而造成传统不命中的原因是B数组与A数组中下标相同的元素会映射到同一个cache
    在这里插入图片描述
    在这里插入图片描述
  2. 分別按4和8分块编写transpose_ submit()代码,记录test-trans以M32N32矩阵下miss数目结果;进一步编写代码重新处理相同下标的对角线上元素来再次优化;列表记录数组B第一个88块写操作命中情况。
    (1) 4分块和8分块(第一张为4分块的结果,第二张为8分块的结果)
    在这里插入图片描述
    在这里插入图片描述
    重新处理相同下标的对角线上元素来再次优化
    在这里插入图片描述
    数组B第一个8
    8块写操作的命中情况:
    在这里插入图片描述
  3. 分析采用分块技术后miss改善原因。按4分块编写transpose_ submit() 代码,记录test-trans以M32N32矩阵下miss数目结果,以两个44为例分析hit增多原因。注意:加载84的矩阵A,存储到4*8的矩阵B。
    分析:要减少miss数,自然就是要解决冲突不命中的问题。冲突不命中实际上就是在访问同一个块中的两个元素的时候,由于中间访问了其它的块,导致已经加载的块被驱逐,进而第二次访问时不命中。基于这个原因,我们可以一次性访问同一个块中的多个元素,访问完以后便不再需要访问这个块了,从而可以大大地减少冲突不命中的数目。
    按4分块,misses:487
    在这里插入图片描述
    在这里插入图片描述
    分析:没有充分利用被访问过的块,导致一个需要被多次加载,产生冲突不命中。

分块编写N64和N67转置

  1. 实验test-trans以M64N64矩阵为例,编写代码优化trans. c中转置函数,采用8分块处理过程和记录miss结果。注意:在前一次trans. c基础上添加代码。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 追踪分析M64N64的组索引,分析8分块优化处理过程。
    用trace文件得到的组索引如下:
    在这里插入图片描述
    一个cache中的组索引,每一个格子代表着一个组
    分析(以16*16矩阵进行8分块转置为例):
    1、对A数组按行进行访问时,由于左下和右上区域之间没有相同的块,所以每个块只有一次不命中;
    2、对B数组进行访问时:
    (1)将右上区域的前4行全部存入左下区域的前4行,这个过程右上区域前4行的前4列已经转置完成,但是对于前4行的后4列还没有放入应该放的位置,但是为了不再访问同一个块,我们同时将数据取出,存入还没有用到的区域中。
    for(i=0;i<4;i++)
    (array[i][8]array[i][15])–>(array[8+i][0]array[8+i][7])
    (2)逐行进行后4行前4列的转置,同时,前4行的后4列也转置完成;
    for(i=0;i<4;i++)
    {
    (array[8+i][4]array[8+i][7])–>(array[12+i][0]array[12+i][3]);
    (array[4][8+i]array[7][8+i])–>(array[8+i][4]array[8+i][7]);
    }
    (3)逐行访问后4行后4列。
    for(i=0;i<4;i++)
    (array[4+i][12]array[4+i][15])–>(array[12][4+i]array[15][4+i]);
    对于B数组中的每一个块的元素,只有一个不命中
  3. 编写代码优化M61N67的trans.c,尝试更多的分块并记录miss数目减少结果,选取其中较好方案。注意:在前一次trans. c基础上添加代码。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

总结

  1. ./csim-ref [-hv] -s <s> -E <E> -b <b> -t <tracefile>用于统计miss、hit、evction的(详细)情况
  2. ./test-csim用于比较所写的模拟器与参考模拟器的性能情况
  3. ./test-trans -M <M> -N <N>用于测试登记的transpose_submit函数中M*N矩阵的miss、hit、eviction的情况
  4. ./driver.py用于检测PartA模拟器和Part B转置函数的性能
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值