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

📅  最后修改于: 2021-06-29 06:31:58             🧑  作者: 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的值是:
(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

这个问题的测验