来自Boost.Random的多线程RNG

时间:2013-04-09 15:24:34

标签: c++ boost random openmp

我正在尝试将多线程包含到我的程序中,该程序显示在线程的末尾。关于RNG的部分我遇到了一些困难,我使用了boost/random。我正在使用OpenMP进行多线程处理。我可以理解Boost的变量生成器不支持安全的多线程,但是我很努力找到一种方法,到目前为止没有运气。请注意,函数norm稍后在我的程序中使用,但这次是在一个线程上。我提到这个,因为它可能排除一些解决方案(或者可能不是)..

到目前为止我自己的方法:我在生成数字之前使用#pragma omp critical尝试了保护措施,但在这种情况下,多线程不会增加计算速度(我有比较时间......)

我故意发布了我问题的最简单版本,因此如果需要,可以说明解决方案。即使我使用的是OpenMP,我也愿意切换到Boost.Thread,如果它更容易实现,那么我会看到一些进展。

编辑我已经阅读了多个地方,为每个线程创建一个RNG实例是一个选项,但我很高兴看到,在实践中如何做到这一点。

感谢您提前参与。

#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;

}

1 个答案:

答案 0 :(得分: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++;
}

更明智的选择是每个线程都有一个RNG。我确信这可以通过OpenMP实现,但我不知道如何。