阵列的 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 字节对齐的,除非我们被告知更多。
我需要弄清楚 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 字节对齐的,除非我们被告知更多。