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

(除非我犯错,否则每个执行根本不取决于其他执行。对不起,并非所有代码都已插入)。

但是我的问题是 - Boost RNG线程安全吗?他们似乎是指GCC的GCC代码,因此,即使GCC代码是线程安全的,对于其他平台也不是这种情况。

有帮助吗?

解决方案

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

BOOST.RANDOM不维护需要保护多线程的全球状态。

只要您不同时从两个线程访问任何给定的对象,boost.random就可以使用线程安全。 (只要不共享引擎,访问两个不同的对象就可以了)。如果您需要这样的安全性,那么用适当的静音包装器独自滚动是微不足道的。

其他提示

如果您担心线程安全性,请不要使用Boost,请使用TRNG。它是一个平行的随机数生成库,该库构建为在德国的蒂娜集群上运行。它允许您创建多个随机数流。这里有一个有关如何将TRNG与OpenMP一起使用的教程 http://www.lindonslog.com/programming/parallallal-random-number-generation-trng/ 就像您试图做的一样。您根据使用的线程数量创建独立数量的流数,然后使用线程等级从它们中绘制。这一切都在上述教程中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top