设 (S, E, B, m) = (2, 1, 32, 8),即高速缓存有 2 个组,每组 1 行,每个块 32 个字节,地址 8 位
则地址可分成:组索引 s = 1bit、块偏移 b = log2B = 5bit、标记 t = 8 - s - b = 2bit,即 (t, s, b) = (2, 1, 5)
设结构体 X 有 32 字节,创建结构体数组 X[2]
采用中位作索引
t s b
&X[0] = 0 = 00000000 = 00 0 00000
&X[1] = 32 = 00100000 = 00 1 00000
X[0] 和 X[1] 分别存放在组 0 和组 1 中
采用高位作索引
s t b
&X[0] = 0 = 00000000 = 0 00 00000
&X[1] = 32 = 00100000 = 0 01 00000
X[0] 和 X[1] 都将会存放在组 0
当 X[0] 和 X[1] 无法同时存放在高速缓存中
如果以 X[0], X[1], X[0], X[1]…… 的顺序访问,则会发生抖动
更类似的情况是地址相差一个块大小的两个变量(地址分别为 00000000 和 00100000)
- 如果采用地址高位作索引,则会映射在同一组中。
- 如果采用中位,则会映射在不同组的高速缓存块中。
如果 E >= 1,则会存放在同一组的不同行,但是变量个数增加为 4 的话,也就无法同时存放 4 个了。如果 S = 4,并且采用中位作索引,则会同时存放这 4 个变量。
参考资料
[[Book - CSAPP]] 6.4.2 p432