使用OpenMP并行均匀分布伪随机数

时间:2011-06-27 14:39:11

标签: c++ boost random openmp

我在我的程序中使用0和1之间的均匀分布:

 #include <boost/random/uniform_01.hpp>
 #include <boost/random.hpp>

 static boost::mt19937 rng;
 static boost::uniform_01<boost::mt19937&> zeroone(rng);
使用OpenMP在for-loop中调用

zeroone()函数,我希望并行。

 for ( int index = 0 ; index < 4096 ; index++ ) {
     if ( node[ index ] == false ) {
        if ( zeroone() < 0.03 )
           node[ index ] = true;
      }
 }

是否可以使用OpenMP并行for-loop并且不损坏统一分布伪随机数生成器?

e.g。是否有可能为第一个核心定义一个种子,第二个核心是第一个核心伪随机数发生器在6次后达到的相应种子?

此致

2 个答案:

答案 0 :(得分:2)

你可以做你的建议,但

  1. 这将是疯狂的...效率低下(因为RNG的目的是生成难以预测的伪随机序列,唯一的方法是...... 预测 n th 继任者也将产生介入的那些。)
  2. 很可能是不必要的:
  3. 您可以为每个线程提供自己的私有RNG(独立种子)。除非您的数据集非常小,否则均匀分布属性仍将保持不变(在这种情况下,无论线程如何,均匀性都会被样本噪声淹没)

    我的计划看起来像这样:

    typedef boost::.... rng_t;
    static rng_t g_rng; // notice how you never seed this, is this on purpose?
    
    #per thread
    {
         rng_t rng(g_rng()); // need synchronized access to g_rng here
         boost::uniform_01<boost::mt19937&> zeroone(rng);
    
         // ...
    }
    

答案 1 :(得分:0)

我的C ++随机数库RandomLib的文档包含 在OpenMP中使用并行数字流的说明;看到 http://randomlib.sourceforge.net/html/parallel.html。你可能是 能够使那里提出的想法适应您的应用。