Потокобезопасность наддува RNG - PullRequest
4 голосов
/ 27 мая 2010

У меня есть цикл, который должен быть приятно распараллелен с помощью вставки одной прагмы 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 является поточно-ориентированным, это может быть не так для других платформ.

Ответы [ 2 ]

6 голосов
/ 27 мая 2010

Просмотр архивов списка рассылки Boost дает:

Boost.Random не поддерживает глобальные заявить, что потребуется защита от многопоточность.

Boost.Random является потокобезопасным, пока у вас нет доступа к какому-либо объекту из две темы одновременно. (Доступ к два разных объекта в порядке, пока поскольку они не разделяют двигатель). если ты требуют такой безопасности, это тривиально свернуть это самостоятельно с соответствующая обертка мьютекса.

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

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

...