如何在缓存模拟器中查找冲突未命中数

时间:2013-08-18 09:50:59

标签: caching memory cpu-architecture computer-architecture cpu-cache

我正在尝试设计缓存模拟器。为了找到块的缓存命中/未命中,我将其索引和偏移量与缓存中已存在的块进行比较。在n关联缓存的情况下,我只检查那个块可以去的那些缓存条目。

找到命中和冷缺失的次数是微不足道的。如果缓存已满(或者块可以进入的所有条目都被占用),那么我们就有容量未命中。

有人可以告诉我如何找到冲突失误的数量?冲突未命中的定义说:

Conflict misses are those misses that could have been avoided, 
had the cache not evicted an entry earlier

如何确定是否应该删除之前从缓存中删除的条目?

2 个答案:

答案 0 :(得分:3)

你可以将所有历史地址存储在一个hashmap中,并在你错过时进行查找 - 如果你错过了缓存但是在哈希中命中 - 你在某个时候驱逐了那条线。

然而,这可以非常迅速地增长。但在大多数情况下,更有意思的是“我可以让线路缓存稍长一点并避免这种错过吗?”。为此,您可以扩展缓存模拟以获得更多方法(直到您确定的历史深度仍然是现实的,以保持线路)。你像以前一样查找你的缓存,并保持你原本应该使用的LRU方法,但是如果被击中的方式超出LRU年龄方面的“真实”方式计数 - 这是一个冲突未命中(即 - 线路在那里,但是将LRU链推回到应该被驱逐的点之上。确保你的LRU机制可以这样工作 - 一个真正的LRU应该没问题,因为它保持严格的顺序,基于年龄值的那些也很好,但其他类型如伪LRU树可能会变得棘手。

答案 1 :(得分:2)

从概念上来说这就是衡量未命中类型的方法:

测量以下缓存的相同代码的未命中数(M):

  1. 无限容量,完全关联缓存
  2. 有限容量的完全关联缓存
  3. 有限容量的N路关联缓存
  4. 然后

    • 强制失误人数= M1
    • 容量未命中数= M2-M1
    • 冲突未命中数= M3- num capacity misses - num compulsory misses = M3 - M2

    在模拟器中实际执行这些测量时,无需运行三种不同的模拟。如Leeor所描述的对哈希映射的错过给你M1。现在,如果您将哈希映射实现为列表(或更高效的数据结构),以便永远不会删除条目,但只要访问地址'x',就会在列表的前面放置'x'。每当引用并且它在列表中的第一个“S”位置(其中S是缓存大小)中命中时,它可以被计为缓存编号1和2的HIT。实际缓存模拟(建模N -way cache)给你M3。因此,实际缓存模型加上此列表数据结构可在单次模拟运行中为您提供M1,M2,M3。