我有一个优化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 关闭所有编译器优化
答案 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'。