コードのOpenMP並列セクションから「バスエラー」が発生しました。私は下の私の問題の簡単なバージョンを作り直しました。このコードは基本的に、ブーストのuniform_int_distributionを使って0から20000までの整数を描画する関数uniform_distribution
を多く呼び出します。Boost RandomとOpenMP
このpostは、同じオブジェクトにアクセスする2つのスレッドを警告します。私はそれが私の場合はeng
だと思います。 (残念ながら、私は、適切なミューテックスラッパーを書く方法を知らないので、その投稿が示唆している通りです)。
考えられる汚れた解決策は、#pragma for
ループ内にローカルeng
を作成し、これを引数としてuniform_distribution
に渡すことでした。私の実際のコードでは、私は多くの関数を呼び出しているので、ローカルのeng
を渡すのは面倒なので、私はこの考えが気に入らない。また、eng
の中にuniform_distribution
と宣言すれば、異なるスレッドがと同じの乱数列を生成することが懸念されます。だから私は二つの要件があります:どのようにして並列化するのですか
- 各スレッドは他のスレッドから確率的に独立した描画を生成していますか?
- RNGで競合状態が発生しませんか?
ありがとう;どんな援助も暖かく感謝しています。あなたには、いくつかのコードを並列化すると
#include <omp.h>
#include <boost/random/uniform_int_distribution.hpp>
boost::random::mt19937 eng;
int uniform_distribution(int rangeLow, int rangeHigh) {
boost::random::uniform_int_distribution<int> unirv(rangeLow, rangeHigh);
return unirv(eng);
}
int main()
{
# pragma omp parallel for private(eng)
for (int bb=0; bb<10000; bb++)
for (int i=0; i<20000; i++)
int a = uniform_distribution(0,20000);
return 0;
}
private節は、実際には変数のスレッドローカルバージョンを作成します。 threadprivateディレクティブが適用された変数とは異なり、スレッドが結合するときには割り当てられません。しかし、OPの例ではこれは問題ではありません。プライベート句がここで動作しない理由は、uniform_distributionで参照されるengがスレッド固有のものではなくグローバルなものであることです。 – jerry
はい、 'priavte'に関するあなたの点は正しいです。私は文を削除しました。しかし、OPが持つ問題は本質的に民営化の問題です。スレッドローカルを作ることは解決策になります。 2番目の解決策は民営化のための手段です。 – minjang
FYI:http://msdn.microsoft.com/en-us/library/c3dabskb(v=vs.80).aspx – minjang