我正在通过计算机系统:程序员的视角工作,我遇到了一个带有32字节直接映射数据缓存和32字节块的问题集。
struct point_color {
int c;
int m;
int y;
int k;
};
struct point_color square[16][16];
int i, j;
/* Outer loop #1 */
for (i = 0; i < 16; i++){
for (j = 0; j < 16; j++) {
square[i][j].c = 0;
square[i][j].m = 0;
square[i][j].y = 1;
square[i][j].k = 0;
}
}
/* Outer loop #2 */
for (i = 0; i < 16; i++){
for (j = 0; j < 16; j++) {
square[j][i].c = 0;
square[j][i].m = 0;
square[j][i].y = 1;
square[j][i].k = 0;
}
}
我也给出了以下规格:
sizeof(int) == 4
square
从内存地址0开始。
缓存最初为空。
唯一的内存地址是数组方块的条目。变量i
和j
存储在寄存器中。
对于每个单独运行的外循环,我必须找到:
一个。写入总数。
B中。缓存中丢失的写入总数。
℃。未命中率。
对于循环#1,我认为:
一个。内循环中的每一行分别写入2个结构点。因此,由于有4行,每个内循环写8次。对于整个代码块,16 * 16 * 8 = 2048。
B中。每个内循环有1个错过。 16 * 16 * 1 = 256。
℃。 256/2048 = 1/8 = 12.5%。
关于循环#2,我认为写入的总数是相同的,但由于切换的尺寸,内部循环的错过写入为2。我不确定如何更准确地说出来。
我的理解是否正确?