OpenMP* SINGLE 領域で必要な COPYPRIVATE 節

PRIVATE または THREADPRIVATE 変数が SINGLE 領域の中で代入された後に使用されていますが、COPYPRIVATE 節で指定されていません。

THREADPRIVATE 宣言子と PRIVATE 宣言子は、それぞれのスレッドで独自のコピーを持ち、変数が複製されるように指定します。COPYPRIVATE 節は単一スレッドにより取得された値を、その領域を実行しているほかのスレッドに属する名前付き変数のコピーにブロードキャストするのに使用されます。

THREADPRIVATE 変数または PRIVATE 変数が SINGLE 領域で代入され、そしてその領域の後で使用された場合、 COPYPRIVATE 節を使用する必要があります。使用されない場合、使用時の変数の値は、あるスレッドによって値がセットされ、別のスレッドによって使用されるため不定になります。

コピーは特定のスレッド、例えばマスタースレッドなどにによって実行しなければならないことがあります。そのような場合、直接ブロードキャストするのに COPYPRIVATE 節は使用できません。代わりに、単一スレッド化領域で一時変数を作成して、 COPYPRIVATE を適用してその一時共有変数にアクセスを提供する必要があります。

ID

問題箇所

説明

1

メモリー書き込み

COPYPRIVATE 変数が記述された場所

2

OpenMP* 宣言

SINGLE 領域が宣言された場所

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

int main(int argc, char **argv)
{
    int i, sum = 0, offset;
    int a[100];

    #pragma omp parallel private(a, offset) reduction(+:sum)
    {
    #pragma omp single // copyprivate(offset) is needed
        {
           offset = 1;
        }
    #pragma omp for
        for (i = 0; i < 100; i++) {
           a[i] = i;
           sum = sum + a[i] + offset;
        }
    }
    printf("%d\n", sum);
    return 0;
}
        

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