我试图理解冲突和强制性失误之间的真实差异,并发现this示例非常令人困惑。
考虑具有256个块的2路集关联缓存,并使用LRU替换。最初,缓存为空。冲突未命中是由于同一缓存集争用多个块而发生的那些未命中。强制丢失是由于首次访问该块而引起的。以下访问内存块的顺序:
{0,128,256,128,0,128,256,128,1,129,257,129,1,129,257,129}
重复10 次。缓存遇到的冲突未命中数是_________。
如果按照每种类型的未命中的定义进行分析,则总冲突未命中为 78 。但是官方回答是 76 ,因为它假定即使第一次访问与某些缓存块发生冲突,该访问也始终是强制性的。
请在以上示例的帮助下解释此概念。
答案 0 :(得分:2)
如果将 first 访问映射到一个集合,其中所有方式都被占用并且必须逐出一个现有行,那么这不会造成冲突。当由于关联性太小但总容量足够大而导致先前 将其撤出时,就会发生冲突丢失。
由于首次访问该区块而导致强制丢失。
我知道这是必修课的教科书定义。通常,尽管如此,对缓存中未命中的行的首次访问不一定是强制性的。错过可能是冲突或容量不足。如果高速缓存具有硬件预取器(或者如果软件预取不被视为正常访问),则会发生这种情况。预取程序可能已将一条从未访问过的行提取到缓存中,但随后在第一次访问之前就被逐出了。后来当确实访问它时,会发生未命中,并且该未命中不是强制性的。这种区别很重要,因为强制丢失的次数是预取算法成功与否的量度(以及被预取的行被逐出之前的命中数)。也就是说,您的教科书或老师可能认为预取超出了范围。