安全でない OpenMP* NOWAIT 節

並列領域内で NOWAIT 節を使用して変数が書き込まれ、その後同期化しないで読み取られています。

NOWAIT 節では、スレッドはチーム内のほかのスレッドがその領域を完了するのを待つことなく、並列領域の実行を続けることができます。つまり、並列領域の終わりにある暗黙的なバリアを無効にします。並列領域の終わりと読み取りとの間に BARRIER がないため、1 つの変数が並列領域内で書き込まれ、その領域の後で読み取られることがあります。

これは、並列領域内で変数を書き込むスレッドと並列領域外で変数を読み取るスレッドとの間に競合状態を引き起こします。

同様の問題は、TASK 領域でも発生します。この場合、TASKWAIT 宣言子を使用して、タスク領域内のすべてのスレッドが処理を終えるまで、メインスレッドを待機させる必要があります。

ID

問題箇所

説明

1

メモリー読み取り

並列領域外で変数が読み取られた場所

2

メモリー書き込み

並列領域内で変数に書き込まれた場所

3

OpenMP* 宣言

並列領域が定義された場所


#include <stdio.h>
#include <omp.h>

int main(int argc, char **argv)
{
    int i;
    int sum = 0;
 
    #pragma omp parallel shared(sum)
    {
        #pragma omp single
        {
            #pragma omp task
            {
                for (i = 0; i < 1000; i++) {
                    a[i] = i;
                    sum = sum + a[i];
                }
            }
            
            // Need "#pragma omp taskwait" here
            
            printf("%d\n", sum); // sum is indeterminate here
        }
    }
    return 0;
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。