0

次の問題があります。私のコードのパフォーマンスは操作の数に依存します! どうしてですか?(私は openSuse 11.1 で gcc v 4.3.2 を使用しています)

これが私のコードです:

#define N_MAX 1000000

typedef unsigned int uint;

double  a[N_MAX];
double  b[N_MAX];
uint n;

int main(){


    for (uint i=0; i<N_MAX; i++) {
            a[i]=(double)rand()/RAND_MAX;
    }


    for (uint n=100000; n<500000; n+=5000) {

        uint time1 = time(NULL);

        for (uint i=0; i<n;++i)
            for (uint j=0;j<n;++j)
                    b[j] = a[j]; 

        uint time2 = time(NULL);

        double time = double(time2-time1);

        printf("%5d ", n);
        printf("%5.2f %.3f\n", time, ((double)n*n/time)/1e9);

    }

    return 0;
}

そして、ここに結果のログがあります:

n-time-Gflops (=)
200000 23.00 1.739
205000 24.00 1.751
210000 25.00 1.764
215000 26.00 1.778 220000
27.00 1.793
225000 29.00 1.746
230000 30.00 1.763
235000 32.00 1.726
240000 32.00 1.800
245000 34.00 1.765
250000 36.00
1.736 255000 37.00 1.757
260000 38.00 1.779
265000 40.00 1.756
270000 42.00
1.736 275000 44.00
1.719 280000 46.00 1.704 285000
48.00 1.692 290000 49.00
1.716
295000 51.00 1.706
300000




325000 71.00 1.488 330000 76.00 1.433
335000
79.00 1.421
340000 84.00 1.376
345000 85.00 1.400
350000 89.00
1.376 355000 96.00 1.313
360000 102.00





画像もありますが、新規ユーザー制限のため掲載できません。しかし、ここにログプロットがあります。

この減速の理由は何ですか?それを取り除く方法は?助けてください!

4

2 に答える 2

1

内側のループは毎回反復回数を増やします。計算が増えると、作業に時間がかかることが予想されます。1回目は100kの操作を実行し、2回目は105kの操作を実行します。それは単にますます多くの時間を要しなければなりません。

編集:より明確にするために、私はそれがスポルスキーが画家のアルゴリズムであるシュレミエルと呼んだものに見えると言ってみました

于 2010-12-27T20:53:03.733 に答える
0

たくさんの反応ありがとう!

私の期待は、時間単位あたりの操作数が同じままであるべきだという考えに基づいています。したがって、操作の数を 2 倍に増やすと、計算時間も 2 倍になるため、操作数の比率と計算時間は一定になるはずです。これは私が会ったことのないものです。:(

于 2010-12-28T13:05:21.707 に答える