我正在尝试设计缓存模拟器。为了找到块的缓存命中/未命中,我将其索引和偏移量与缓存中已存在的块进行比较。在n关联缓存的情况下,我只检查那个块可以去的那些缓存条目。
找到命中和冷缺失的次数是微不足道的。如果缓存已满(或者块可以进入的所有条目都被占用),那么我们就有容量未命中。
有人可以告诉我如何找到冲突失误的数量?冲突未命中的定义说:
Conflict misses are those misses that could have been avoided,
had the cache not evicted an entry earlier
如何确定是否应该删除之前从缓存中删除的条目?
答案 0 :(得分:3)
你可以将所有历史地址存储在一个hashmap中,并在你错过时进行查找 - 如果你错过了缓存但是在哈希中命中 - 你在某个时候驱逐了那条线。
然而,这可以非常迅速地增长。但在大多数情况下,更有意思的是“我可以让线路缓存稍长一点并避免这种错过吗?”。为此,您可以扩展缓存模拟以获得更多方法(直到您确定的历史深度仍然是现实的,以保持线路)。你像以前一样查找你的缓存,并保持你原本应该使用的LRU方法,但是如果被击中的方式超出LRU年龄方面的“真实”方式计数 - 这是一个冲突未命中(即 - 线路在那里,但是将LRU链推回到应该被驱逐的点之上。确保你的LRU机制可以这样工作 - 一个真正的LRU应该没问题,因为它保持严格的顺序,基于年龄值的那些也很好,但其他类型如伪LRU树可能会变得棘手。答案 1 :(得分:2)
从概念上来说这就是衡量未命中类型的方法:
测量以下缓存的相同代码的未命中数(M):
然后
在模拟器中实际执行这些测量时,无需运行三种不同的模拟。如Leeor所描述的对哈希映射的错过给你M1。现在,如果您将哈希映射实现为列表(或更高效的数据结构),以便永远不会删除条目,但只要访问地址'x',就会在列表的前面放置'x'。每当引用并且它在列表中的第一个“S”位置(其中S是缓存大小)中命中时,它可以被计为缓存编号1和2的HIT。实际缓存模拟(建模N -way cache)给你M3。因此,实际缓存模型加上此列表数据结构可在单次模拟运行中为您提供M1,M2,M3。