我试图理解冲突和强制未命中之间的真正区别,发现这个例子非常令人困惑。
考虑具有256个块的2路组关联缓存,并使用LRU替换。最初,缓存为空。冲突未命中是指由于同一缓存集的多个块争用而发生的未命中。由于第一次访问块而导致强制未命中。访问内存块的顺序如下:
{0,128,256,128,0,128,256,128,1,129,257,129,1,129,257,129}
重复10时间。缓存遇到的冲突未命中次数为_________。
如果我们根据各种失误的定义,我们得到的总冲突失误为78。但官方答案是76,因为它假设第一次访问始终是强制性的,即使它与某些缓存块存在冲突。
请借助上面的例子来解释这个概念。
如果第一次访问被映射到一个集合,其中所有的路都被占用,并且其中一条现有的线必须被逐出,那就不会是冲突未命中。当要访问的线之前已经被逐出时,就会发生冲突未命中,因为关联性太小,但总容量足够大。
由于第一次访问块而发生强制未命中。
我知道这是教科书上对强制未命中的定义。不过,通常情况下,对缓存中未命中的行的第一次访问可能不一定是强制未命中。未命中可能是冲突或容量未命中。如果缓存有硬件预取器(或者软件预取不被视为正常访问(,就会发生这种情况。预取器可能已经将以前从未访问过的行提取到缓存中,但在第一次访问之前就被逐出了。稍后,当它被访问时,会发生未命中,而该未命中不会是强制未命中。这一区别很重要,因为强制未命中的数量是预取算法成功与否的衡量标准(以及预取行在被逐出之前的命中数(。也就是说,你的课本或老师可能认为预取超出了范围。