csapp perflab

第四个lab,纠结了好久,仍然提高不多,欢迎拍砖.

解决思路:

rotate:

  1.个人感觉写不命中的惩罚会更高一点,所以把按顺序读的逻辑改成了写按顺序;

  2.为了充分利用一级缓存(32KB), 采用分块策略, 每一个块大小为32.

  提升约6.5倍

/* 
 * rotate - Your current working version of rotate
 * IMPORTANT: This is the version you will be graded on
 * size of cache 1: 32K
 * size of pixel :  6B
 */
char rotate_descr[] = "rotate: Current working version";
void rotate(int dim, pixel *src, pixel *dst) 
{
    int i, j, i1, j1, im, jm;
    int block=32;//blocking the Matrix
    for(i=0; i

smooth:

  1.保存需要重复利用的计算的结果, 查表法

  提升约12倍

char smooth_descr1[] = "smooth: Storing reused results.";
void smooth1(int dim, pixel *src, pixel *dst) 
{
    pixel_sum rowsum[530][530];
    int i, j, snum;
    for(i=0; i

让我纠结的问题:

1.第二题昨天一开始就想到要把重复计算的部分保存起来,但是算法实现后一直是segmentation fault, 在这个系统里又没法调试,我实在不知道如何解决了,纠结了好长时间,不得不暂时放弃了.  今天突然发现原来的类型转换没有把后面整个表达式括起来,可能导致后面运算后结果仍为int型,赋值时发生了错误...

2第二题segmentation fault解决之后,又发现一个问题就是总是有好多算出来的结果是错误的,而且与正确结果只相差1. 想了好久终于明白了,是因为我把除法分到了两个部分分别计算(比如/4变成了两次/2),导致舍入的时候出现了误差.


你可能感兴趣的:(csappLab)