【问题标题】:MIPS Direct Mapped Cache for Arrays用于阵列的 MIPS 直接映射缓存
【发布时间】:2020-02-12 16:32:45
【问题描述】:

我需要了解 MIPS 中的直接映射缓存如何用于数组。例如,对于包含 a[0] 到 a[9] 的十个项目的数组,以及以下直接映射缓存配置: 总缓存大小为 32 字节和块大小为 16 字节的直接映射缓存。每个内存地址为 32 位。

这将产生:4 位偏移,1 位索引,27 位标记

我的缓存看起来像这样:

| Index | Valid | Tag | W0 | W1 | W2 | W3 |
|   0   |   0   |     |    |    |    |    |
|   1   |   0   |     |    |    |    |    |

我的问题是,在我第一次加载 a[0] 时,我知道在每个缓存索引中,我们可以存储 4 个单词。这是否意味着a[0]a[1]a[2]a[3]a[0] 的加载访问时都被加载到缓存中?所以a[1]a[2]a[3] 会很受欢迎。

还是我理解错了?

【问题讨论】:

    标签: caching assembly memory-management mips mips32


    【解决方案1】:

    这取决于a[0]的对齐方式。

    假设a[0] 位于 0x10010000。然后加载的 16 字节块从 0x10010000 开始,一直到 0x1001000F。

    a[0] 位于 0x10010000,a[1] 位于 0x10010004,a[2] 位于 0x10010008,a[3] 位于 0x1001000C — 都在该缓存行中。


    但是,如果a[0]位于0x10010004,那么加载的16字节块仍然是0x10010000的同一个块,但现在包含a[0]a[0]a[1]前面的单词和a[2],但不是a[3]

    但是,如果a[0]在0x10010008,那么加载的16字节块仍然是0x10010000的同一个块,但现在包含a[0]a[0]、@987654336前面的两个字@,但不是a[2],也不是a[3]


    我们还假设a 的元素是4 字节整数。 MIPS 对整数有对齐要求,但它只有 4 个字节,而不是 16 个字节。因此,没有理由假设 a 对齐的字节数超过 4 字节,除非我们被告知更多。

    【讨论】:

    • 谢谢!是的,我想对齐很重要,在这种情况下,它们可以很好地映射(从 0000 开始)。我是否也可以快速检查我对标签、索引和偏移量的计算是否正确?我有时发现很难计算这些,因为在我的讲座中,我得到了更多信息来推导这些,但在我的教程中,他们只给了我“缓存的总大小”和“块大小”(我假设是缓存大小?)
    • 是的,你是对的。直接映射缓存与单向组关联缓存相同。因此,我们将总缓存字节 (32) 除以 1 = 32,((对于 2-way,我们将在此处除以 2)),然后由于块大小为 16,我们确定只有两个索引位置(0 ,1 = 1 位) 16 字节中的 32 字节。
    猜你喜欢
    • 2018-06-24
    • 2018-05-24
    • 2012-04-11
    • 2014-06-04
    • 2020-04-18
    • 2012-07-09
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多