2011-01-17 7 views
3

OpenMPはどのように並列セクション内で宣言されたデータを扱うのですか? C99の前に私はprivate()節を使ってスレッドローカルデータを指定します。OpenMPとC99データ

int i, x; 
#pragma omp parallel for private(x) 
for (i=0; i<n; i++) { 
    x=i; 
} 

C99ではデータとコードを混在させることができましたので、変数を使用する直前に変数を宣言することをお勧めします。ループの範囲内でデータを宣言するとスレッドプライベートであることが保証されますか?例えば、以下のものが有効ですか?

#pragma omp parallel for 
for (int i=0; i<n; i++) { 
    int x=i; 
} 

私は念のためにプライベート(X)を追加しようとしたが、私のコンパイラのオブジェクトは、(おそらくX以来、まだ宣言されていません)。

+0

Googleでのクイック検索は、これが本当に正しいことを示しています。 C++にはこのプロパティがありました。 –

+1

btw:あなたのC90サンプルコードでC99スタイルの 'for'-loopを使っています... – Christoph

+1

おそらくC99の例も有効なC90です。どのような変数もANSI Cの複合文( '{...}'ブロック)の先頭に宣言することができます。 – Juliano

答えて

3

並列構造内で宣言されたものも含めて、いくつかの変数には、あらかじめ決められたデータ共有属性があります(例えば、sharedまたはprivateと宣言することはできません)。それらは、OMP3標準のセクション2.9.1.1で定義されています。

この場合、OpenMP Standard 3.0 2.9.1.1:(p78、12行目)「構成内のスコープで宣言された自動保存期間を持つ変数はプライベートです。私はそれがいつもOpenMPのこの方法であると確信しています。だから、あなたのC99の例では、私とxはプライベートです。一方、xが静的であると宣言されていれば、それは共有されると言っているのと同じセクションを理解しています。私はこの点で、多かれ少なかれ、あなたが期待していることをしていると思います。

1

Cは、forブロック内のxの宣言に常に許可されます。違いはまったくありません。以前はそれをしていたはずです。

違いは実際にはiの宣言にあります。 C89では、forループの前に宣言する必要があります。 OMPはループ変数が各スレッドに対してローカルでなければならないことを "認識"します。

int i; 
#pragma omp parallel for 
for (i=0; i<n; i++) { 
    int x=i; 
} 

ここで、C99はあなたの人生を楽にし、コードを明確にします。

+1

この場合、実際には 'private(i)'を追加する必要はありません.-ループ変数は、共有ループ変数として暗黙的に非公開になります。 "(2.5.1、OpenMP 3標準)それと並行しては意味をなさないでしょう。 –

+0

@ジョナサン:そうですね、それに応じて答えを修正しました。 –

関連する問題