当我尝试在gcc上编译此代码时,我收到了分段错误错误。
#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;
double sum1 = 0;
for (i = 0; i < N_TIMES; i++) {
int j;
for (j = 0; j < ARRAY_SIZE; j += 20) {
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];
sum += array[j+10] + array[j+11] + array[j+12] + array[j+13] + array[j+14] + array[j+15] + array[j+16] + array[j+17] + array[j+18] + array[j+19];
}
}
sum += sum1;
return 0;
}
我正在努力加速for循环,所以我正在尝试疯狂的事情。如何摆脱分段错误?我还应该尝试不同的优化方法吗?
答案 0 :(得分:2)
编译器几乎肯定会优于您。不要试图超越编译器。
问题几乎肯定是sum += array[ARRAY_SIZE];
C中的数组索引从0变为1,所以在这里你可能会“一个接一个”
答案 1 :(得分:1)
因此,您的原始问题是由于您在内部循环中的数组索引中使用i
而不是j
这一事实,因为N_TIMES
比{{1}大得多你将最终溢出你的数组边界,这是未定义的行为。
更正的代码仍有一个明显的问题:
ARRAY_SIZE
sum += array[ARRAY_SIZE];
的有效索引将来自array
,因此访问元素0 to ARRAY_SIZE-1
是通过超出数组边界来调用未定义的行为。