优化循环添加

时间:2017-08-22 21:18:00

标签: c optimization

我有一个优化for循环的任务,所以编译器编译运行得更快的代码。目标是使代码在5秒或更短的时间内运行,原始运行时间约为23秒。原始代码如下所示:

#include <stdio.h>
#include <stdlib.h>

#define N_TIMES     600000
#define ARRAY_SIZE   10000

int main(void)
{
    double  *array = calloc(ARRAY_SIZE, sizeof(double));
    double  sum = 0;
    int     i;

    printf("CS201 - Asgmt 4 - I. Forgot\n");

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

        int     j;

        for (j = 0; j < ARRAY_SIZE; j++) {
            sum += array[j];
            }

        }

    return 0;
}

我的第一个想法是在内部for循环上进行循环展开,使其下降到5.7秒,并且该循环看起来像这样:

 for (j = 0; j < ARRAY_SIZE - 11; j+= 12) {
            sum = sum + (array[j] + array[j+1] + array[j+2] + array[j+3] + array[j+4] + array[j+5] + array[j+6] + array[j+7] + array[j+8] + array[j+9] + array[j+10] + array[j+11]);
                }

在每个循环中取出阵列中的12个点之后,性能不再增加,所以我的下一个想法是尝试引入一些并行性,所以我这样做了:

   sum = sum + (array[j] + array[j+1] + array[j+2] + array[j+3] + array[j+4] + array[j+5]);
   sum1 = sum1 + (array[j+6] + array[j+7] + array[j+8] + array[j+9] + array[j+10] + array[j+11]);

这实际上最终减慢了代码的速度,而且每个额外的变量再次降低了代码的速度。我不确定并行性是否在这里不起作用,或者我是否错误地实现了它或者什么但是没有用,所以现在我不确定如何优化它再低于5秒。

编辑:我忘了提到我无法对外循环进行任何更改,只有内循环

EDIT2:这是我尝试优化作业的代码的一部分:

        for (j = 0; j < ARRAY_SIZE; j++) {
            sum += array[j];
            }

我正在使用带有标志的gcc编译器 gcc -m32 -std = gnu11 -Wall -g a04.c -o a04 关闭所有编译器优化

2 个答案:

答案 0 :(得分:5)

由于j和我不相互依赖,我认为你可以这样做:

for (j = 0; j < ARRAY_SIZE; j++) {
    sum += array[j];
}

sum *= N_TIMES

答案 1 :(得分:0)

您可以将变量'j'的声明移出循环,如下所示:

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

    //int     j; <-- Move this line out of the loop
    for (j = 0; j < ARRAY_SIZE - 11; j+= 12) {
        sum = sum + (array[j] + array[j+1] + array[j+2] + array[j+3] + array[j+4] + array[j+5] + array[j+6] + array[j+7] + array[j+8] + array[j+9] + array[j+10] + array[j+11]);
    }
 }

每次循环运行时都不需要声明一个新变量'j'。