web-dev-qa-db-ja.com

OpenMP:ローカル変数は自動的にプライベートですか?

#pragma omp parallel
{
    int x; // private to each thread ?
}

#pragma omp parallel for
for (int i = 0; i < 1000; ++i)
{
    int x; // private to each thread ?
}

ありがとうございました!

追伸ローカル変数が自動的にプライベートである場合、private句を使用する意味は何ですか?

52
pic11

はい、ローカル変数は自動的にプライベートです。

private句が存在する理由は、 コードを変更する必要がない であるためです。

Private節なしで次のコードを並列化する唯一の方法

int i,j;
#pragma omp parallel for private(j)
for(i = 0; i < n; i++) {
    for(j = 0; j < n; j++) {
        //do something
    }
}

コードを変更することです。たとえば、次のようなものです。

int i
#pragma omp parallel for
for(i = 0; i < n; i++) {
    int j;
    for(j = 0; j < n; j++) {
        //do something
    }
}

これは完全に有効なC89/C90コードですが、OpenMPの目標の1つは、コンパイル時に有効または無効にできるpragmaステートメントを追加する以外はコードを変更する必要はありません。

45
Z boson

並列領域内のデータは、各スレッド専用です。

http://en.wikipedia.org/wiki/OpenMP#Data_sharing_attribute_clauses [データ共有属性句]

4
ysrini