【问题标题】:Cache tag value缓存标签值
【发布时间】:2013-09-17 02:35:17
【问题描述】:

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

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

0、4、64、0、128、32、12、96、128、64​​p>

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

谢谢。

【问题讨论】:

    标签: caching system computer-architecture


    【解决方案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) |
    +--------------------------------------+----------------------+-------------------+
    

    也就是说,地址 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)

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

    【讨论】:

      猜你喜欢
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多