关于缓存和缓存命中/未命中有几个问题

5
这是一道作业问题,但已经过了截止时间并给出了答案,我不知道他们是如何得出这些答案的。与高速缓存相关,我把很多概念混淆了。
以下是问题:
对于一个直接映射高速缓存设计,使用32位地址,下面的地址位用于访问高速缓存。
从我的理解来看,索引位决定了内存中特定位置映射到高速缓存中的哪个块。地址最低的log(base2)位确定了缓存块,这里有5个索引位,所以我知道在高速缓存中会有2 ^ 5个块,即32个块。 那么高速缓存块大小(以字为单位)是多少?
根据我们得到的答案,高速缓存块大小为8。根据助教给我们的一些笔记,块大小为2^(#of offset bits),在这种情况下应该是5。然而,这给了我一个32的答案,所以我不知道8来自哪里。此外,在这本书中从未定义“偏移位”这个术语,那么能否有人告诉我确切地是什么意思?
在这里我想到,由于同一内存地址永远不会被引用两次,所以应该没有命中,因为缓存永远不会在缓存中找到正在查找的数据。然而,根据答案,命中率应为0.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个回答

4
在这个例子中,缓存块大小为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是命中,它们的缓存块在第一次迭代中被加载并且没有被替换)。

通过运行此跟踪,可以发现最后以下块将有效(作为其索引的最后一个访问):

<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)。
顺便说一下,提供缓存块中缓存的字节范围可能比仅提供块的起始地址更有帮助。

所以,基本上如果缓存块大小为32字节,则实际内存被分成大小为32的块...因此内存中的前32个字节将对应于“内存块0”(因为0-31之间的任何数字除以32都将是floor(0),等等),但所有内存块都必须映射到缓存中的32个块中,这就是% 32用于确定缓存块的原因吗?@Paul A. Clayton - FrostyStraw
如果内存地址4是第一个被引用的,这并不意味着字节4-36会被放置在块中...它只意味着块地址4会被放置,而且由于内存已经“划分”为块,你只需要通过除以缓存块大小找出它所在的块...我不是很确定我的问题是什么,我想我只是在自言自语。 - FrostyStraw
1
是的,内存在概念上被划分为块(有点像页面/帧的划分)。对于关联度大于1(即非直接映射),内存中的所有块都映射到每个路上,但每个索引(集合)可以容纳与关联度相同数量的块。完全关联的高速缓存可以将任何内存块映射到任何高速缓存块。(倾斜关联性是一个更高级的概念,它缺乏良好的集合定义,但我添加了这个警告只是因为我喜欢倾斜关联性的想法。) - user2467198

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接