conflict miss 和 capacity miss 有什么区别

What's the difference between conflict miss and capacity miss

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

Conflict miss发生在set associative or direct mapped block placement strategies的情况下,当多个block映射到同一个set或block frame时发生conflict miss;也称为碰撞未命中或干扰未命中。

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

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

因此,由于我们没有足够的 space,是否应该将其视为容量缺失?之后如果我们想访问内存A,因为之前已经被逐出,所以被认为是冲突未命中。

我理解正确吗?谢谢

此处的重要区别在于数据集大小导致的缓存未命中与缓存和数据对齐的组织方式导致的缓存未命中。

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

  1. 您重复遍历了一个 128k 的数组。数据不可能适合该缓存,因此所有未命中都是容量未命中(除了每行的第一次访问是强制性未命中,即使您可以无限增加缓存也会保留)。

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

这 2 种类型确实相关,您可以说,给定高水平的关联性、集合偏斜、适当的数据对齐和其他技术,您可以减少冲突,直到您大部分都剩下真正的容量未命中不可避免。

我最喜欢的冲突未命中定义来自 Norman P. Jouppi 的 Reducing Compulsory and Capacity misses

Conflict misses are misses that would not occur if the cache were fully associative with LRU replacement.

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

0(compulsory miss), 1(compulsory miss), 2(compulsory miss), 3(compulsory miss), 4(compulsory miss), 1(hit), 2(hit), 3(hit), 0(capacity miss), 4(capacity miss), 0(conflict miss)

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

Compulsory miss:当主内存块试图占用缓存的新空行并且第一次访问必须带入缓存的内存块时调用强制错过。

Conflict miss:当缓存中仍有空行时,主存块与已填充的缓存行冲突,即,即使空的地方是可用,块试图占据已经填充的行。它被称为冲突未命中。

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

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