缓存替换政策

时间:2018-11-21 04:37:08

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

您能否提供伪代码/有关如何实施以下缓存替换策略的详细说明?

  1. FIFO
  2. LRU
  3. 随机

对于我来说,很难逐步了解它们的工作方式。因此,我相信每种政策的算法都非常清楚。

1 个答案:

答案 0 :(得分:1)

逻辑上的实现方式是,一组缓存行是有序的,因此它们形成一个队列。队列的开头是下次缓存需要在该集中分配一行时将逐出的行。

新行被分配在队列的末尾,离“砧板”最远。如果集合中有无效行,则无需逐出:元素移动以填补队列中的空白。否则,需要驱逐以腾出空间。

对于LRU,命中时该行将移动到最近使用(MRU)的位置。对于FIFO,不是。

对于随机来说,没有队列;如果集合中没有无效的行,缓存就会随机选择要替换的行。


为了最大程度地减少缓存污染,可以将非时间负载或预取操作分配给LRU位置中的行(下一个要收回的行),而不是通常的LRU。这对于您不希望多次被驱逐出的数据很有用。 (我认为AMD CPU在NT预取中实际上是这样工作的。IntelCPU通过限制{3}只能填充L3高速缓存中任何一组的1或2种方式来实现prefetchnta。)


物理上的实现方式可以不同,只要它们实现所需的算法即可。如果通常是实际复制数据(对于LRU,在读取命中后将其全部写回高速缓存阵列中),或者使用标记中的额外位来记录顺序并仅将其写回,则使用IDK。我想这将是在更大的额外写入端口与3个额外的标记位之间进行权衡。

快速L1d高速缓存并行读取标签+数据是很常见的,因此,基于标签比较器的结果,一组中所有方式的数据都可以从中选择。  但是对于等待标签检查然后仅以命中方式(如果有命中)获取数据的更省电的缓存,复制数据将是不切实际的。

我认为LRU逻辑通常很有可能用额外的标记位实现,这些标记位给出集合中方式的顺序。不过,您的心理模型可以忽略这一点,而只需查看直线移动的位置即可。

或者代替我编造东西,只需阅读How is an LRU cache implemented in a CPU?

上的Paul Clayton的答案

显然,某些设计使用伪LRU代替真正的LRU,以减少每组的额外位数。例如大型最后一级高速缓存中16种方式中的每一种的4位数字,或8路高速缓存中8x 3位数字。 (加上并行执行LRU逻辑的硬件将是非常重要的。)或者,您不仅可以对每种方法进行简单的编号,还可以将队列的可能状态编码为每组最少16位。但这仍然很重要。

(我不知道现代高性能x86 CPU在实践中使用了什么-真正的LRU是否值得小/快L1d和/或大/慢L2和L3的成本)