Cache缺失率的计算

Cache缺失率的计算

@(组成原理)

Cache缺失率的考察可以直接结合着直接映射知识点的考察,且综合性难度更大一些。

再次思考Cache的基本原理,要从读写两个角度深入思考。

Cache和主存都被分为若干大小相等的块,Cache块还可以称作Cache行。每块由若干字节组成,块的长度称为块长。由于Cache的容量远远小于主存的容量,所以Cache中的块数要远少于主存中的块数。仅仅保存主存中最活跃的若干块的副本。Cache按照某种策略,预测CPU在未来的一段时间内欲访问的数据,装入Cache。

上面这段,是对Cache设计的总览。

下面是非常重要的计算Cache缺失率的理论部分。

当CPU发出读请求时,如果欲访问地址在Cache中命中,就将此地址转换成Cache地址,直接对Cache进行读操作。与主存无关。如果Cache不命中,则仍需访问主存,并把此字所在的块一并从主存调入Cache内。 若此时Cache已满,则需要根据某种替换算法,用新的主存块替换掉原来Cache中原来的块的信息。有些时候,也可以同时访问Cache和主存,如果命中Cache,终止主存访问。访问主存慢,所以命中后就停止访问主存。CPU与Cache之间数据交换以字为单位,Cache与主存之间以Cache块为单位

关于上面这段,在计算时几乎都可以想到,但是,下面这段话,就是容易被忽略的了。

当CPU发出写请求时,如果Cache命中,则对Cache块操作。具体的写策略,主要是全写(Cache和主存同时写),和写回法(只写Cache),不立即写入主存,当主存块信息被调出Cache时才写回到主存。这两种策略都对应的是写命中的策略。全写无疑增加了访问主存的次数,所以基本都会再引入写缓冲,这样就同时写缓冲和Cache,不是写主存了。

这就是说,计算Cache命中率时要从读写两个角度同时思考。

以2016年一道真题为例,会更加明确。

(2016.15) 有如下C语言程序段:

for(int k = 0; k < 1000; k++)
{
    a[k] = a[k]+32;
}

若数组a及变量k均为int型,int型数据占4B,数据Cache采用直接映射 方式,数据区大小是1KB,块大小是16B,该程序段执行前Cache为空,则该程序段执行过程中,访问数组a的Cache的缺失率是:C
A. 1.25%
B. 2.5%
C. 12.5%
D. 25%

分析:大概很多人会倾向于选择D。原因是这里的访问数组包含两个操作:读+写。如果只考虑到读没考虑到写的问题,那么计算得到D是非常自然的,且非常自信自己得到的是正确答案。

如何分析,首先看数组共1000个int数据,就是4000B,需要占用的主存块数是4000B/16B = 250块。Cache大小是1024B,一块是16B,因此共有64块。

问题简化为250块主存块映射到64块Cache的过程。主存与Cache块的交换单位是块,也就是4个int数据。也就是第一个数据不命中,调入后剩下三个都命中。可以说25%吗?

错!看执行语句是什么。a[k] = a[k]+32

右边是读取数据,左边是写回数据。也就是对一个数据两次操作。且第一个数据读取时不命中,写Cache命中。块中剩下的三个数读写都命中,也就是一块中的4个数据的8次操作,只有一次不命中!所以不命中率是 18=12.5% .


  • 20
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值