質問

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

(私がエラーを犯さない限り、各実行は他の人にまったく依存しません。すべてのコードが挿入されていないことを申し訳ありません)。

しかし、私の質問は - ブーストRNGスレッドセーフですか? GCCのGCCコードを参照しているようで、GCCコードがスレッドセーフであっても、他のプラットフォームには当てはまらない可能性があります。

役に立ちましたか?

解決

ブーストメーリングリストの閲覧アーカイブは次のように与えます。

boost.randomは、マルチスレッドからの保護が必要なグローバルな状態を維持していません。

Boost.randomは、2つのスレッドから同時に特定のオブジェクトにアクセスしない限り、スレッドセーフです。 (エンジンを共有しない限り、2つの異なるオブジェクトにアクセスすることは問題ありません)。そのような安全性が必要な場合は、適切なMutexラッパーで自分でそれを転がすのは些細なことです。

他のヒント

スレッドの安全性が心配な場合は、ブーストを使用しないでください。TRNGを使用してください。ドイツのティナクラスターで実行されるように構築された並列乱数生成ライブラリ。これにより、乱数の複数のストリームを作成できます。ここにOpenMPでTRNGを使用する方法に関するチュートリアルがあります http://www.lindonslog.com/programming/parallel-random-number-generation-trng/ あなたがやろうとしているように。使用しているスレッドの数に従って独立した数のストリームを作成し、スレッドのランクを使用してそれらから描画します。上記のチュートリアルにはすべて。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top