1

openMP で「共有」が何をするのかは不明です。仕様には、「タスクによって共有される 1 つ以上のリスト項目を宣言する...」と共有されていることが記載されていますが、それは私には不明確に思えます。

たとえば、次のコードがあるとします。

    #pragma omp parallel for shared(num1)
    for(i=0; i<m; i++) {
        for(j=0; j < n; j++) {
            if(myFunc(i,j) < 0) {
                num1 += 256*u(i,j);
            }
        }
    }

これにより、num1 との競合状態が停止し、この for ループの最後に正確な結果が得られますか? そうでない場合、それは正確に何をしますか?

4

1 に答える 1

0

これは競合状態を停止しますか?

いいえ、それはしません:

複数のスレッドが (CRITICAL セクションなどを介して) SHARED 変数に適切にアクセスできるようにすることは、プログラマの責任です。

共有セクションは、同じ変数を複数のスレッドから見えるようにするだけです。

同期にはクリティカル セクションまたはアトミック アクセスを使用できますが、この場合は削減句を使用することをお勧めします。

#pragma omp parallel for reduction(+:num1)
于 2013-05-13T04:52:07.443 に答える