Pregunta

Tengo un bucle que debe ser muy bien parallelized por insering pragma uno OpenMP:

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

(a menos que ponga un error cada ejecución no depende de los demás en absoluto. Lo siento que no todo el código se inserta).

Sin embargo, mi pregunta es - son impulso RNG flujos seguros? Que parece referirse al código de gcc gcc para lo que incluso si el código gcc es seguro para subprocesos que puede no ser el caso para otras plataformas.

¿Fue útil?

Solución

La navegación por los archivos de la lista de correo Boost da:

Boost.Random no mantiene mundial estado que necesita protección contra multi-threading.

Boost.Random es thread-safe mientras no accede a un objeto dado de dos hilos simultáneamente. (Acceso dos objetos diferentes es aceptable, siempre y ya que no comparten un motor). Si tu requerir ese tipo de seguridad, que es trivial para rodar que por su cuenta con una envoltura mutex apropiado.

Otros consejos

Si está preocupado por la seguridad de rosca no utilice impulso, el uso TRNG. Su biblioteca generación de números aleatorios en paralelo construido para ser ejecutado en el tablero de TINA en Alemania. Se le permite crear múltiples flujos de números aleatorios. Hay un tutorial sobre cómo utilizar TRNG con OpenMP aquí http: // www.lindonslog.com/programming/parallel-random-number-generation-trng/ al igual que lo está tratando de hacer. Se crea un número independiente de corrientes según el número de hilos que está utilizando, y luego extraer de ellos utilizando el rango de la rosca. Sus todos en el tutorial anterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top