CSAPP存储器山-代码解析
CSAPP存储器山的test()方法一直没理解,运行了修改的代码,瞬间理解了。
在mountain.c文件中加入了打印数组下标,如下:
#include <stdio.h> #define SIZE 200 int data[SIZE]; /* 初始化数组 */ void initData(void); /* 访问工作集大小为elems、步长为stride的数组 */ int test(int elems, int stride); int main(void) { initData(); printf("please input elems and stride, press 'q' to quit : \n"); int elems; int stride; while (scanf("%d %d",&elems, &stride) == 2 ) { test(elems, stride); printf("\n"); printf("\n"); printf("please input elems and stride, press 'q' to quit : \n"); } return 1; } void initData(void) { int i; for (i = 0; i < SIZE; i++) { data[i] = i; } } int test(int elems, int stride) { long i, sx2 = stride*2, sx3 = stride*3, sx4 = stride*4; long acc0 = 0, acc1 = 0, acc2 = 0, acc3 = 0; long length = elems; long limit = length - sx4; /* Combine 4 elements at a time */ printf("%-20s %-20s %-20s %-20s \n", "acc0", "acc1", "acc2", "acc3"); /* limit意为输出数量为(n = elems / sx4) 的sx4大小的数组块 */ for (i = 0; i < limit; i += sx4) { acc0 = acc0 + data[i]; acc1 = acc1 + data[i+stride]; acc2 = acc2 + data[i+sx2]; acc3 = acc3 + data[i+sx3]; printf("%-20d %-20d %-20d %-20d \n", i, i+stride, i+sx2, i+sx3); } /* Finish any remaining elements */ /* 将余下的(n = elems % sx4)的数组空间也输出 */ printf("Finish any remaining elements: \n"); for (; i < length; i++) { acc0 = acc0 + data[i]; printf("%-5d", i); } return ((acc0 + acc1) + (acc2 + acc3)); }
输出结果如下:


浙公网安备 33010602011771号