0

参考以下链接中的缓存问题: link

问题是:使用下面的一系列地址,显示具有单字块、4 字节字和总大小为 16 字的双向组关联高速缓存的命中和未命中以及最终高速缓存内容。假设 FIFO 替换。

0, 4, 64, 0, 128, 32, 12, 96, 128, 64

我的问题是:为什么标签值设置为字地址/8?

谢谢。

4

1 回答 1

1

简短说明 - 如果缓存总共包含 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) |
+--------------------------------------+----------------------+-------------------+

也就是说,addr 0x0 将映射到 set 0,addr 0x4(字 addr 0x1)将始终位于 set no。1、不管怎样。set 2 将具有 addr 0x8(字 addr 0x2),set 3 将具有 addr 0xC(字 addr 0x3),...等等,直到 set 7 将用于 addr 0x1C(字 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)

请注意,这意味着仅一个标签不足以识别行地址,您需要标签和设置位来重建它。

于 2013-09-17T13:02:57.393 回答