我想用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();
}
答案 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/