Использование ускоренного генератора случайных чисел с OpenMP - PullRequest
2 голосов
/ 04 августа 2010

Я бы хотел распараллелить мой код генератора случайных чисел в C ++ с OpenMP.Я хотел бы сделать это так, чтобы это было эффективно и безопасно для потоков.Может кто-нибудь подсказать мне, как это делается?В настоящее время я прилагаю то, что у меня есть ниже;это явно не безопасно для потоков, так как статическая переменная в функции sampleNormal, скорее всего, даст условие гонки.Количество образцов (nsamples) намного больше, чем n.

#pragma omp parallel for private(i,j) 
for (i = 0; i < nsamples; i++) {
   for (j = 0; j < n; j++) {
      randomMatrix[i + nsamples*j] = SampleNormal(0.0, 1.0);
   }
}

double SampleNormal (double mean, double sigma)
{
  // Create a Mersenne twister random number generator
  static mt19937 rng(static_cast<unsigned> (std::time(0)));
  // select Gaussian probability distribution
  normal_distribution<double> norm_dist(mean, sigma);
  // bind random number generator to distribution
  variate_generator<mt19937&, normal_distribution<double> >  normal_sampler(rng, norm_dist);
  // sample from the distribution
  return normal_sampler();
}

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Вам просто нужно что-то поточно-ориентированное или хорошо масштабируемое? Если вам не нужна очень высокая производительность в вашем PRNG, вы можете просто обернуть блокировку вокруг использования объекта rng. Для более высокой производительности вам нужно найти или написать параллельный генератор псевдослучайных чисел - http://www.cs.berkeley.edu/~mhoemmen/cs194/Tutorials/prng.pdf имеет учебник по ним. Один из вариантов - поместить ваши mt19937 объекты в локальное хранилище потоков, убедившись в том, что разные потоки будут заполняться разными семенами; это затрудняет воспроизведение одних и тех же результатов в разных сериях, если это важно для вас.

0 голосов
/ 10 августа 2013

"найти или написать параллельный генератор псевдослучайных чисел", используйте TRNG "Генератор случайных чисел TINAS". Это параллельная библиотека генератора случайных чисел, предназначенная для работы на многоядерных кластерах. Гораздо лучше, чем Boost. Здесь есть введение http://www.lindonslog.com/programming/parallel-random-number-generation-trng/

...