2010-05-27 176 views
4

我有一个循环应由insering一个OpenMP的编译很好地被并行化:线程安全

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代码是线程安全的,其他平台也可能不是这种情况。

回答

6

通过Boost邮件列表归档浏览得出:

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

只要 Boost.Random是线程安全的,您不能同时访问 两个线程中的任何给定对象。 (访问 两个不同的对象是好的,只要他们不共享引擎,只要 )。如果你需要这样的安全性,那么它就是 ,你可以使用 合适的互斥包装。

+4

换句话说,为每个线程创建一个rng? – pyCthon 2012-09-30 16:33:53

1

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