Cache替换算法

现代计算机体系结构中,cache一般采用组相连的形式。
Cache替换算法是影响缓存系统性能的一个重要因素,一个好的Cache替换算法会适应各种不同的应用场景,产生较高的命中率。
常见的cache替换算法有以下几种。

  1. 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了。

  1. MRU
    MRU (Mostly recently used),即最近最多使用,跟LRU是相反的一种替换算法,当没有free way时,选择最近最新未使用的way予以替换。
  2. 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

  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示意图

  1. 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不变。

  2. 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).

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123axj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值