4

我有一个循环,应该通过插入一个 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 代码是线程安全的,其他平台也可能并非如此。

4

2 回答 2

6

浏览 Boost 邮件列表档案可以得到:

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

只要您不同时从两个线程访问任何给定对象,Boost.Random 就是线程安全的。(访问两个不同的对象是可以的,只要它们不共享一个引擎)。如果您需要这种安全性,使用适当的互斥体包装器自行滚动它是微不足道的。

于 2010-05-27T13:54:20.750 回答
1

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

于 2013-08-10T18:00:50.123 回答