假设您有一个 32 字节的直接映射缓存,每个 block 16 字节,并且它读取地址 0xd。缓存的内容是什么?我以为 fetcher 会将 0xd 添加到集合 1(第二个)字节 6 中的缓存中。但在我的模拟器中,0xc 命中,所以显然这是错误的!如有任何帮助,我们将不胜感激。
最佳答案
要确定在哪个集合中找到地址,您可以使用:
(addr >> log2(block size)) & (number of sets - 1)
(假设 block 大小和集合数都是 2 的幂,它们几乎总是如此,因此 &(n-1)
与 %n
相同,是一个模)
对于您的情况,它将是:(0xd >> 4) & 1
,即 0。
集合 0 中的 block 包含字节 0x0 到 0xf,因此对 0xc 的引用是命中的。
它包含字节 0x0 到 0xf 的原因是计算机内存系统通常设计为比非对齐数据更快地处理自然对齐数据。如果起始 block 的地址的低 log2(N) 位中包含零,则大小为 N 的 block 自然对齐。因此,当引用地址 0xd 时,包含它的对齐 block (起始地址为 0x0)将被加载到缓存中。
关于caching - 通过缓存写入时获取的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47522376/