【问题标题】:Direct mapped cache example直接映射缓存示例
【发布时间】:2020-04-18 11:09:21
【问题描述】:

我对直接映射缓存这个话题真的很困惑,我一直在寻找一个有很好解释的例子,这让我比以往任何时候都更加困惑。

例如:我有

  • 2048 字节内存
  • 64 字节大缓存
  • 8 字节缓存行 使用直接映射缓存如何确定“LINE”“TAG”和“字节偏移”?


  • 我认为寻址位的总数是 11 位,因为 2048 = 2^11

  • 2048/64 = 2^5 = 32 个块(0 到 31)(需要 5 位)(标记)

  • 64/8 = 8 = 2^3 = 3 位用于索引

  • 8 字节缓存行 = 2^3,这意味着我需要 3 位作为字节偏移量

所以地址应该是这样的:5 代表标签,3 代表索引,3 代表字节偏移

我是否正确理解了这一点?

【问题讨论】:

  • 是的。不过,我发现将标签的长度作为地址宽度(11 位)和索引+偏移位(3+3)之间的差异更合乎逻辑:11-6 = 5。当然,这两种方法都是等价的。
  • 我也推荐@MargaretBloom 提出的方法,因为它也适用于非直接映射缓存。如果在此示例中,您在 4 组中有相同的 8 行,则标记位数将为 6(11 - 3 - 2),而不是 5。

标签: caching assembly cpu-architecture cpu-cache


【解决方案1】:

我猜对了吗?

解释

1) 主内存大小为 2048 字节 = 211。因此,您需要 11 位来寻址一个字节(如果您的字大小为 1 个字节)[字 = 将使用该地址访问的最小单个单元]

2)您可以通过执行(主内存大小/现金大小)计算直接映射中的标签位。但我将解释更多关于标签位的信息。

这里,一个现金行的大小(总是与主内存块的大小相同)是 8 个字节。这是 23 个字节。因此,您需要 3 位来表示现金行中的一个字节。现在您在地址中剩余 8 位 (11 - 3)。

现在缓存中存在的总行数是(现金大小/行大小)= 26 / 23 = 23

因此,您有 3 位来表示您需要的字节所在的行。

现在剩余位数为 5 (8 - 3)。

这 5 位可以用来表示一个标签。 :)

3) 3 位用于索引。如果您试图将表示一行所需的位数标记为索引。是的,你是对的。

4) 3 位将用于访问带有高速缓存行的字节。 (8 = 23)

所以,

11 位总地址长度 = 5 个标记位 + 3 位表示一行 + 3 位表示一行中的一个字节(字)

希望现在没有混乱。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2018-06-24
    • 2018-05-24
    • 2014-06-04
    • 2012-07-09
    • 1970-01-01
    • 2012-04-11
    • 2013-04-02
    相关资源
    最近更新 更多