【问题标题】:Thread-safety of boost RNGboost RNG的线程安全
【发布时间】:2011-02-24 14:49:03
【问题描述】:

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

【问题讨论】:

    标签: c++ boost openmp boost-random


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 2012-03-05
        • 2023-03-29
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        相关资源
        最近更新 更多