Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4743 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  RNG et multithreading

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

RNG et multithreading

n°2032908
Lan Wezel
Posté le 28-10-2010 à 16:34:33  profilanswer
 

Bonjour,
 
J'utilise boost::mt19937 comme RNG.
Avant de multithreader mon code je l'avait mis dans un singleton pour le seeder une seule fois pour toutes.

Code :
  1. class RandomGenerator : public boost::mt19937{
  2.     static ml::RandomGenerator m_instance;
  3.     RandomGenerator(){
  4.       seed( time(NULL) * getpid() );
  5.     }
  6.     ~RandomGenerator(){}
  7.   public:
  8.     static RandomGenerator& instance(){
  9.       return m_instance;
  10.     }
  11.   };


Maintenant je suis en train de multithreader mon code avec OPENMP, et je voudrais faire ça un peu propremment. Comme je voudrais avoir le même RNG dans tous les threads, je suis confronté au problème suivant :
L'appel est donc de la forme :

Code :
  1. boost::bernoulli_distribution<> distrib(threshold);
  2. event = distrib(RandomGenerator::instance());


sauf que j'ai cru comprendre que boost::mt19937 n'est pas thread-safe. Donc je peux avoir deux threads qui appellent le RNG en même temps et qui vont donc avoir le même résultat. Et je ne vois pas trop comment m'en sortir. En effet, ce qui devrait être locké, ce n'est pas le fait de demander l'instance du RNG, mais l'utilisation qu'en fait la distribution.
Est-ce que je vais devoir me rabattre sur un RNG par thread (comme j'utilise OpenMP je sais pas trop comment ça va être possible) ou y a-t-il un solution à ce problème ?


Message édité par Lan Wezel le 28-10-2010 à 18:19:57
mood
Publicité
Posté le 28-10-2010 à 16:34:33  profilanswer
 

n°2032950
Lan Wezel
Posté le 28-10-2010 à 18:11:19  profilanswer
 

J'ai trouvé une solution, mais je ne sais pas si c'est très propre.
Comme l'operateur () des random::distribution est template de l'Engine (RNG), j'ai réimplémenté l'operateur () du RNG en mettant une section critique.
 

Code :
  1. class RandomGenerator : public boost::mt19937{
  2.     static ml::RandomGenerator m_instance;
  3.     RandomGenerator(){
  4.       seed(time(NULL) * getpid() );
  5.     }
  6.     ~RandomGenerator(){}
  7.   public:
  8.     static RandomGenerator& instance(){
  9.       return m_instance;
  10.     }
  11.     boost::mt19937::result_type operator()(){
  12.       boost::mt19937::result_type r;
  13.       #pragma omp critical
  14.       {
  15. r = boost::mt19937::operator()();
  16.       }
  17.       return r;
  18.     }
  19.   };


 
Je suis ouvert à toute critique (acerbe ou non) sur la propreté de cette solution car l'operateur boost::mt19937::operator()() n'est pas "virtual". Il aurait peut-être été plus propre de le wrapper complètement plutôt que d'en hériter.


Message édité par Lan Wezel le 28-10-2010 à 18:15:34
n°2033218
el muchach​o
Comfortably Numb
Posté le 29-10-2010 à 21:30:44  profilanswer
 

Ton problème est le sujet de cette discussion: http://www.wilmott.com/messageview [...] TARTPAGE=1
En page 3, sont mentionnées des impléms particulières comme http://trng.berlios.de/


Message édité par el muchacho le 30-10-2010 à 00:11:11

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  RNG et multithreading

 

Sujets relatifs
librairie multithreading[J2EE][Multithreading] séparer les traitements et resynchroniser
UDP/TCP multithreading/sockets asynchronesProgramme Multithreading
Multithreading pour les nulsselect() + multithreading
[Java] Multithreading et gestion des exceptionsexceptions et multithreading ?
MultiThreading C/C++ + VBS[VB] Multithreading ?
Plus de sujets relatifs à : RNG et multithreading


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)