2

これはコードの一部をテストしています:

    float a = 0;
    float b = 0;
    int c = 0;
    int d = 0;
    #pragma omp parallel for schedule (dynamic, 1)  reduction(+ : a, b, c, d)
    for(i=0; i<100; i++) {
        a +=1;
        b +=1;
        c +=1;
        d +=1;
    }

    printf("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d);

何らかの理由で、私の結果は常に次のとおりです。

a: 100, b: 100, c: 0, d: 202
a: 100, b: 100, c: 0, d: 202
a: 100, b: 100, c: 0, d: 202
a: 100, b: 100, c: 0, d: 202
a: 100, b: 100, c: 0, d: 202
a: 100, b: 100, c: 0, d: 202
a: 100, b: 100, c: 0, d: 202

a、b、c、d がすべて 100 に等しくないのはなぜですか?

4

1 に答える 1

1

%d浮動小数点数を出力するためにフォーマットを使用しています。これにより、未定義の動作が発生します。使用する:

   printf("a: %f, b: %f, c: %d, d: %d\n", a, b, c, d);

そして、正しい答えが得られることがわかります。

于 2013-06-07T04:49:31.687 に答える