现代计算机体系结构中,cache一般采用组相连的形式。
Cache替换算法是影响缓存系统性能的一个重要因素,一个好的Cache替换算法会适应各种不同的应用场景,产生较高的命中率。
常见的cache替换算法有以下几种。
- LRU
LRU ( Least Recently Used),即最近最少使用,是一种常用的cache替换算法,当没有free way时,选择最近最久未使用的way予以替换。
来一个新的request后,基本处理流程如Figure 1。
Figure 1 LRU流程图
举例来说,way num为4,set index为Addr[11:6],tag index为Addr[37:12]。
request addr顺序依次为0x100040, 0x200040, 0x300040, 0x400040, 0x500040,则0x500040来的时候没有free way,需要踢掉一个way,踢掉0x100040。
request addr顺序依次为0x100040, 0x200040, 0x300040, 0x400040, 0x100040, 0x500040,则0x500040来的时候没有free way,需要踢掉一个way,踢掉0x200040。因为0x100040 第2次来的时候hit cache,更新0x100040为最新,0x200040就变成最老的way了。
- MRU
MRU (Mostly recently used),即最近最多使用,跟LRU是相反的一种替换算法,当没有free way时,选择最近最新未使用的way予以替换。 - LRU & MRU的实现
对于LRU和MRU策略的实现,在一个set中,都需要维护一个表,表的长度等于way num,记录的内容是way id。如Figure 2,假设way num =4,pos_0是LRU position,pos_3是MRU position。
Figure 2 LRU、MRU实现方法示意图
如果采用LRU替换策略,新来的request分配way id后,此id 填在靠近MRU的位置;需要进行替换时,总是将pos_0对应的way原内容剔除,剔除后pos_0 id 转移到MRU位置,也就是变成pos_3,原来的pos_3 / pos_2/ pos_1 向右移动分别变为pos_2 / 1 / 0。如果发生cache hit,则将hit的way id 移到靠近MRU的位置,原位置上的id依次右移。
举例说明,way num为4,set index为Addr[11:6],tag index为Addr[37:12]。
如果request addr顺序依次为0x000040, 0x100040, 0x200040, 0x000040,分配way id为0,1,2。则第2次0x000040时,LRU way id变化如Figure 3,pos_0的way id 转移到靠近MRU位置pos_2.
Figure 3 LRU 实例1
如果request addr顺序依次为0x100040, 0x200040, 0x300040, 0x400040, 0x100040, 0x500040,前四个分配way id依次为0,1,2,3. 第2次0x100040时,pos_0的way id 转移到MRU位置,也就是pos_3,原来的pos_3 / pos_2/ pos_1 向右移动。0x500040时,cache miss & no free way,将pos_0对应的way id (way 1)原始内容剔除,新request进入way 1。对于way id表格,pos_0 shift to MRU,其他向右移动。如Figure 4所示。
Figure 4 LRU实例2
如果采用MRU替换策略,新来的request分配way id后,此id 填在靠近LRU的位置;需要进行替换时,也总是将pos_0对应的way原内容剔除,但是pos_0 id 依然保持在 pos_0位置;下次再替换的时候,还是踢这个id。如果发生cache hit,则将hit的way id 移到靠近LRU的位置,原位置上的id依次左移。
举例说明。如果request addr顺序依次为0x100040, 0x200040, 0x300040, 0x400040, 0x100040, 0x500040,前四个分配way id依次为0,1,2,3. 第2次0x100040时,pos_3的way id 转移到LRU位置,也就是pos_0,原来的pos_3 / pos_2/ pos_1 向左移动。0x500040时,cache miss & no free way,将pos_0对应的way id (way 0)原始内容剔除,而way id表格保持不变。如Figure 5。
Figure 5 MRU实例1
- Pseudo LRU
Pseudo LRU称之为伪LRU,也是一种常用的替换算法。以下,以way num = 16进行说明其实现方法。
如图由15bit的 lruState[14:0]来表示一个二叉树的状态,二叉树的最后一行分别对应way id 0-15.
假设lruState[14:0]初始状态全部为1,选择way 0,之后lruState 14/13/11/0 翻转变为0。PLRU算法每次replace一个way id后,对应的lruState都要进行翻转。Replace时候根据二叉树的lruState的值进行选择way id。根据lruState的值,1 选右,0 选左。
如果Hit某一way,路上经过的lruState不是翻转,而是尽量的避开指向我,即都导向另外一边。比如hit way 0, 那么state[0]指向1 ,state[11] 指向 2-3 , state[13] 指向 4-7, state[14] 指向 8-15。
不管有没有free way,选择一个way id时都是根据lruState[14] 的状态,然后一路找下去, 选择之后路上的所有节点都要进行翻转。
总之,set每次收到一个request,都会更新LruState,Hit cache时,避开指向hit的way id;否则对LruState进行翻转。
Figure 6 Pseudo LRU示意图
-
BIP
Bimodal Insertion Policy(BIP)替换策略,是LRU和MRU的结合体,大概率采用MRU替换,小概率采用LRU策略。
设置一个固定的max_miss,用于控制采用LRU的概率,其概率为1/max_miss。具体实现时,用一个counter来记录miss的次数,当miss counter == max_miss时采用LRU替换策略,发生替换时将pos_0 way id 移动到MRU位置,同时讲miss counter清零。当miss counter 不等于 max_miss时采用MRU替换策略,发生替换时保持pos_0 way id不变。 -
DIP
Dynamic Insertion Policy (DIP)替换策略,是以LRU和BIP替换策略为基础,在整个cache块中实施的一种方法。
LRU、MRU、Pseudo LRU和BIP策略都是对每一个set来讲的,各个set间没有联系。而DIP策略可以认为是,根据某些set (LRU-set 和BIP-set)的采样情况来动态决定其他follower set的替换策略。
假设某1M 的cache,有1024个set,每个set有16个way。分别选择其中16个set作为LRU-set 和BIP-set,其他set为follower set。Set index 为A [15:6],Set的选择可以这样:A[15:11] == A [10:6] 设置为LRU-set;A[15:11] + id== A [10:6] 设置为BIP-set,这个id比如可以设置为2.
用一个Policy Select Counter (PSEL_cnt)来记录LRU-set 和BIP-set的miss情况。其中,当LRU-set发生一次miss时,PSEL_cnt 加1;当BIP-set发生一次miss时,PSEL_cnt 减1。当PSEL_cnt 比较大时,表明当前执行的程序,使得采用LRU策略会发生的miss量超过了BIP策略,那就是应该让follower set采用BIP。但由于程序执行时对cache的冲击可能会有一定的波动性,故需要设定一个阈值(PSEL threshold),当PSEL_cnt大于等于这个阈值时,再让follower set 采用BIP;小于阈值时,依然采用LRU。PSEL_cnt 在超过PSEL threshold时,如果再发生LRU-set miss也不再进行加1操作,也就是说PSEL_cnt的取值范围为[ 0 , PSEL threshold ]。
一般的介绍资料中会提到,当PSEL_cnt的MSB (Most Significant Bit,最高有效位)为1时,选择BIP,否则选择LRU。在RTL实现时,比如准备设置PSEL threshold = 1024,则PSEL cnt就需要11 bit,当PSEL_cnt的MSB为1时,就是PSEL_cnt = PSEL threshold。
如Figure 7、Figure 8和Figure 9为DIP策略的具体实现流程图,其中Figure 7为主流程图,主要为pos更新和替换的流程,Figure 8为miss cnt的更新,Figure 9为PSEL cnt的更新流程。
Figure 7 DIP流程图1 (替换策略)
Figure 8 DIP流程图2 (miss cnt更新)
Figure 9 DIP流程图3 (PSEL cnt 更新)
在DIP的基础上,还有更进一步的策略,如Thread Aware DIP-Isolation (TADIP-I) and TADIP-Feedback (TADIP-F).