Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost.Random中的多线程RNG_C++_Boost_Random_Openmp - Fatal编程技术网

C++ Boost.Random中的多线程RNG

C++ Boost.Random中的多线程RNG,c++,boost,random,openmp,C++,Boost,Random,Openmp,我正在尝试将多线程包含到我的程序中,它显示在线程的末尾。我在RNG方面遇到了一些困难,我使用了boost/random。我正在使用OpenMP进行多线程处理。我可以理解Boost的变量生成器不支持安全的多线程,但我正在努力找到一种解决方法,到目前为止还没有运气。请注意,函数norm稍后将在我的程序中使用,但这次是在单个线程上使用。我之所以提到这一点,是因为它可能会排除某些解决方案(或者可能不会) 到目前为止,我自己的方法是:在生成数字之前,我曾尝试使用#pragma omp critical进行

我正在尝试将多线程包含到我的程序中,它显示在线程的末尾。我在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;

}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
增压:mt19937发动机(静态_铸造(0));
正态分布dis(0.0,1.0);
boost::Variable_generatornormal(发动机,dis);
无符号长app=0;
未签名的长i;
#pragma omp并行专用(i)缩减(+:app)

对于(i=0;i您可以在生成变量之前获取互斥体或其他对象,然后释放它,如下所示:

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++;
}
std::mutex mu; #pragma-omp并行
对于(int i=0;iSuch互斥将使并行性变得无用。由于高争用性,它将比普通循环更糟糕。@Greg:这取决于在RNG中花费了多少时间,以及花了多少时间处理随机数。如果你所做的只是一个“如果”和一个条件增量,那么你是绝对正确的。但是如果你正在做的事情是成本要高得多,这就行了。你是对的,我假设生成变量的成本要高得多。所以生成变量是计算中的瓶颈?你需要每个线程使用自己的RNG。@tmyklebu谢谢你的兴趣。在我的简单示例的设置中,你有没有一个例子说明如何做到这一点?