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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top