分析影响cache命中率的因素.docx
《分析影响cache命中率的因素.docx》由会员分享,可在线阅读,更多相关《分析影响cache命中率的因素.docx(13页珍藏版)》请在冰豆网上搜索。
![分析影响cache命中率的因素.docx](https://file1.bdocx.com/fileroot1/2022-12/28/48373655-2385-4606-b767-f105a3139229/48373655-2385-4606-b767-f105a31392291.gif)
分析影响cache命中率的因素
分析影响cache命中率的因素
摘要:
存储器是计算机的核心部件之一。
由于CPU和主存在速度上的存在着巨大差异,现代计算机都在CPU和主存之间设置一个高速、小容量的缓冲存储器cache。
而它完全是是由硬件实现,所以它不但对应用程序员透明,而且对系统程序员也是透明的。
Cache对于提高整个计算机系统的性能有着重要的意义,几乎是一个不可缺少的部件。
关键字:
cache容量;失效率;块大小;相联度;替换策略。
一、概述
存储器是计算机的核心部件之一。
其性能直接关系到整个计算机系统性能的高低。
如何以合理的价格,设计容量和速度都满足计算机系统要求的存储器系统,始终是计算机系统结构设计的中关键的问题之一。
计算机软件设计者和计算机用户对于存储器容量的需求是没有止境的,他们希望容量越大越好,而且要求速度快、价格低。
仅用单一的存储器是很难达到这一需求目标的。
较好的方法是采用存储层次,用多种存储器构成存储器的层次结构。
其中“cache-主存”和“主存-辅存”层次是常见的两种层次结构,几乎所有现代的计算机都同时具有这两种层次。
我们都知道,程序在执行前,需先调入主存。
在这里主要讨论的是“cache-主存”层次。
“cache-主存”是在为了弥补主存速度的不足,这个层次的工作一般来说,完全是由硬件实现,所以它不但对应用程序员透明,而且对系统程序员也是透明的。
如前所述,为了弥补CPU和主存在速度上的巨大差异,现代计算机都在CPU和主存之间设置一个高速、小容量的缓冲存储器cache。
Cache对于提高整个计算机系统的性能有着重要的意义,几乎是一个不可缺少的部件。
Cache是按块进行管理的。
Cache和主存均被分割成大小相同的块。
信息以块为
单位调入cache。
相应的,CPU的访存地址被分割成两部分:
块地址和块内位移。
在这里的cache专指CPU和主存之间的cache。
对Cache的性能分析可以从三个方面进行:
降低失效率、减少失效开销、减少Cache命中时间。
这里主要是用实验数据分析影响cache命中率的因素。
1.按照产生失效的原因不同,可以把Cache失效分为三类:
(1)强制性失效(Compulsorymiss)
当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性失效。
这种失效也称为冷启动失效或首次访问失效。
(2)容量失效(Capacitymiss)
如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生失效。
这种失效称为容量失效。
(3)冲突失效(Conflictmiss)
在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。
这就是发生了冲突失效。
这种失效也称为碰撞失效(collision)或干扰失效(interference)。
降低Cache失效率的方法:
增加Cache块大小、提高相联度、VictimCache、伪相联Cache、硬件预取技术、由编译器控制的预取和编译器优化。
2.替换算法:
(1)先进先出法(FIFO);
(2)随机法:
为了均匀使用一组中的各块,这种方法随机地选择被替换的块。
(3)最近最少使用法LRU(LeastRecentlyUsed):
选择近期最少被访问的块作为被替换的块。
但由于实现比较困难,现在实际上实现的LRU都只是选择最久没有被访问过的块作为被替换的块。
二、对影响Cache失效率因素的分析
1.对矩阵200*200的乘法进行测试,源代码test.c如下:
#include
#definer200
#definel200
main()
{inti=0,j=0,k=0,m=1,n=1;
inta[r][l],b[l][r],c[r][r];
for(inti=0;ifor(intj=0;j{
a[i][j]=1;
b[i][j]=n;
n++;
}
for(intk=0;k{
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
}
注意:
必须将代码存储在SimpleScalar的文件下。
运行命令:
./.bin/sslittle-na-sstrix-gcctest.c
./simplesim-3.0/sim-cachea.out
2.Cache容量对性能影响
(1)容量配置
在命令行对SimpleScalar模拟器的一级数据的容量进行配置,在配置的过程中,保证cache块大小、相联度、替换策略参数不变。
通过改变组数来改变Cache的容量大小,执行程序,具体运行结果及相应的配置参数如下表1所示。
表1:
Cache容量对性能影响
上表相应的折线图如下所示:
图1:
Cache容量对性能影响
(2)结果分析
从图1中我们可以看出,随着Cache的容量不断增加,程序的失效率不断降低。
由此可见,Cache的容量对于Cache性能有着重要影响。
一般来说,容量越大,Cache性能越好,发生失效的概率就越低。
3.Cache块大小对性能的影响
(1)块大小配置
在命令行对SimpleScalar模拟器的一级数据的块大小进行配置,在配置过程中,相联度、替换策略等参数,对于容量固定为8k、16k、32k,64k,分别改变cache块大小,执行程序,具体运行结果及配置参数如下表表2—6所示
表2:
Cache块大小对性能影响
图2:
Cache块大小对性能影响
表3:
Cache块大小对性能影响
图3:
Cache块大小对性能影响
表4:
Cache块大小对性能影响
图4:
Cache块大小对性能影响
表5:
Cache块大小对性能影响
图5:
Cache块大小对性能影响
经过测试,我们得到各个容量下,失效率随块大小的变化情况。
具体如下所示:
表6:
Cache块大小对性能影响
上表相应的折线图如下所示
图6:
Cache块大小对性能影响
(2)结果分析
从图6中我们可以看出各个容量下失效率随块大小的变化情况。
每条不同颜色的曲线代表在某一Cache容量下,失效率随块大小的变化情况。
从图中可以发现两点规律:
(1)对于给定的Cache容量,当块大小增加时,失效率开始时处于下降趋势,后来反而会上升。
(2)Cache容量越大,会使失效率达到最低的拐点的块大小增大。
在这里,导致失效率先下降后上升的原因在于增加块大小产生双重作用。
一方面会减少强制性失效,因为程序局部性原理,增加块大小增加了利用空间局部性的机会;另一方面,在容量一定情况下,增加块大小会减少总的块数目,会增加冲突失效,在Cache容量较小时,还可能增加容量失效。
刚开始增加块大小时,由于块大小还不是很大,上述第一种作用超过第二种作用,使失效率降低。
当块大小增加到一定程度时,第二种作用会超过第一种作用,使失效率上升。
4.Cache相联度对性能的影响
(1)相联度进行配置
在命令行对SimpleScalar模拟器的一级数据的相联度进行配置,在配置过程中,保证cache块大小、容量、替换策略参数不变,改变相联度,执行程序,具体运行配结果及其置参数如下表7—11所示。
表7:
Cache相联度对性能影响
图7:
Cache相联度对性能影响
表8:
Cache相联度对性能影响
图8:
Cache相联度对性能影响
表9:
Cache相联度对性能影响
图9:
Cache相联度对性能影响
表10:
Cache相联度对性能影响
图10:
Cache相联度对性能影响
经过测试,我们得到各个容量下,失效率随块大小的变化情况。
具体如下图所示:
表11:
Cache相联度对性能影响
图11:
Cache相联度对性能影响
(2)结果分析
在容量固定的情况下,将相联度从1变化到16,组数也随之发生了变化。
在图11中,通过对比我们可以发现,无论容量是8KB或者是64KB,在相联度为2以后的数据中,失效率不再随着相联度的变化而改变,反而稳定在一个固定的水平上。
从上述实验结果可以发现,相联度的增加在一定的范围内可以促进Cache性能的改善,但这个范围非常有限,仅在1路、2路组相联上起作用。
5.Cache的替换策略对性能的影响
(1)配置替换策略
改变SimpleScalar模拟器的一级数据cachedl1的替换策略进行配置,在配置过程中,将Cache的块大小固定为32byte,相联度固定为2,对于2k、4k、8k,16k,分别改变替换策略,执行程序,具体运行配置参数如下表12—16所示。
表12:
Cache替换策略对性能影响
图12:
Cache替换策略对性能影响
表13:
Cache替换策略对性能影响
图13:
Cache替换策略对性能影响
表14:
Cache替换策略对性能影响
图14:
Cache替换策略对性能影响
表15:
Cache替换策略对性能影响
图15:
Cache替换策略对性能影响
经过测试,我们得到各个容量下,失效率随块大小的变化情况。
具体如下图所示:
表16:
Cache替换策略对性能影响
图16:
Cache替换策略对性能影响
(2)结果分析
从图16中我们可以发现,在Cache容量较小的情况下,随机策略相对较好,而随着Cache容量的增加,最近最少使用(LRU)和先进先出(FIFO)策略的效果较好。
所以一般的计算机默认的采用LRU替换策略。
由于主存中的块比Cache中的要多,所以当要从主存调入一个块到Cache中时,会出现该快所映像到的一组Cache块已被占用的情况。
这是需要强制其中的一块移出Cache,以接纳新的Cache块。
这就需要替换策略选择替换的块。
替换策略主要是在对Cache块进行淘汰时,如何选择要替换的块的策略。
目前主要又三种替换策略:
最近最少使用(LRU)策略、先进先出(FIFO)策略、随机(RANDOM)策略。
这三种替换策略各有优劣。
好的替换策略会将使用率高的Cache块更长时间的驻留在Cache中,从而降低Cache失效率,提高Cache性能。