在C中循环展开

时间:2014-06-10 21:31:01

标签: c loops optimization

我应该在C中优化循环。循环如下:

#define N_TIMES     600000
#define ARRAY_SIZE   10000

for (i = 0; i < N_TIMES; i++) {

            for (ptr = array; ptr < &array[ARRAY_SIZE]; ptr+=2) {

                    sum += *ptr;
                    sum1 += *ptr + 1;
            }

    }

sum += sum1;

我们已经介绍了3种类型的优化:循环展开,循环拆分和在循环中使用指针。我已经成功实现了指针和拆分(循环现在比以前快了大约50%),但每次我尝试展开循环时,我的速度都没有提升。这是我一直在尝试的:

for (i = 0; i < N_TIMES; i++) {

            for (ptr = array; ptr < &array[ARRAY_SIZE]; ptr+=4) {

                    sum += *ptr;
                    sum += *ptr + 1;
                    sum1 += *ptr + 2;
                    sum1 += *ptr + 3;
            }

    }

这似乎什么都不做。我只是完全误解了什么循环展开,或者我应该继续在循环声明中将ptr递增2直到它工作?任何和所有的帮助表示赞赏!

另外,我知道编译器在当今世界中进行了大部分优化,但这是一个类的任务,我必须这样做。

1 个答案:

答案 0 :(得分:2)

一,你没有正确展开循环。它应该是:

for (i = 0; i < N_TIMES; i++) {
    for (ptr = array; ptr < &array[ARRAY_SIZE]; ptr+=4) {
        sum += *ptr;
        sum1 += *ptr + 1;
        sum += *(ptr+2);
        sum1 += *(ptr+2) + 1;
    }
}

显然可能原始循环不是你真正想要的。但是因为你错误地翻译它,如果数组元素是双精度的(如果你告诉我们会很好),原始循环每次迭代执行3次浮点操作,错误展开的循环每次迭代执行7次浮点指针操作,显然是一半许多迭代,仍然有16.7%的浮点运算。