【发布时间】:2021-03-25 19:38:04
【问题描述】:
以下是一道面试题:
为什么完全关联缓存的未命中率可能高于直接映射缓存?
我认为这根本不可能。任何人都可以分享一些对此的见解吗?
【问题讨论】:
标签: caching cpu-architecture cpu-cache
以下是一道面试题:
为什么完全关联缓存的未命中率可能高于直接映射缓存?
我认为这根本不可能。任何人都可以分享一些对此的见解吗?
【问题讨论】:
标签: caching cpu-architecture cpu-cache
您是否应该假设它们的大小相同?如果不是,那么如果大多数未命中是“容量”未命中,而不是冲突未命中,那么较小的完全关联缓存仍然会丢失更多。
如果它们大小相同,则可能性要小得多,因此您必须开始考虑病理病例。 replacement policy 的不幸案例可能会导致不相关的未命中驱逐一条稍后有用的线路。完全关联缓存中的未命中可以驱逐任何当前行,并且必须选择一个。 (并且在高关联性的情况下,LRU 会占用很多位,所以它可能不是真正的 LRU。即使是真正的 LRU,您当然可以构造一个仍然驱逐更多行的序列。)
考虑以下事件序列:
可能有更合理的例子,平均命中率不是那么低。例如简单地循环一个数组,从而在顺序读取每个字节或字时从缓存中受益。
关联缓存有更多空间供其他访问别名同一集合,因为集合较少。通常替换策略会为您的工作负载做出有用的选择,因此这种行为只有在失败的情况下才有可能。
相关:https://en.wikipedia.org/wiki/Adaptive_replacement_cache https://blog.stuffedcow.net/2013/01/ivb-cache-replacement/ - 自适应替换可以帮助在运行大型阵列上的缓存爆破循环时保留一些行。
自适应替换策略可以使关联缓存更能抵抗这种直接映射缓存可以击败它的最坏情况。当然,遍历一个巨大的数组通常会完全清除直接映射的缓存。这里的特别之处在于,我们避免了任何会为将要命中的线产生别名的东西。因此,对于涉及很多行但碰巧跳过一行的访问序列,循环访问链表更合理。
还相关:LRU 的病态最坏情况:Bélády's anomaly 用于虚拟内存页面替换,其中可以构建 LRU 因更多页面帧而变得更糟但 FIFO 没有的情况。 CPU 缓存的类似情况会随着每组更多的方式而变得更糟,对于一组相同的访问序列。
当然,没有人说全关联缓存是真正的 LRU,正如我之前所说,这在实践中不太可能。
【讨论】: