0

スレッドの最後に表示されているプログラムにマルチスレッドを含めようとしています。私が使用boost/randomしているRNGに関する部分に問題があります。マルチスレッドには OpenMP を使用しています。Boost の変量ジェネレーターが安全なマルチスレッドをサポートしていないことは理解できますが、これまでのところ運がなかったので、これを回避する方法を見つけようと懸命に努力しています。この関数normはプログラムの後半で使用されますが、今回は単一のスレッドで使用されることに注意してください。いくつかの解決策を除外する可能性があるため(または除外しない可能性があるため)、これについて言及しています。

これまでの私自身のアプローチ#pragma omp critical:数値を生成する前に使用してセーフガードを試みましたが、その場合、マルチスレッドは計算速度の向上をもたらしません(タイミングで比較しました...)

意図的に問題の最も単純なバージョンを投稿したので、必要に応じて解決策を示すことができます。私は OpenMP を使用していますが、Boost.Thread に切り替える方が簡単で、進歩が見られる場合は、Boost.Thread に切り替えても構わないと思っています。

EDIT各スレッドのRNGのインスタンスを作成することは1つのオプションであるという複数の場所を読みましたが、これが実際にどのように行われるかを非常に嬉しく思います。

事前にご参加いただきありがとうございます。

#include <iostream>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
#include <time.h>

using namespace std;

int main()
{
    boost::mt19937 engine(static_cast<unsigned int>(0));
    boost::normal_distribution<double> dis(0.0, 1.0);
    boost::variate_generator< boost::mt19937, boost::normal_distribution<double> > norm(engine, dis);

    unsigned long long app=0;
    unsigned long long i;
    #pragma omp parallel for private(i) reduction(+:app)
    for(i=0; i<1234567890; i++)
    {
        double temp = norm();
        if(temp < 0.5) app++;
    }
    cout << app << endl;
    return 0;

}
4

1 に答える 1

0

次のように、変数を生成する前にミューテックスなどを取得し、後で解放することができます。

std::mutex mu;
#pragma omp parallel for
for (int i=0;i<123456789;i++) {
  double temp;
  { std::lock_guard<std::mutex> lk(mu);
    temp = norm();
  }
  if (temp < 0.5) app++;
}

より賢明なオプションは、スレッドごとに 1 つの RNG を持つことです。これは OpenMP で可能だと確信していますが、方法がわかりません。

于 2013-04-09T15:29:05.693 に答える