Генерация случайных чисел с помощью OpenACC - PullRequest
1 голос
/ 09 марта 2019

Существует ли переносимый способ генерирования случайных чисел с помощью OpenACC?Я знаю, что можно напрямую использовать cuRand, но я ограничен только графическими процессорами Nvidia.Другой вариант, по-видимому, заключается в создании чисел на хосте и последующем их перемещении на устройство, но это не кажется лучшим решением с точки зрения производительности.

Есть ли лучший способ?

1 Ответ

1 голос
/ 11 марта 2019

Параллельное использование генератора случайных чисел - сложная операция.ГСЧ несут переменную состояния, которая должна быть закрытой для каждого параллельного потока.Использование системного «ранда» проблематично, поскольку в нем используется глобальная переменная состояния, которая задает неопределенное поведение (состояние гонки) при использовании в параллельном контексте.Вместо этого следует использовать более параллельные RNG, такие как "rand_r" и PRNG Boost.

Вторая проблема заключается в том, что RNG не всегда переносимы.Различные платформы могут реализовывать «ранд» разными способами.Как вы определили, на устройствах NVIDIA нет «случайного» вызова, и вместо этого вам нужно использовать вызовы cuRAND.

OpenACC разработан, чтобы помочь использовать параллелизм в вашем коде без учета платформы.Следовательно, специфичные для платформы операции, такие как параллельный ГСЧ, трудно определить в самом стандарте.Возможно, что-то можно сделать, особенно для чего-то такого полезного, как PRNG, и я бы посоветовал вам обратиться в комитет стандартов OpenACC с просьбой о поддержке (feedback_at_openacc_dot_org).

Единственный действительно портативный способ сделать это сейчас - этонапишите свой собственный параллельный RNG и включите его как часть своего кода.Случайно, у меня нет написанного примера OpenACC, и я немного забит, поэтому не знаю, хватит ли у меня времени, но я приложу все усилия, чтобы собрать его вместе.

Я написал CUDAC-версия алгоритма Мерсенна Твистера как часть статьи, которую я написал около 8 лет назад, которая может оказаться полезной (хотя она предшествует OpenACC).Он использует PGI Accelerator Model в начале статьи и CUDA Fortran в середине, так что не стоит слишком беспокоиться о контенте, только об источнике MT.

https://www.pgroup.com/blogs/posts/tune-gpu-monte-carlo.htm

Исходный пакет: https://www.pgroup.com/lit/samples/pginsider/pgi_mc_example.tar.gz

...