コードの OpenMP 並列セクションから「バス エラー」が発生しています。以下の問題の簡単なバージョンを再作成しました。このコードは基本的に、uniform_distribution
Boost の uniform_int_distribution を使用して 0 から 20000 までの整数を描画する関数 を多数呼び出します。
この投稿は、2 つのスレッドが同じオブジェクトにアクセスしていることを警告しています。私のeng
場合だと思います。(残念ながら、その投稿が示唆するように、「適切なミューテックスラッパー」の書き方がわかりません)。
私が考えた汚い解決策はeng
、ループ内にローカルを作成し、#pragma for
それを引数として に渡すことでしたuniform_distribution
。私の実際のコードでは、多くの関数を呼び出しており、ローカルを渡すのeng
は面倒なので、このアイデアは好きではありません。また、私の懸念は、内部で宣言すると、異なるスレッドが同じ乱数シーケンスを生成することです。したがって、2 つの要件があります。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;
}