如何在CPU中实现LRU缓存?

时间:2014-05-03 18:50:58

标签: caching cpu cpu-architecture cpu-cache lru

我正在学习面试并希望在缓存方面重温我的记忆。如果CPU具有带LRU替换策略的缓存,那么芯片上实际实现的是什么?每个缓存行都会存储时间戳吗?

双核系统中会发生什么情况,两个CPU同时写入一个地址?

2 个答案:

答案 0 :(得分:10)

对于只有两种方式的传统缓存,每组一个比特可用于跟踪LRU。在对命中集的任何访问中,可以将该位设置为未击中的方式。

对于更大的关联性,状态数量急剧增加:方式数量的阶乘。因此,4路高速缓存将具有24个状态,每组需要5位,而8路高速缓存将具有40,320个状态,每组需要16位。除了存储开销之外,更新值的开销也更大。

对于4路缓存,以下似乎运行良好的状态编码:最近使用的路径编号为2位,下一个最近使用的路径编号为2位,以及指示是否为更高或更低编号的方式最近使用。

  • 在MRU命中时,状态不变。
  • 在下一个MRU命中时,交换两个位字段。
  • 在其他命中时,解码其他两种方式的数量,将命中方式的数量放在第一个两位部分中,将前一个MRU方式号码放在第二个两位部分中。最后一位是根据下一个MRU路数是高于还是低于命中的最近使用方式而设置的。
  • 在未命中时,状态会更新,就像发生LRU命中一样。

因为LRU跟踪具有这样的开销,所以经常使用诸如二叉树伪LRU之类的更简单的机制。在命中时,这样只更新树的每个分支部分,其中一半与命中相关联的方式。对于两种方式W的幂,二进制树pLRU高速缓存将具有每组W-1位状态。 8路缓存(使用3级二叉树)的第6路命中将清除树底部的位,表明路的下半部分(0,1,2,3)较少最近使用的,清除下一级的高位表示这些方式的下半部分(4,5)最近使用较少,并将最高级别的高位设置为表示这些方式的上半部分(7)最近使用较少。不必读取此状态即可更新它可以简化硬件。

对于倾斜的关联性,其中不同的方式使用不同的散列函数,已经提出了类似缩写时间戳的东西(例如," Skew-Associative Caches的分析和替换",Mark Brehob等,1997 )。使用未命中计数器比循环计数更合适,但基本思路是相同的。

关于当两个核同时尝试写入同一个高速缓存行时会发生什么,这是通过仅允许一个L1高速缓存在给定时间使高速缓存行处于独占状态来处理的。实际上有一场比赛,一个核心将获得独家访问权限。如果只有一个写入核心已经具有共享状态的缓存行,则它可能更有可能赢得竞争。当缓存行处于共享状态时,缓存只需要向缓存行的其他潜在持有者发送无效请求;如果缓存行不存在,则写入通常需要请求缓存行数据以及请求独占状态。

由不同的内核写入相同的缓存行(无论是相同的特定地址,还是在虚假共享的情况下,写入数据行内的另一个地址)都会导致"缓存行乒乓&#34 ;,其中不同的内核使其他缓存中的缓存行无效以获得独占访问(执行写入),以便缓存行像乒乓球一样在系统周围反弹。

答案 1 :(得分:0)

有一个很好的幻灯片Page replacement algorithms,讨论各种页面替换方案。它还解释了使用mxm矩阵的LRU实现。