📜  门| GATE-CS-2006 |第81章

📅  最后修改于: 2021-06-28 21:23:36             🧑  作者: Mango

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。这个问题的测验