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