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%
.
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% .