4

openmp プラグマを 1 つ挿入することで適切に並列化する必要があるループがあります。

  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 コードがスレッドセーフであっても、他のプラットフォームには当てはまらない場合があります。

4

2 に答える 2

6

Boost メーリング リストのアーカイブを参照すると、次の情報が得られます。

Boost.Random は、マルチスレッドからの保護を必要とするグローバルな状態を維持しません。

Boost.Random は、2 つのスレッドから同時に特定のオブジェクトにアクセスしない限り、スレッドセーフです。(エンジンを共有しない限り、2 つの異なるオブジェクトへのアクセスは問題ありません)。そのような安全性が必要な場合は、適切なミューテックス ラッパーを使用して独自にロールするのは簡単です。

于 2010-05-27T13:54:20.750 に答える