Я бы хотел распараллелить мой код генератора случайных чисел в C ++ с OpenMP.Я хотел бы сделать это так, чтобы это было эффективно и безопасно для потоков.Может кто-нибудь подсказать мне, как это делается?В настоящее время я прилагаю то, что у меня есть ниже;это явно не безопасно для потоков, так как статическая переменная в функции 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();
}