Je voudrais paralléliser mon code de générateur de nombres aléatoires de boost en C++ avec OpenMP. Je voudrais le faire de manière à la fois efficace et sûre. Quelqu'un peut-il me donner des indications sur la façon dont cela est fait? Je joins actuellement ce que j'ai ci-dessous; ce n'est clairement pas sûr de thread car la variable statique dans la fonction sampleNormal est susceptible de donner une condition de concurrence. Le nombre d'échantillons (nsamples) est beaucoup plus grand que n.Utilisation du générateur de nombre aléatoire boost avec OpenMP
#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();
}
Étant donné l'exemple de code, pratiquement tout * est un générateur de nombres aléatoires. – Puppy