Генератор случайных чисел L'Ecuyer с Бейс-Дарем - PullRequest
0 голосов
/ 21 июня 2019

Я работаю с симуляциями Монте-Карло, чтобы найти десятичные знаки ПИ.Пока все хорошо, но пришел OpenMP, и я понимаю, что run2, возможно, лучшая RGN, не является поточно-ориентированной!Реализация здесь .Поскольку я не работал с OpenMP и не слишком много работал с многопоточностью, я застрял в том, чтобы сделать этот поток безопасным с помощью OpenMP.

До сих пор я знаю, что функция уже поточно-безопасна, если она не 'не изменяет нелокальную память, и она не вызывает функцию, которая это делает.В этом случае есть 3 переменные, которые являются статическими и, таким образом, будут изменены, если их будут использовать разные потоки.

Одним из возможных решений является вызов этого потока безопасным способом, заключив вызов ran2 в критическийраздел, но это не имеет смысла, так как я не получаю ускорение.

Может кто-нибудь дать мне указание о том, как поступить с этим, или если у кого-то есть ссылки, которые тоже будут великолепны!

1 Ответ

3 голосов
/ 21 июня 2019

Что обычно делается для обеспечения безопасности потока процедуры, так это связать ранее статические данные с локальными данными потока. Посмотрите, например, на справочную страницу rand_r (), которая является потокобезопасной версией rand ().

Итак, в вашей версии L'Ecuyer:

  1. определяет структуру (скажем, состояние), которая содержит статические данные

  2. переопределить процедуру ran2 (), чтобы получить дополнительный параметр, который является указателем на это структурное состояние, и соответствующим образом изменить код. Пусть ran2_r () будет новым именем.

  3. определить в каждом потоке локальное состояние структуры для хранения состояния

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

Теперь вам просто нужно вызвать ваш новый ran2_r () с указателем на это состояние. Он будет изменен процедурой, но изменения будут сохранены в локальном состоянии потока var.

...