优化循环添加

csS*_*ent -1 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;
}
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是在内部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]);
                }
Run Code Online (Sandbox Code Playgroud)

在每个循环中将其取出到阵列中的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]);
Run Code Online (Sandbox Code Playgroud)

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

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

EDIT2:这是我正在为我的作业优化的代码的一部分:

        for (j = 0; j < ARRAY_SIZE; j++) {
            sum += array[j];
            }
Run Code Online (Sandbox Code Playgroud)

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

inf*_*nge 5

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

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

sum *= N_TIMES
Run Code Online (Sandbox Code Playgroud)