caching - 直接映射缓存示例

标签 caching assembly cpu-architecture cpu-cache

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

例如:我有

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

  • 我相信寻址位的总数是 11 位,因为 2048 = 2^11
  • 2048/64 = 2^5 = 32 个 block (0 到 31)(需要 5 位)(标签)
  • 64/8 = 8 = 2^3 = 3 位用于索引
  • 8 字节缓存行 = 2^3,这意味着我需要 3 位用于字节偏移

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

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

    最佳答案

    我想对了吗?

    解释

    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 位表示一行中的一个字节(字)

    希望现在没有困惑。

    关于caching - 直接映射缓存示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59518383/

    相关文章:

    php - 使用 PHP 缓存生成的图像

    c++ - 我的 usercall 函数的 stdcall 包装器是否正确?

    linux - 当使用物理和逻辑内核的差异号时,在哪里可以找到英特尔处理器(比如 skylake)的 ipc(或 cpi)值?

    python - python int 的架构是特定的吗?

    c++ - 使用 std::ifstream 而不是文件缓存强制读取磁盘

    multithreading - 内存屏障强制缓存一致性?

    hibernate - 二级缓存 - 为什么不缓存所有实体?

    c++ - 什么是 IACA,我该如何使用它?

    iphone - Iphone 的 MMX 说明

    caching - MESI在Intel 64和IA-32上的意义是什么