我有一个优化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关闭所有编译器优化
由于j和我不相互依赖,我认为你可以这样做:
for (j = 0; j < ARRAY_SIZE; j++) {
sum += array[j];
}
sum *= N_TIMES
Run Code Online (Sandbox Code Playgroud)