Параллельное использование генератора случайных чисел - сложная операция.ГСЧ несут переменную состояния, которая должна быть закрытой для каждого параллельного потока.Использование системного «ранда» проблематично, поскольку в нем используется глобальная переменная состояния, которая задает неопределенное поведение (состояние гонки) при использовании в параллельном контексте.Вместо этого следует использовать более параллельные 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