增强RNG的线程安全性

时间:2010-05-27 11:06:38

标签: c++ boost openmp boost-random

我有一个循环,应该通过插入一个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();
      }

(除非我犯了错误,否则每次执行都不依赖于其他人。很抱歉没有插入所有代码。)

但是我的问题是 - 是否提升RNG线程安全性?它们似乎是指gcc的gcc代码,所以即使gcc代码是线程安全的,也可能不是其他平台的情况。

2 个答案:

答案 0 :(得分:6)

浏览Boost邮件列表档案提供:

  

Boost.Random不维护全局   需要保护的国家   多线程。

     

Boost.Random只要是线程安全的   你不访问任何给定的对象   两个线程同时。 (访问   两个不同的对象都可以   因为他们不共享引擎)。如果你   要求那种安全,就是这样   用你自己滚动它是微不足道的   一个合适的互斥包装器。

答案 1 :(得分:1)

如果您担心线程安全,请不要使用boost,请使用TRNG。它是一个并行随机数生成库,可以在德国的TINA集群上运行。它允许您创建多个随机数流。有一个关于如何在这里使用TRMP与OpenMP http://www.lindonslog.com/programming/parallel-random-number-generation-trng/的教程就像你想要做的那样。您根据正在使用的线程数创建一个独立数量的流,然后使用线程的等级从它们中绘制。它完全在上面的教程中。