CSAPP cache lab

csapp cache lab

这个lab就是设计一个cache-friendly的矩阵转置问题,第一个问题是模拟内存的层级之间的缓冲,使用的是LRU但是和一般写的LRU不太一样。
一开始写了个链表的LRU发现是错误的。然后看书发现并不是制作一个全局的LRU缓存算法,而是有一个工作集(set)的概念的。

看书没有看明白,不太理解为什么非得有S E T 不是很理解每个参数的联系,下面放一些视频相应部分的讲义

在这里插入图片描述

在这里插入图片描述
其实你可以输入一个代码

int tmp[10];
cout << tmp << " " << tmp + 1 << endl;

再下x86的环境下运行tmp + 1 的结果和tmp的结果相差是4,一个指针再x86不是应该是32位吗,为什么只差4呢,因为电脑的内存是以字节作为单位的,每一个索引对应的就是一个字节,因此结果也就是差4。

现在来看3个参数 s E b. 上面所述对应的就是参数b的描述,参数b表示每一个块存储了2^b字节的内存。这个参数b表示block占据了多少位。也就是说最低位也就是内存局部性的基础,你如果读取一个不在当前内存层的内容,那么你实际上是读取了 2的b次方的内存,因为缓存认为你最近会访问相邻的内存,这也直接存在缓存中下次访问就会块很多。

下图就是一个E=1的直接映射的缓存图(图明天再拍),每一个内存块对应的内存就是b个低位所有对应的内存,只要你访问相应的内存那么直接可以从这个块读取,也就是发生了一次(hit,缓存命中)。

但是怎么判断你需要的缓存是否再当前的缓存中呢 ? 可以假设它存在,那么其低b位存在再某一个块中,这个块如何找。下面就是第二个参数s,它表示有工作集占据多少位,比如s == 2 表示它可以寻址4个block,所以S = 2^s 表示分了多少个组,也就是中间的位。

假设地址是32位的,一个地址就是由这32位数唯一的对应,现在已知最低b位都是存在再某一位,然后通过s直接映射到对应的组,我去这个组里面找这个元素是否存在,于是需要tag 来确定高位是否一致。

为什么一个组要有多个行 E > 1的情况,因为这也可能造成比较大的抖动,因此需要每一组有多个行来做缓存来避免这种情况,而每一个组假如满了,我现在需要的内存又不在里面 发生了一次 MISS 我需要找一行来替换这个组,这里就是使用LRU算法,由于是模拟 记录一个虚拟的时间就可以了。真是情况应该是一个位 access来表示是否最近访问,用clock的方法来模拟一个近似LRU算法。

小结

我发现好难写啊,写的非常乱。颓了。明天上图再整理一下,这个缓存这里真的有点意思的。明天重写 打个草稿。。。。。。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值