有一些关于缓存和缓存命中/未命中的问题

时间:2014-04-28 03:09:51

标签: caching memory computer-architecture

这是一个家庭作业问题,但作业已经到期,我们已经得到了答案,我只是不知道他们是如何得出这些答案的。

它与缓存有关,我只是混淆了很多概念。

以下是问题:

对于具有32位地址的直接映射缓存设计,以下位为 地址用于访问缓存。

enter image description here

根据我的理解,索引位确定缓存中哪个块在内存中的特定位置被映射到。地址的最低log(base2)位决定了高速缓存块,这里有5个索引位,所以我知道高速缓存中总共有2 ^ 5个块,或32个。

什么是缓存块大小(以字为单位)?

根据给出的答案,缓存块大小为8.根据TA提供给我们的一些注释,块大小为2 ^(偏移位数),在这种情况下,然而,这给了我一个答案32,所以我不知道8来自哪里。此外,本书中没有任何地方定义“偏移位”这个术语,所以有人能告诉我这究竟是什么意思吗?

enter image description here

**我在想的是,由于相同的内存地址永远不会被引用两次,所以应该没有命中,因为缓存永远不会拥有它在缓存中寻找的数据。然而,根据答案,命中率应该是.25,所以我再一次猜想我不明白会发生什么。 最后,对于最后一个问题,它说答案如下:

< 000001,0001,mem [1024]>

< 000001,0011,mem [16]>

< 001011,0000,mem [176]>

< 001000,0010,mem [2176]>

< 001110,0000,mem [224]>

< 001010,0000,mem [160]>

其中包含一些甚至不在原始问题中的内存地址(176,2176),所以到目前为止我完全失去了一切。有人可以帮我解决一些这些问题吗?**

1 个答案:

答案 0 :(得分:3)

在示例中,高速缓存块大小为32 字节,即正在使用字节寻址;对于四字节的单词,这是8个单词

由于整个块在未命中时加载到高速缓存中,并且块大小为32字节,因此要获得索引,首先将地址除以32以在内存中查找块编号。模块编号32(5位索引)是索引。块号除以32是标签。跟踪看起来像这样:

   0  miss  <00000, 0000, mem[0..31]>
   4  hit   <00000, 0000, mem[0..31]>
  16  hit   <00000, 0000, mem[0..31]>
 132  miss  <00100, 0000, mem[128..159]>
 232  miss  <00111, 0000, mem[224..255]>
 160  miss  <00101, 0000, mem[160..191]>
1024  miss  <00000, 0001, mem[1024..1055]>
  30  miss  <00000, 0000, mem[0..31]>
 140  hit   <00100, 0000, mem[128..159]>
3100  miss  <00000, 0011, mem[3072..3103]>
 180  hit   <00101, 0000, mem[160..191]>
2180  miss  <00100, 0010, mem[2176..2207]>

正如您所看到的,12次访问中有4次点击,因此命中率应为33%。 (看起来答案的提供者认为有16次访问。)

旁注释:由于这是从空缓存开始的,因此只有一个冲突未命中(mem [30]访问),其余七个未命中是必须的(第一次访问)未命中。但是,如果这是循环的主体,则在第一次循环之后的每次迭代中,在索引00000(地址0,1024,30,3100)处将发生四次冲突未命中,在00100(地址132,2180)处发生两次冲突未命中,并且六个命中(地址4,16,140是其缓存块已在每次迭代中重新加载的命中,对应于冲突未命中;地址232,160,180是其缓存块在第一次迭代中加载而未被驱逐的命中)。 p>

运行此跟踪,可以发现最后以下块有效(是其索引的最后一次访问):

<00000, 0011, mem[3072..3103]>
<00100, 0010, mem[2176..2207]>
<00101, 0000, mem[160..191]>
<00111, 0000, mem[224..255]>

注意这与给出的答案有何不同,这显然是错误的,因为对于32字节的块,没有块将从mem [16]开始,1024除以32给出块号(在内存中)为32,32模32索引为0(不是1)。

顺便提一下,提供块中缓存的字节范围可能比仅提供块的起始地址更有帮助。