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));
}

输出结果如下:

 

posted @ 2023-01-30 16:05  风中的摇坠  阅读(269)  评论(0)    收藏  举报