在OpenMP中使用boost随机数生成器

时间:2010-08-04 12:37:22

标签: boost random numbers generator openmp

我想用OpenMP在C ++中并行化我的boost随机数生成器代码。我想以高效和线程安全的方式做到这一点。有人能指点我这是怎么做的吗?我现在附上以下内容;这显然不是线程安全的,因为sampleNormal函数中的静态变量很可能给出 一场竞争。样本数(nsamples)远大于n。

#pragma omp parallel for private(i,j) 
for (i = 0; i < nsamples; i++) {
   for (j = 0; j < n; j++) {
      randomMatrix[i + nsamples*j] = SampleNormal(0.0, 1.0);
   }
}

double SampleNormal (double mean, double sigma)
{
  // Create a Mersenne twister random number generator
  static mt19937 rng(static_cast<unsigned> (std::time(0)));
  // select Gaussian probability distribution
  normal_distribution<double> norm_dist(mean, sigma);
  // bind random number generator to distribution
  variate_generator<mt19937&, normal_distribution<double> >  normal_sampler(rng, norm_dist);
  // sample from the distribution
  return normal_sampler();
}

2 个答案:

答案 0 :(得分:2)

你只需要一些线程安全的东西或能够很好地扩展的东西吗?如果您在PRNG中不需要非常高的性能,则可以锁定rng对象的使用。为了获得更高的性能,您需要查找或编写并行伪随机数生成器 - http://www.cs.berkeley.edu/~mhoemmen/cs194/Tutorials/prng.pdf有一个关于它们的教程。一种选择是将mt19937对象放在线程本地存储中,确保使用不同的种子播种不同的线程;如果这对你很重要,那么在不同的运行中复制相同的结果很困难。

答案 1 :(得分:0)

“查找或写入并行伪随机数生成器”使用TRNG“TINAS随机数生成器”。它是一个并行随机数生成器库,设计用于在多核集群上运行。比Boost好多了。这里有一个介绍http://www.lindonslog.com/programming/parallel-random-number-generation-trng/