Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top