1

このコードを 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 ループを高速化しようとしているので、クレイジーなことを試しています。セグメンテーション違反を取り除くにはどうすればよいですか? また、別の最適化方法を試す必要がありますか?

4

2 に答える 2

2
  1. コンパイラはほぼ確実にあなたよりも最適化します。コンパイラの裏をかこうとしないでください。

  2. 問題はほぼ確実sum += array[ARRAY_SIZE];に C の配列インデックスが 0 からサイズ 1 になることです。

于 2013-08-20T00:34:17.697 に答える