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

xia*_*ong 28 cpu caching cpu-cache

容量未命中是因为从缓存中丢弃块,因为缓存不能包含程序执行所需的所有块(程序工作集远大于缓存容量).

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

它们实际上是密切相关的吗?

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

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

我理解正确吗?谢谢

Lee*_*eor 45

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

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

  1. 你反复迭代128k阵列.数据无法容纳在该缓存中,因此所有未命中都是容量的(除了每行的第一次访问是强制错过,即使你可以无限增加缓存也会保留).

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

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


tar*_*ole 14

我最喜欢的冲突失误定义是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.

  • 先生,为什么您将 4 视为强制未命中?难道不是因为同一个块存在竞争而导致冲突错过吗?我的意思是 0 在第 0 块中,4 也想在第 0 个块中 (2认同)
  • @laura,因为即使 0 不存在,4 仍然是一个未命中的值。让我们一步一步来:无限大的全关联缓存只有强制未命中;现在让我们对缓存的大小设置一个限制,新的未命中被视为容量未命中;最后,令缓存为组关联缓存,新的未命中被视为冲突未命中。 (2认同)

小智 12

强制未命中:当主内存块试图占据缓存的新空行并且第一次访问必须被带入缓存的内存块时,称为强制未命中。

冲突未命中:当缓存中仍有空行时,主存块与缓存已填充的行发生冲突,即,即使有空位可用,块也试图占用已填充的行。它被称为冲突未命中。

容量未命中:当缓存的所有行都填满时发生未命中。

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