параллельное равномерное распределение псевдослучайных чисел с использованием OpenMP - PullRequest
0 голосов
/ 27 июня 2011

Я использую в моей программе равномерное распределение буста между 0 и 1:

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

 static boost::mt19937 rng;
 static boost::uniform_01<boost::mt19937&> zeroone(rng);

zeroone() функция вызывается внутри цикла for, который я хотел бы провести параллельно, используя OpenMP.

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

Вопрос, возможно ли использовать OpenMP для параллели for-loop и не повредить генератор псевдослучайных чисел с равномерным распределением?

например. Можно ли определить для первого ядра начальное число, а для второго - соответствующее начальное число, которого генератор псевдослучайных чисел первого ядра достигнет через 6 раз?

Привет

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Вы можете делать то, что вы предлагаете, но

  1. это было бы безумно ... неэффективно (поскольку цель ГСЧ - генерировать трудно предсказуемые псевдослучайные последовательности, единственный способ .... предсказать n th преемник будет также генерировать промежуточные.)
  2. скорее всего ненужный:

Вы можете назначить каждому потоку собственный частный ГСЧ (начните каждый независимо). Свойство равномерного распределения будет по-прежнему сохраняться, если только ваш набор данных не будет очень маленьким (в этом случае однородность будет в любом случае подавлена ​​шумом выборки независимо от потоков)

Моя схема будет выглядеть примерно так:

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);

     // ...
}
0 голосов
/ 10 июля 2011

Документация для моей библиотеки случайных чисел C ++, RandomLib, содержит иллюстрация использования параллельных числовых потоков в OpenMP; увидеть http://randomlib.sourceforge.net/html/parallel.html. Возможно, вы возможность адаптировать идеи, представленные там, к вашему приложению.

...