在实际CPU缓存中使用了哪些缓存失效算法?

时间:2014-03-23 21:30:01

标签: algorithm caching cpu-cache

我来到主题缓存和映射以及缓存未命中以及当所有块已满时缓存块如何以什么顺序替换。

最近最少使用的算法或fifo算法或最不频繁的算法和随机替换,...​​...

但实际的cpu缓存使用了哪些算法?或者你可以使用all ...操作系统决定最佳算法是什么?


编辑:即使我选择了答案,也欢迎任何进一步的信息;)

3 个答案:

答案 0 :(得分:9)

正如hivert所说 - 很难对特定算法有清晰的了解,但可以根据提示或巧妙的逆向工程推断出一些信息。

您没有指定您所指的CPU,每个CPU都可以有不同的策略(实际上即使在相同的CPU中,不同的缓存级别可能有不同的策略,更不用说TLB和其他也可能具有此类的关联数组政策)。我确实找到了一些关于英特尔(特别是常春藤桥)的提示,因此我们将其作为行业级标准"标准" (可能适用于其他地方,也可能不适用于其他地方)。

首先,英特尔在这里介绍了一些与LRU相关的功能 - http://www.hotchips.org/wp-content/uploads/hc_archives/hc24/HC24-1-Microprocessor/HC24.28.117-HotChips_IvyBridge_Power_04.pdf

提到幻灯片46" Quad-Age LRU" - 这显然是一个基于年龄的LRU,分配了一些"年龄"根据预测的重要性对每一行。他们提到预取中年,所以要求可能分配在更高的年龄(或更低,无论存活时间最长),并且所有线路可能逐渐老化,因此最老的线路首先被替换。不如完美" fifo-like" LRU,但请记住,大多数缓存都没有实现,而是一个复杂的pseudo-LRU解决方案,所以这可能是一个改进。

其中提到的另一个有趣的机制是自适应填充策略,它超越了经典LRU。这里有一个非常好的分析 - http://blog.stuffedcow.net/2013/01/ivb-cache-replacement/,但简而言之(如果博客是正确的,并且他似乎与他的结果很好地匹配),缓存动态地选择两个LRU策略,试图决定是否将重复使用这些行(并且应该保留或不保留)。

我想这可以在某种程度上回答你关于多个LRU方案的问题。在硬件方面实施多种方案可能既困难又昂贵,但是当你有一些足够复杂的政策来制定参数时,可以使用动态选择,设置决斗等技巧。 / p>

答案 1 :(得分:9)

以下是实际处理器中使用的替换策略的一些示例。

PowerPC 7450的8路L1缓存使用二叉树pLRU。二叉树pLRU使用每对方式一位来为该对设置LRU,然后为每对等设置一个LRU位.8路L2使用伪随机替换可设置特权软件(OS)使用每个时钟周期递增的3位计数器或基于移位寄存器的伪随机数发生器。

StrongARM SA-1110 32路L1数据缓存使用FIFO。它还有一个用于瞬态数据的双向小型缓存,它似乎也使用了FIFO。 ( Intel StrongARM SA-1110微处理器开发人员手册声明“minicache中的替换使用与主数据缓存中相同的循环指针机制。但是,由于此缓存只是双向集合关联,替换算法简化为一种简单的最近最少使用(LRU)机制。“;但是双向FIFO 与LRU相同,即使只有两种方式,但对于流数据,它可以工作同样的。])

HP PA 7200具有64块完全关联的“辅助缓存”,可与片外直接映射数据缓存并行访问。辅助缓存使用FIFO替换,可选择驱逐到片外L1缓存。加载和存储指令有“仅限本地”的提示;如果这样的存储器访问加载了辅助缓存条目,它将被驱逐到绕过片外L1的存储器。

对于双向关联性,真正的LRU可能是最常见的选择,因为它具有良好的行为(并且顺便提一下,当只有两种方式时,与二叉树pLRU相同)。例如,Fairchild Clipper缓存和内存管理单元使用LRU进行双向缓存。 FIFO比LRU稍微便宜,因为替换信息仅在无论如何写入标记时更新,即,当插入新的高速缓存块时,但是具有比基于计数器的伪随机替换(其具有甚至更低的开销)更好的行为。 HP PA 7300LC使用FIFO作为其双向L1缓存。

Itanium 9500系列(Poulson)将NRU用于L1和L2数据缓存,L2指令缓存和L3缓存(L1指令缓存记录为使用LRU。)。对于Itanium 2 6M(麦迪逊)中的24路L3缓存,为NRU提供了每个块的位,可以访问块设置与其设置和方式相对应的位(“Itanium 2处理器6M:更高频率和更大频率” L3 Cache“,Stefan Rusu等,2004)。这类似于时钟页面替换算法。

我似乎记得在其他地方读过这些比特在所有设置完成时被清除(而不是保持设置最后一个未设置位的那个)并且通过查找第一个未设置的比特扫描来选择受害者。这将具有硬件优势,即只需要在高速缓存未命中时读取信息(其存储在来自L3标签但不在L3标签附近的不同阵列中);缓存命中可以简单地设置适当的位。顺便提一下,这种类型的NRU避免了真正LRU的一些不良特性(例如,在某些情况下LRU降级为FIFO,在某些情况下甚至随机替换可以提高命中率)。

答案 2 :(得分:2)

对于Intel CPU,更换策略通常没有记录。我做了一些实验,以发现最新的Intel CPU中的策略,其结果可以在https://uops.info/cache.html上找到。我使用的代码在GitHub上可用。

以下是我的发现的总结。

  • Tree-PLRU::我测试过的所有CPU的L1数据缓存以及Nehalem,Westmere,Sandy Bridge,Ivy Bridge,Haswell的L2缓存均使用此策略和Broadwell CPU。
  • 随机化的Tree-PLRU::某些Core 2 Duo CPU在其L2缓存中使用Tree-PLRU的变体,其中树中的最低位或最高位被(伪)随机性代替。
  • MRU:该策略有时也称为NRU。每个缓存块使用一位。对块的访问将位设置为0。如果将最后1位设置为0,则所有其他位都设置为1。如果未命中,则将其位设置为1的第一个块替换。此策略用于Nehalem,Westmere和Sandy Bridge CPU的L3缓存。
  • 四级LRU(QLRU)::这是MRU策略的概括,每个高速缓存块使用两位。从Ivy Bridge开始,该策略的不同变体用于L3缓存,从Skylake开始,用于L2缓存。
  • 自适应策略:常春藤桥,Haswell和Broadwell CPU可以在两个不同的QLRU变体之间动态选择。这是通过集合决斗实现的:少数专用集合始终使用相同的QLRU变体。其余的集合是“跟随者集合”,它们使用在专用集合上表现更好的变体。另请参见http://blog.stuffedcow.net/2013/01/ivb-cache-replacement/