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的值是:
(A) 0
(B) 2048
(C) 16384
(D) 262144答案: (C)
说明: [P1]以以下方式运行循环:以行主要顺序访问A的元素,而[P2]以列主要顺序访问元素的方式。
缓存块数= CacheSize / BlockSize = 32KB / 128字节= 256
每个块中的数组元素数= BlockSize / ElementSize = 128字节/ 8字节= 16
[P1]的未命中总数= ArraySize *(每个块中数组元素的数量)/(缓存块的数量)= 512 * 512 * 16/256 = 16384
这个问题的测验