Frage

Ich habe eine Schleife, die schön durch insering eine openmp Pragma parallelisiert werden sollte:

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

(es sei denn ich einen Fehler jeder Ausführung abhängig machen gar nicht auf andere. Sorry, dass nicht alle Code eingefügt wird).

Doch meine Frage ist - ist boost RNG Thread-sicher? Sie scheint für gcc gcc Code zu verweisen, so auch wenn gcc-Code ist Thread-sicher nicht der Fall für andere Plattformen sein kann.

War es hilfreich?

Lösung

Browsing durch die Boost-Mailinglisten-Archive gibt:

Boost.Random nicht aufrechterhalten global Zustand, würde brauchen Schutz vor Multi-Threading.

Boost.Random ist thread-sicher, solange Sie greifen nicht beliebiges Objekt aus zwei Threads gleichzeitig. (Zugriff auf zwei verschiedene Objekte sind in Ordnung, so lange da sie einen Motor nicht teilen). Wenn du erfordern diese Art von Sicherheit, es ist trivial zu rollen, dass auf eigene Faust mit ein entsprechender Mutex-Wrapper.

Andere Tipps

Wenn Sie die Thread-Sicherheit nicht verwenden Boost, Verwendung TRNG besorgt sind. Es ist eine parallele Erzeugung von Zufallszahlen-Bibliothek gebaut, um auf dem TINA-Cluster in Deutschland betrieben werden. Es ermöglicht Ihnen, mehrere Streams von Zufallszahlen zu erzeugen. Es gibt eine Anleitung, wie man TRNG mit OpenMP verwenden hier http: // www.lindonslog.com/programming/parallel-random-number-generation-trng/ genau wie Sie zu tun versuchen. Sie erstellen eine unabhängige Anzahl von Strömen je nachdem, wie viele Threads Sie verwenden, und dann von ihnen ziehen durch den Rang des Faden. Es ist alles in der obigen Anleitung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top