Как random_number () работает параллельно? - PullRequest
0 голосов
/ 05 февраля 2020

Как random_number() работает параллельно с OpenMP?

Если я запускаю свою программу без распараллеливания, я всегда получаю один и тот же результат, но при распараллеливании я каждый раз получаю разные (но похожие) результаты.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

Нет гарантии безопасности нитей или производительности резьбы для random_number в целом. Стандарт Fortran вообще не знает OpenMP.

Отдельные компиляторы могут предложить вам некоторые гарантии, но они будут действительны только для версии, представленной в конкретном компиляторе. Например, текущая версия gfortran предоставляет поточно-ориентированный генератор случайных чисел и «Обратите внимание, что в многопоточной программе (например, с использованием директив OpenMP) каждый поток будет иметь свое собственное состояние случайных чисел». Other Компиляторы могут отличаться. В частности, компилятор, который ваш пользователь может захотеть использовать, может отличаться, и вы можете не знать об этом.

Доступны выделенные параллельные генераторы случайных чисел. Например, я использую модифицированную версию библиотеки, которая использует метод Ziggurat для нескольких распределений случайных чисел, была распараллелена Gib Bogle, и я добавил реализацию xoroshiro128 + в качестве основного алгоритма, похожего на тот, который использовался от Gfortran. Доступны и другие реализации подобных алгоритмов, и в стандартном C ++ есть несколько новых генераторов, которые фактически определены для использования специфицированного c алгоритма, так что вы можете их вызывать.

0 голосов
/ 06 февраля 2020

Если ваша цель - получить воспроизводимые случайные числа, взгляните на этот ответ: { ссылка }

Это в C, но дает вам эффективный способ получить воспроизводимые результаты для любого числа потоков, которые можно легко преобразовать в Fortan.

...