struct pt_color { int c; int m; int y; int k; } struct pt_color square[8][8]; int i, j; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { square[i][j].c = 0; square[i][j].m = 0; square[i][j].y = 1; square[i][j].k = 0; } } struct pt_color { int c; int m; int y; int k; } struct pt_color quare[8][8]; int i, j; for (i = 0; i < 8; i++) { for (j = 0; j < 8; j++) { square [j] [i].c = 0; square [j] [i].m = 0; square [j] [i].y = 1; square [j] [i].k = 0; } } struct pt_color { int c; int m; int y; int k; } struct pt_color square[8][8]; int i, j; for (i = 0; i < 8; i++) for (j = 0; j < 8; j++) square[i][j].y = 1; for (i = 0; i < 8; i++) for (j = 0; j < 8; j++) { square[i][j].c = 0; square[i][j].m = 0; square[i][j].k = 0; }
程序段A 程序段B 程序段C
假设cache的数据区大小为512B,采用直接映射,块大小为32B,存储器按字节编址,sizeof(int)=4。编译时变量i和j分配在寄存器中,数组square按行优先方式存放在000008C0H开始的连续区域中,主存地址为32位。要求: (1) 对三个程序段A、B、C中数组访问的时间局部性和空间局部性进行分析比较。 (2) 画出主存中的数组元素和cache中行的对应关系图。 (3) 计算三个程序段A、B、C中的写操作次数、写不命中次数和写缺失率。 参考答案:
(1)对于时间局部性来说:
程序段A、B和C中,都是每个数组元素只被访问一次,所以都没有时间局部性; 对于空间局部性来说:
程序段A访问顺序和存放顺序一致,所以,空间局部性好; 程序段B访问顺序和存放顺序不一致,所以,空间局部性不好;
程序段C虽然访问顺序和存放