实验4 Cache性能分析
4.1实验目的
(1)加深对Cache基本概念、基本组织结构以及工作原理的理解。
(2)掌握Cache容量、相关度、块大小对Cache性能的影响
(3)掌握降低Cache不命中率的各种方法以及它们对提高Cache性能的好处
(4)理解LRU与随机法的基本思想以及对Cache性能的影响。
4.2实验平台
实验平台采用Cache模拟器MyCache。
4.3实验原理
(1)Cache有三种不同类型的不命中,分别为:
1)强制不命中:第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache。
2)容量不命中:程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生不命中。
3)冲突不命中:在组相联或直接映象Cache中,若太多的块映象到同一组(块)中,则该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。
(2)想要提高Cache的性能就得提高其命中率,其中有如下规则:
1)相联度越高,冲突不命中就越少
2)强制性不命中和容量不命中不受相联度的影响
3)强制性不命中不受Cache容量的影响,但容量不命中却随着容量的增加而减少。
(3)对应每种类型的不命中分别有如下解决方案:
1)强制性不命中:增加块大小,预取
2)容量不命中:增加容量
3)冲突不命中:提高相联度
(4)不同替换算法对不命中率的影响:
1)随机法(RAND法)
随机替换算法就是用随机数发生器产生一个要替换的块号,将该块替换出去,此算法简单、易于实现,而且它不考虑Cache块过去、现在及将来的使用情况,但是没有利用上层存储器使用的“历史信息”、没有根据访存的局部性原理,故不能提高Cache的命中率,命中率较低。
2)先进先出法(Firs-In-First-Out,FIFO法)
就是将最先进入Cache的信息块替换出去。FIFO算法按调入Cache的先后决定淘汰的顺序,选择最早调入Cache的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,系统开销小,其缺点是可能会把一些需要经常使用的程序块(如循环程序)也作为最早进入Cache的块替换掉,而且没有根据访存的局部性原理,故不能提高Cache的命中率。因为最早调入的信息可能以后还要用到,或者经常要用到,如循环程序。此法简单、方便,利用了主存的“历史信息”,但并不能说最先进入的就不经常使用,其缺点是不能正常反映程序局部性原理,命中率不高,可能出现一种异常现象。
3)近期最少适用法(LeastRecently Used,LRU法)
这种方法是将近期最少使用的Cache中的信息块替换出去。该算法较先进先出算法要好一些。但此法也不能保证过去不常用将来也不常用。LRU法是依据各块使用的情况,总是选择那个最近最少使用的块被替换。这种方法虽然比较好地反映了程序局部性规律,但是这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU算法相对合理,但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个称为计数器的硬件或软件模块,用以记录其被使用的情况。
4.4实验内容和实验截图
4.4.1 Cache对容量不命中率的影响
(1)启动MyCache
(2)单击“复位”按钮,把各参数设置为默认值。
(3)选择一个地址流文件。方法:选择“访问地址”→“地址流文件”选项,然后单击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。
(4)选择不同的Cache容量,包括2KB、4KB、8KB、16KB、32KB、64KB、128KB、256KB,分别执行模拟器(单击“执行到底”),在表4.1中记录各种情况下的不命中率。
表4.1 不同容量下Cache的不命中率
Cache容量 (KB) | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 |
不命中率 | 3.43% | 2.72% | 0.58% | 0.39% | 0.23% | 0.18% | 0.18% | 0.16% |
地址流文件名:tex.din
- 以容量为横坐标,画出不命中率随Cache容量变化的曲线。
(6)根据该模拟结果,你能得出什么结论?
Cache的不命中率随着Cache容量的增大而降低,但当容量增大到一定程度后如128KB,再增大Cache的容量变化就不会那么显著。
4.4.2相联度对不命中率的影响
(1)单击“复位“按钮,把各参数设置为默认值。此时Cache容量为64KB。
(2)选择一个地址流文件。方法:选择“访问地址”→“地址流文件”选项,然后单击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。
(3)选择不同的Cache相联度,包括直接映像、2路、4路、8路、16路、32路,分别执行模拟器,在下表记录各种情况的不命中率。
表4.2 当Cache容量为64KB时,不同相联度下Cache的不命中率
相联度 | 1 | 2 | 4 | 8 | 16 | 32 | |
不命中率 | 0.40% | 0.25% | 0.22% | 0.22% | 0.21% | 0.21% |
地址流文件名:spice.din
(4)把Cache容量改为256KB,重复(3)中工作,并填表4.3
表4.3 当容量为256KB时,不同相联度下Cache的不命中率
相联度 | 1 | 2 | 4 | 8 | 16 | 32 |
不命中率 | 0.30% | 0.21% | 0.21% | 0.21% | 0.21% | 0.21% |
地址流文件名:spice.din
- 以相联度为横坐标,画出在容量为64KB和256KB情况下,不命中率随Cache相联度变化的曲线。
- 根据该模拟结果,你能得出什么结论?
在Cache容量大小相同的情况下,提高相联度可以降低Cache不命中率,且Cache的容量越小,提升效果越显著。但随着相联度提到到一定程度后(4路相联),再提高相联度Cache的不命中率就不显著。
4.4.3 Cache块大小对不命中率的影响
(1)单击复位按钮,把参数设置为默认值。
(2)选择一个地址流文件。方法:选择“访问地址”→“地址流文件”选项,然后单击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。
- 选择不同的Cache块大小,包括16B、32B、64B、128B、256B,对于Cache的各种容量,包括2KB、8KB、32KB、128KB、512KB,分别执行模拟器(单击“执行到底”按钮即可执行),记录各种情况下的不命中率。
表4.4 各种大小情况下Cache的不命中率
块大小(B) | Cache容量(KB) | ||||
2 | 8 | 32 | 128 | 512 | |
16 | 7.80% | 7.40% | 7.20% | 7.20% | 7.20% |
32 | 5.40% | 5.00% | 4.70% | 4.70% | 4.70% |
64 | 4.00% | 3.40% | 3.10% | 3.10% | 3,10% |
128 | 4.40% | 3.30% | 2.40% | 2.40% | 2.40% |
256 | 6.50% | 5.10% | 2.30% | 1.90% | 1.90% |
地址流文件名:eg.din
(4)分析Cache块大小对不命中率的影响
当Cache容量一定的时候且容量小于等于64KB,若增大Cache块大小,Cache的不命中率先是下降,然后反升。而大于64KB后增加块大小会让不命中率一直下降。这是因为增加块大小会产生双重作用:
(1)增加了空间局部性,减少了强制性不命中
(2)另一方面,由于增加块大小会减少Cache中块的数目所以有可能会增加冲突不命中。
当Cache容量比较大时,第(1)种作用会超过(2)种作用,使不命中率持续下降:而当容量比较小时,第(2)种作用效果会超过第(1)种作用,反而使不命中率上升。
4.4.4替换算法对Cache不命中率的影响
(1)单击复位按钮,把各参数设置为默认值。
(2)选择一个地址流文件。方法:选择“访问地址”→“地址流文件”选项,然后单击“浏览”按钮,从本模拟器所在的文件夹下的“地址流”文件夹中选取。
(3)对于不同的替换算法、Cache容量和相联度,分别执行模拟器(单击执行到底按钮即可执行),记录各种情况下的的不命中率。
表4.5 LRU和随机替换算法的不命中率比较
Cache容量 | 相联度 | |||||
2路 | 4路 | 8路 | ||||
LRU | 随机算法 | LRU | 随机算法 | LRU | 随机算法 | |
16KB | 3.62% | 4.62% | 2.96% | 4.64% | 2.74% | 6.36% |
64KB | 1.15% | 1.60% | 0.99% | 1.52% | 0.93% | 1.53% |
256KB | 0.78% | 0.82% | 0.74% | 0.76% | 0.73% | 0.72% |
1MB | 0.71% | 0.71% | 0.70% | 0.70% | 0.70% | 0.70% |
地址流文件名:cc1.din
(4)分析不同替换算法对Cache不命中率的影响。
无论相联度是多大,在Cache容量比较小时,LRU法的不命中率低于随机法,但当Cache容量增加到一定程度之后(256KB),LRU法和随机法几乎差不多。