冲突未命中和容量未命中之间有什么区别

时间:2015-10-24 03:08:30

标签: caching cpu cpu-cache

由于缓存不能包含程序执行所需的所有块(程序工作集远大于缓存容量),因此会发生容量未命中,因为缓存中的块被丢弃了。

在组关联或直接映射块放置策略的情况下发生冲突未命中,当多个块映射到同一组或块帧时发生冲突未命中;也称为碰撞未命中或干扰未命中。

他们真的非常密切相关吗?

例如,如果所有缓存行都已填满,并且我们有一个内存B的读取请求,我们必须为此驱逐内存A.

因为我们没有足够的空间,所以它应该被视为容量缺失吗?后来如果我们想要访问内存A,并且因为它之前已经被驱逐,那么它被认为是一个冲突未命中。

我是否理解正确?谢谢

3 个答案:

答案 0 :(得分:41)

这里的重要区别在于数据集大小导致的缓存未命中以及缓存和数据对齐方式组织导致的缓存未命中。

让我们假设您有一个32k直接映射缓存,并考虑以下两种情况:

  1. 您反复遍历128k阵列。数据无法容纳在该缓存中,因此所有未命中都是容量的(除了每行的第一次访问是强制性未命中,并且即使您可以无限地增加缓存也会保留)。 / p>

  2. 你有2个小的8k阵列,但不幸的是它们都是对齐的并且映射到相同的集合。这意味着虽然它们理论上可以适应缓存(如果你修复了对齐),但它们不会利用完整的缓存大小,而是竞争同一组集合并相互颠簸。这些是冲突未命中,因为数据可能适合,但仍然由于组织而发生冲突。设置关联缓存可能会出现同样的问题,尽管不太常见(让我们说缓存是双向的,但是你有4个对齐的数据集......)。

  3. 这两种类型确实相关,你可以说,鉴于高水平的关联性,设置偏斜,正确的数据对齐和其他技术,你可以减少冲突,直到你大部分留下真正的容量未命中不可避免的。

答案 1 :(得分:12)

我最喜欢的关于减少强制和容量未命中的冲突失误的定义是由Norman P. Jouppi撰写的:

  

冲突未命中是如果缓存不会发生的未命中   与LRU替换完全关联。

让我们看一个例子。我们有一个大小为4的直接映射缓存。访问顺序是

  0(强制性未命中),1(强制性未命中),2(强制性未命中),3(强制性未命中),4(强制性未命中)   小姐),1(命中),2(命中),3(命中),0(容量未命中),4(容量未命中),0(冲突未命中)

倒数第二个是容量未命中,因为即使缓存与LRU缓存完全关联,它仍然会导致未命中,因为在最后0之前访问了4,1,2,3但是最后一个0是冲突未命中,因为在完全关联的缓存中,最后4个将在缓存中替换为1而不是0。

答案 2 :(得分:3)

强制缺失::当主内存块试图占用新的高速缓存空行并且必须首先访问必须进入高速缓存的内存块时,称为强制缺失。。 >

冲突遗漏::当高速缓存中仍然有空行时,主内存块与高速缓存中已填充的行发生冲突,即,即使有可用的空位置,块仍在尝试占据已经填充的线。这就是所谓的冲突小姐。

容量丢失:丢失时,缓存的所有行已满。

冲突丢失仅在直接映射的高速缓存和集合关联的高速缓存中发生。因为在关联映射中,没有主内存块试图占用已经填充的行。