curandState в постоянной памяти (cuda random)

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

Моя идея состоит в том, чтобы дать каждой частице другое curandState (с другим начальным числом) и на каждом временном шаге просто делать curand(curandState[particle_id]).

Я думал, что смогу хранить случайные состояния и идентификаторы частиц в постоянной памяти графического процессора. Но я нигде не видел, чтобы кто-то так делал, вызовет ли это проблемы с памятью? Может ли это ускорить программу?

Спасибо за помощь :)


person HicHoc    schedule 26.03.2013    source источник


Ответы (1)


Я не думаю, что это имеет смысл. __constant__ память постоянна и не может быть изменена напрямую потоками, работающими на графическом процессоре. Однако curandState необходимо изменять каждый раз, когда поток генерирует случайное число (в противном случае вы будете получать одно и то же число снова и снова).

Нет ничего плохого в том, чтобы присвоить каждой частице собственное состояние; это было бы типичным использованием для этого сценария.

Поскольку извлечение и использование curandState и генерация случайных чисел выполняются библиотекой NVIDIA на графическом процессоре, можно предположить, что инженеры NVIDIA проделали достаточно хорошую работу по оптимизации доступа к памяти, чтобы он был эффективным и объединенным во время работы. операция получения и обновления состояния и генерации случайных чисел.

__constant__ памяти также характерно то, что она обслуживает только одно 32-битное значение для каждого SM за такт, поэтому она полезна, когда все потоки обращаются к одному и тому же элементу данных (т. curandState) даже если этот доступ обычно объединяется, например. если бы это было в обычной глобальной памяти.

person Robert Crovella    schedule 26.03.2013