冲突和强制缓存未命中有什么区别?

What's the difference between conflict and compulsory cache miss?

我试图理解冲突和强制未命中之间的 真实 区别,发现 this 示例非常混乱。

考虑具有 256 个块并使用 LRU 替换的 2 路组关联缓存。最初,缓存是空的。冲突未命中是由于多个块争用同一缓存集而发生的那些未命中。由于第一次访问该块而发生强制性未命中。访问内存块的顺序如下:

  {0,128,256,128,0,128,256,128,1,129,257,129,1,129,257,129}

重复10 次。缓存经历的冲突未命中数是 _________ .

如果我们按照各种未命中的定义,我们得到的总冲突未命中数为 78。但是官方回答说 76 因为它假定第一次访问总是强制性的,即使它与某些缓存块 冲突

请借助上面的例子解释这个概念。

如果 first 访问被映射到一个集合,其中所有的路都被占用并且现有线路之一必须被驱逐,那不会是冲突未命中。当要访问的行已被先前逐出时发生冲突未命中,因为关联性太小但总容量足够大。

Compulsory misses occur due to first time access to the block.

我知道这是教科书对必修课的定义。不过,一般来说,第一次访问缓存中未命中的行不一定是强制性未命中。未命中可以是冲突或容量未命中。如果缓存有硬件预取器(或者如果软件预取不被认为是正常访问),就会发生这种情况。预取器可能已经将以前从未访问过的行提取到缓存中,但在它第一次被访问之前就被驱逐了。稍后当它确实被访问时,会发生未命中,并且该未命中不会是强制性未命中。这种区别很重要,因为强制未命中的数量是预取算法成功的衡量标准(连同预取行被逐出之前的命中次数)。也就是说,您的教科书或老师可能认为预取超出范围。