Sto usando i nuovi generatori di numeri casuali in C++ 11. Sebbene ci siano opinioni diverse, da questo thread sembra che la maggioranza crede che non siano thread-safe. Di conseguenza, vorrei creare un programma, in cui ogni thread utilizza il proprio RNG.come rendere ogni thread utilizza il proprio RNG in C++ 11
Un esempio è dato nel relativo discussione su come ottenere questo risultato con OpenMP:
#include <random>
#include <iostream>
#include <time.h>
#include "omp.h"
using namespace std;
int main()
{
unsigned long long app = 0;
{
//mt19937_64 engine((omp_get_thread_num() + 1)); //USE FOR MULTITHREADING
mt19937_64 engine; //USE FOR SINGLE THREAD
uniform_real_distribution<double> zeroToOne(0.0, 1.0);
//#pragma omp parallel for reduction(+:app) //USE FOR MULTITHREADING
for (unsigned long long i = 0; i < 2000000000; i++)
{
if(zeroToOne(engine) < 0.5) app++;
}
}
cout << app << endl;
return 0;
}
Quando eseguo la versione multi-threaded e single-threaded di questo programma e di tenere traccia del tempo, richiedere lo stesso tempo per terminare dopo l'esecuzione. Inoltre, app
non ha la stessa dimensione nei due casi, ma sospetto che sia semplicemente a causa dei diversi semi.
Domanda: L'esempio fornito mostra correttamente come forzare ogni thread a utilizzare il proprio RNG? In caso contrario, posso vedere un esempio di come è fatto, o ottenere un riferimento ad un posto dove spiegano come ottenere ciò?
Grazie per questo esempio, che è molto utile. Ho due domande: (1) Posso chiederti perché hai scelto di includere ': engines()'? A rigor di termini, è necessario? .... (2) Posso usare l'oggetto 'rand' in un ciclo successivo nel mio programma, che non è parallelizzato? – BillyJean
@BillyJean (1) Non richiesto ma il mio stile personale per chiamare ciascun elemento ctor nella lista di inizializzazione se almeno uno è chiamato. (2) Non sicuro al 100%, ma penso che 'omp_get_thread_num()' restituisce 0 per la regione non parallelizzata, quindi Sì. – hansmaad
Un'ultima domanda: supponiamo di rendere globale 'RNG' e anche il suo oggetto' rand' globale. Invece del condizionale '(rand() <0.5)' Ora chiamo una funzione globale 'func', che esegue alcuni calcoli che dipendono da' rand'. L'uso di 'rand' in' func' sarà ancora sicuro? Direi di sì, ma mi piacerebbe sentire anche la tua opinione professionale. – BillyJean