阵列的 MIPS 直接映射高速缓存

MIPS Direct Mapped Cache for Arrays

我需要弄清楚 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] 会很受欢迎。

还是我理解有误?

这取决于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]a[1],但不是 a[2],也不是 a[3]


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