Using the boost random number generator with OpenMP

I would like to parallelize my boost random number generator code in C++ with OpenMP. I'd like to do it in way that is both efficient and thread safe. Can someone give me pointers on how this is done? I am currently enclosing what I have below; this is clearly not thread safe since the static variable in the sampleNormal function is likely to give a race condition. The number of samples (nsamples) is much bigger than 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();
}

Upvotes: 2

Views: 2077

Answers (2)

Mael
Mael

Reputation: 1322

"find or write a parallel pseudorandom number generator" use TRNG "TINAS random number generator". Its a parallel random number generator library designed to be run on multicore clusters. Much better than Boost. There's an introduction here http://www.lindonslog.com/programming/parallel-random-number-generation-trng/

Upvotes: 0

Jeremiah Willcock
Jeremiah Willcock

Reputation: 30989

Do you just need something that's thread-safe or something that scales well? If you don't need very high performance in your PRNG, you can just wrap a lock around uses of the rng object. For higher performance, you need to find or write a parallel pseudorandom number generator -- http://www.cs.berkeley.edu/~mhoemmen/cs194/Tutorials/prng.pdf has a tutorial on them. One option would be to put your mt19937 objects in thread-local storage, making sure to seed different threads with different seeds; that makes reproducing the same results in different runs difficult, if that's important to you.

Upvotes: 3

Related Questions