多核Cache替换策略实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:多核Cache替换算法研究实验报告
一、实验背景
1.实验要求
设计新的多核cache替换算法
使用CRC模拟器及老师提供traces对算法进行测试
分析实验结果。
2.实验环境简介
CRC(CacheReplacementCompetition)是一个模拟Cache替换的环境,运行于linux32位或64位操作系统系下,通过对其中replacement_state.cpp和replacement_state.h两个文件进行编写完成不同Cache替换算法的测试。
3.实验过程
a)配置CRC模拟器环境
b)在CRC目录下新建一个trace目录,包括单核及多核
c)研究并实现算法DIP-SD
d)测试单核、多核(四核为佳),其中单核参数UL3:1024:64:16,4核参数UL3:4096:64:16
e)根据CPI及LLCMisses分析实验结果
二、本组算法思想
多核处理器通常包含多级Cache,L1Cache与核耦合紧密,多为各处理器核私有;最后一级Cache(LLC)及更高层次Cache则多为大容量Cache,组织方式比较多样,是访存能否在片上命中的最后一道屏障,因此Cache资源管理的研究多集中在LLC上。
1.传统LRU算法
传统的LRU替换策略在片上Cache中被广泛使用,对于高局部性工作集有很好的性能,但是LRU替换策略仅仅考虑数据块的最近访问的信息,却不关心数据块被访问的频率,当Cache容量小于程序的工作集时,Cache也会表现出抖动现象(即发生冲突缺失:被替换出Cache的数据块被不断的换进换出Cache),会导致计算机性能下降。这是因为替换前后的数据有一定的相关性,LRU的替换原则是将新数据放到MRU上。这样一来,可能被替换出去的数据可能马上就又会被用到,而很多没有被替换的LRU位置上的数据实际上并不可能总是被用到,所以cache的访问需要再次访问内存。
2.本次实验实现的算法
本次实验共完成了Bubble、LIP、BIP及DIP-SD这几种算法,下面将分别阐述这几种算法的思想。
2.1.Bubble(冒泡替换算法)[1]
冒泡替换算法将数据块被访问的频率和访问的最近信息考虑在内。冒泡替包括插入策略、推进策略和替换策略。为每个Cache组(set)设置一个队列,把这个队列称之为冒泡队列。插入策略是指一个将要被调入Cache的数据块放在冒泡队列的底部,因为它仅仅被访问一次,且小于所有其它的数据块被访问的次数。
推进策略是指当一个数据块命中时,命中的数据块就和其上方相邻的数据块交换其位置;如果命中的数据块已经是队列的最顶端了,则保持其位置不变。推进策略移动经常被访问的数据块到冒泡队列的顶端,移动不经常被访问的数据块到冒泡队列的底部。因为最近被访问的数据块,逐步向冒泡队列的顶端推进(逐渐远离冒泡队列的底部),所以同时考虑到了数据
块被访问频率和最近访问信息。
替换策略是指被访问的数据块不在Cache中时,被替换出Cache的数据块有两种选取方法:
选取冒泡队列顶端的数据块作为驱出块;选取冒泡队列的底部数据块作为驱出块。为每个Cache组(set)设置一个组命中标签H,初始化为0,当H值为1时,被替换的数据块从冒泡队列的底部选取;当H值为0时,被替换的数据块从冒泡队列的顶端选取,并且其余的数据块依次向冒泡队列顶端推进一个位置。
2.2.LIP(LRUInsertionPolicy)
LRU策略对于高局部性工作集有很好的性能,但是对于那些内存使用密集并且超过可用cache的工作集来说则性能非常低下。LRUInsertionPolicy(LIP)策略则将新的访问位置放在LRU位置。只有当它们存在LRU位置中被引用时,才将它们提升到MRU位置中。这样,数据先被放到LRU位置上,处理器开始访问,由于LRU上的数据正式处理器需要的数据,所以马上会被放到MRU位置上,如此一来,无形中扩大了可用cache的大小。当数据并未被访问到的时候,继续向存储器要数据,但是这个时候并不是全部将需要的数据给替换,而是LRU位置上的一部分数据会保存在cache中,可以提高cache的命中率。
2.3.BIP(BimodalInsertionPolicy)
由于LIP没有年龄机制,LIP策略会导致部分不再被引用的line处于non-LRU的位置上,并且不会变更给定应用程序的工作集sets。在这样的情况下,我们提供一种新的策略,BimodalInsertionPolicy(BIP),它在一个很低的概率下,将部分新的访问集放入MRU位置。BIP策略包含一个参数ε,控制新进来的数据被替换到MRU位置上的比例。我们可以看到,在传统的LRU策略中ε=1,而在LIP中ε=0。
2.4.DIP-SD(DynamicInsertionPolicyviaSetDueling)[2]
DIP动态的评估两种策略的miss情况,从中选择更好的策略。数据集分为三个部分:划分给LRU策略数据集、划分给BIP策略数据集、划分给正常策略。当未命中LRU数据集时则PSEL加1,当未命中BIP数据集时减1。当MSB(PSEL)最高位为1时则选择LRU 策略来作为下一次正常数据集中Cache替换策略;否则选择BIP策略作为下一次Cache替换策略。数据集设定策略采用论文[2]中设定的方法,如下所示:
按照Set个数将数据集进行分类:假设共有N个set,每种策略包括K个set,将set划分为N/K个相等区域。为每个数据集提供2个bit的数据位以区分每个数据集的类型:分配给LRU策略、分配给BIP策略数、分配给正常使用。同时,对每个set进行log2N位的二进制编码,如N=64,则第10个set编码号为001010,如果编码后高(log2N)/2位于低(log2N)/2位相同,则将数据划分给LRU策略数据集;若互补,则划分给BIP策略数据集;其余则为正常数据集。
3.研究但未实现的算法-RRIP(Re-ReferenceInsertionPolicy)[3]
RRIP预测数据块的下一次访问间隔,尽量把访问时间间隔较小的数据块留在cache中,从而提高cache的命中率。具体算法描述如下:将LRU替换算法中LRU端作为RRPtail,MRU端作为RRPhead,如下图:
(1)VictimSelectionPolicy:选择PPRV值最大的块换出cache。即从RRPhead开始扫描,找到RRPV=3的块将其换出;若没有,则将所有的RRPV值加1。
(2)InsertionPolicy:插入新的数据块,并将它的RRPV值设为1或者2。这样做可以使得新的数据块在cache中存在的时间不至于太长也不太短,这就类似于将新的数据块插入到链的中间部分。
(3)UpdatePolicy:当cache命中时,将命中块的RRPV值设为0。RRIP替换策略可以在混合模式下,在cache中保存一部分被访问过的数据块,提高cache的命中率,能够将新插入但无后续访问的块尽早被替换.。
三、算法设计及实现
由于LIP算法及BIP算法实现与LRU算法实现非常类似且较为简单,因此这里的算法设计重点讲解Bubble算法及DIP-SD算法的设计。具体实现代码请详见【附录】中源代码。Bubble算法及DIP-SD算法均主要参考他人论文,但在具体实现中有所改动,主要包括:Bubble算法中插入策略与替换策略所完成的功能有所重复,因此在实现时以替换策略的实现为主,且由于使用到具体的查询次数,因此在cache块的初始化中将其访问次数进行了初始化设置;
DIP-SD算法中有关2bit标志位用来识别set所属区域类型,由于在具体实现时发现不使用标志位也可判断该set所属的类型,因此在实现时未设置标志位。
3.1Bubble算法设计