CPU 有一个 32 KB 的直接映射缓存,块大小为 128 字节。假设 A 是一个大小为 512×512 的二维数组,每个元素占用 8 个字节。考虑以下两个 C 代码段,P1 和 P2。
P1:
for (i=0; i<512; i++) {
for (j=0; j<512; j++) {
x += A[i][j];
}
}
P2:
for (i=0; i<512; i++) {
for (j=0; j<512; j++) {
x += A[j][i];
}
}
P1和P2独立执行,初始状态相同,即数组A不在缓存中,i、j、x在寄存器中。设 P1 所经历的缓存未命中数为 M1,而 P2 所经历的缓存未命中数为 M2。
M1/M2 的比值是:
(一) 0
(乙) 1/16
(C) 1/8
(四) 16答案:(乙)
说明: [P2] 以行主要顺序访问 A 的元素和 [P2] 以列主要顺序访问元素的方式运行循环。
缓存块数 = CacheSize/BlockSize = 32KB / 128 Byte = 256
每个块中的数组元素数 = BlockSize/ElementSize = 128 Byte / 8 Byte = 16
[P1] 的总未命中数 = ArraySize *(每个块中的数组元素数)/(缓存块数)= 512 * 512 * 16 / 256 = 16384
[P2] 的总未命中数 = 数组中元素的总数(对于每个元素,都会有一个未命中数)= 512 * 512 = 262144。
日粮 m1/m2 = 16384 / 262144 = 1/16。这个问题的测验