Thread-sicurezza della spinta RNG
-
05-10-2019 - |
Domanda
Ho un circuito che dovrebbe essere ben parallelized da insering uno OpenMP pragma:
boost::normal_distribution<double> ddist(0, pow(retention, i - 1));
boost::variate_generator<gen &, BOOST_TYPEOF(ddist)> dgen(rng, ddist);
// Diamond
const std::uint_fast32_t dno = 1 << i - 1;
// #pragma omp parallel for
for (std::uint_fast32_t x = 0; x < dno; x++)
for (std::uint_fast32_t y = 0; y < dno; y++)
{
const std::uint_fast32_t diff = size/dno;
const std::uint_fast32_t x1 = x*diff, x2 = (x + 1)*diff;
const std::uint_fast32_t y1 = y*diff, y2 = (y + 1)*diff;
double avg =
(arr[x1][y1] + arr[x1][y2] + arr[x2][y1] + arr[x2][y2])/4;
arr[(x1 + x2)/2][(y1 + y2)/2] = avg + dgen();
}
(meno faccio un errore ogni esecuzione non dipende da altri affatto. Purtroppo non tutti codice è inserito).
Comunque la mia domanda è - sono spinta RNG thread-safe? Essi sembrano fare riferimento al codice gcc per gcc quindi, anche se il codice gcc è thread-safe, non può essere il caso per altre piattaforme.
Soluzione
Navigazione attraverso gli archivi Boost mailing list dà:
Boost.Random non mantiene globale Stato che avrebbe bisogno di protezione dalle multi-threading.
Boost.Random è thread-safe finchè non accedere a qualsiasi dato oggetto da due fili contemporaneamente. (Accesso due oggetti diversi è ok, a patto in quanto non condividono un motore). Se tu richiedono questo tipo di sicurezza, è banale rotolo che sul proprio con un adeguato involucro mutex.
Altri suggerimenti
Se siete preoccupati per la sicurezza dei thread non utilizzare boost, uso TRNG. La sua una biblioteca generazione di numeri casuali in parallelo costruito per essere eseguito sul cluster TINA in Germania. Esso consente di creare più flussi di numeri casuali. C'è un tutorial su come utilizzare TRNG con OpenMP qui http: // www.lindonslog.com/programming/parallel-random-number-generation-trng/ proprio come si sta tentando di fare. È possibile creare un numero indipendente flussi in base a quanti le discussioni che si sta utilizzando, e quindi disegnare da loro utilizzando il rango del filo. E 'tutto nel tutorial qui sopra.