【发布时间】:2013-09-17 02:35:17
【问题描述】:
参考以下链接中的缓存问题: link
问题是:使用下面的一系列地址,显示单字块、4 字节字和总大小为 16 字的双向组关联缓存的命中和未命中以及最终缓存内容.假设 FIFO 替换。
0、4、64、0、128、32、12、96、128、64p>
我的问题是:为什么标签值设置为字地址/8?
谢谢。
【问题讨论】:
标签: caching system computer-architecture
参考以下链接中的缓存问题: link
问题是:使用下面的一系列地址,显示单字块、4 字节字和总大小为 16 字的双向组关联缓存的命中和未命中以及最终缓存内容.假设 FIFO 替换。
0、4、64、0、128、32、12、96、128、64p>
我的问题是:为什么标签值设置为字地址/8?
谢谢。
【问题讨论】:
标签: caching system computer-architecture
简短的解释 - 如果缓存总共包含 16 个字(= 64 字节缓存,非常小:),并且它是 2 路集关联的,那么您有 8 个集直接由地址映射。您不需要设置位成为标签的一部分,因为您已经使用它们映射到正确的设置。
假设访问粒度为 1 个字节,那么您的地址有 2 个 LSB 位将您映射到一个块(4 个字节)内,您需要在访问缓存时忽略这些,因为您正在读取整个块(内存单元然后将使用这 2 位根据读取大小和对齐方式为您提供块内的确切字节)。所以字地址 = real_address / 4
现在,由于您有 8 个集合,您可以使用接下来的 3 位映射到正确的集合。
+--------------------------------------+----------------------+-------------------+
| Tag (bits 5 and above) | Set (bits 2,3,4) | Offset (bits 0,1) |
+--------------------------------------+----------------------+-------------------+
也就是说,地址 0x0 将映射到集合 0,地址 0x4(字地址 0x1)将始终位于集合号。 1、不管怎样。 set 2 将具有 addr 0x8 (word addr 0x2), set 3 将具有 addr 0xC (word addr 0x3), ... 等等,直到 set 7 将用于 addr 0x1C (word addr 0x7)。
下一个地址将简单地换行 - addr 0x20(字 addr 0x8)将检查位 2..4 并查看它们是否为零,因此将再次映射到设置 0,依此类推。此时,标签来区分地址 0x0、addr 0x20、addr 0x10000 或映射到那里的任何其他地址(addr % 0x20 == 0 或 word_addr % 8 == 0)。由于您不关心此处行内的偏移量,并且当您决定访问给定集合时已经知道集合位,所以唯一需要存储的东西(当然除了数据之外)是上面的位设置位 - 这是必需的(并且足够)确定给定集合中的行标识,并知道查找是否命中或未命中。这些位是 addr / 0x20(或 addr >> 5),或 word_addr / 8(= word_addr >> 3)
请注意,这意味着仅一个标签不足以识别行地址,您需要标签和设置位来重建它。
【讨论】: