1

次のコードがあり、サイズの異なる複数の行列乗算の実行時間を計算したいと考えています。マトリックス サイズ 100 から始めて 500 まで移動しましたが、1000 にしようとすると、次のエラーが表示されます。サイズが 5000 から 10000 の行列の実行時間を計算したいのですが、誰でも私の問題を解決するのを手伝ってくれますか?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000

int main(void)
{
    int A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE] = {0};
    int i, j, k;

    srand(time(NULL));

    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            A[i][j] = rand()%100;
            B[i][j] = rand()%100;
        }
    }

    clock_t begin, end;
    double time_spent;

    begin = clock();

    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            for(k = 0; k < SIZE; k++)
                C[i][j] += A[i][k] * B[k][j];

    end = clock();

    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

    printf("Elapsed time: %.2lf seconds.\n", time_spent);

    return 0;
}
4

1 に答える 1

6

これは古典的なスタック オーバーフローです。スタックには、それぞれ約 4 MB のサイズ (32 ビット整数を想定) のローカル配列が 3 つあり、合計で約 12 MB になります。最近のほとんどのオペレーティング システムでは、スタックは通常 8 MB 以下です。変数を静的にするか、たとえば

static int A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE] = {0};

それらがスタックに常駐しないようにするか、動的に割り当てないようにします。

于 2013-04-12T10:28:51.050 に答える