2010-08-04 17 views
2

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(); 
} 

Répondre

2

Avez-vous besoin de quelque chose qui est sûr pour les threads ou quelque chose qui évolue bien? Si vous n'avez pas besoin de très hautes performances dans votre PRNG, vous pouvez simplement boucler un verrou autour des utilisations de l'objet rng. Pour de meilleures performances, vous devez trouver ou écrire un générateur de nombres pseudo-parallèles parallèle - http://www.cs.berkeley.edu/~mhoemmen/cs194/Tutorials/prng.pdf a un tutoriel sur eux. Une option consisterait à placer vos objets mt19937 dans le stockage local, en veillant à semer des fils différents avec des graines différentes; cela rend difficile la reproduction des mêmes résultats dans des passages différents, si c'est important pour vous.

+0

Étant donné l'exemple de code, pratiquement tout * est un générateur de nombres aléatoires. – Puppy