2011-01-06 12 views
5

、私はint *x OpenMPでクラスメンバー変数xを共有(x)できないのはなぜですか?メンバ関数で

このような
#pragma omp parallel for default(shared) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

共有メンバ変数を使用して並列化することができます。しかし、私は

#pragma omp parallel for default(none) shared(x,size) 
for(int i=0;i<size;i++) { 
    x[i]=i; 
} 

をしようとすると、私はエラーを取得:'obj::x' is not a variable in clause 'shared'を。 2番目のバージョンは、競合状態やそれに類する問題がないことを確認してくれている共有変数を通知するので、2番目のバージョンが好きです。

OpenMPは、obj::xは変数ではないと主張していますか?

+0

これを試してみましたか?x?どのコンパイラを使用していますか? – Beanz

+0

コンパイラはg ++ 4.4です。 '#pragma omp parallel for default(none)shared(this-> x、size)'を実行しようとすると、エラーが発生します: 'this'の前にunqualified-idが必要です。 –

答えて

11

ほとんどの実装では、並列領域の輪郭を描きます。つまり、彼らはそれを機能にします。プライベート変数は通常この関数に渡され、共有変数は関数のスコープ内に渡されるか、またはその範囲内にある可能性があります。クラスデータメンバーの問題は、変数と同じではないということです。

コンパイラが並列領域の概要を示すとき、変数には、コンパイラが関数に渡すように設定できる格納場所が定義されています。データメンバは、プログラムの実行中にクラスが呼び出されるまで、インスタンス化されない(すなわち、記憶域が割り当てられる)ことはできない。これは、コンパイラが単独でデータメンバーを民営化することができないことを意味します。実行時にも実行する必要があり、これにより多くの作業が発生し、シリアルプログラムと並列プログラムの両方のパフォーマンスに影響します。これまでの実装ではこの作業を試みておらず、OpenMP仕様がコンセンサスで作成されているため、すべての節でデータメンバーを許可しないという決定が下されました。それ以外の場合は、共有節で許可されているとは言い難いようですが、他の節はありません。

1

がprecisiely知ってはいけない - しかし、ほとんどのOpenMPの問題を整理するために32 OpenMP traps for C++ developersを通じて見てみるのOpenMPの

+1

リンクありがとうございます! –

+0

リンクされた文書で私の質問への参照が見つかりませんでした。あなたはもっと具体的になりますか? –

+0

申し訳ありませんが、私は正確な答えはありません、私はあなたに役立つリンクに何かがあることを望んだ –

関連する問題