CURAND свойства генераторов

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

Заранее спасибо.

2 ответа

Решение

Эта картина показывает производительность для разных ГСЧ.

Скорость КРЕНД РНГ

Для случайности это должно быть связано только с типом / алгоритмом ГСЧ. Так что вы можете обратиться к Intel MKL doc. Там есть подробная информация и исследовательские работы. Имена типов в CURAND и MKL очень похожи.

http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-3D7D2650-A414-4C95-AF33-BE291BAB2AC3.htm

Первое отличие - это эффективность. XORWOW - генератор по умолчанию, но не всегда самый эффективный. Например, Philox быстрее генерирует нормально распределенные поплавки.

cuRAND

Другое отличие состоит в том, что на практике вы можете генерировать более одного числа с каждым вызовом с помощью некоторых генераторов. Например, с Philox Вы можете генерировать даже 4 поплавка, нормально или равномерно распределенных с каждым вызовом, в то время как с XORWOW вы можете сгенерировать максимум два поплавка с нормальным или равномерным распределением.

__device__ float4 
curand_normal4 (curandStatePhilox4_32_10_t *state)

Следующим отличием является период псевдослучайной последовательности (общее пространство состояний PRNG до того, как вы начнете видеть повторы). Xorwow имеет период около 2^190 (с состоянием, установленным после 2^67 для того же семени)*. Для Филокса подпоследовательность и смещение вместе определяют смещение в последовательности с периодом 2^128. Обратите внимание: если вы запускаете миллионы потоков с одним и тем же начальным числом, вы можете исчерпать пространство состояний для каждого потока и начать видеть повторы. ((2^190) / (10^6)) / (2^67) = 1,0633824 × 10^31

Еще одно отличие - размер штатов. Для Xorwow sizeof(curandState_t) составляет 48 байт, а sizeof(curandStatePhilox4_32_10_t) составляет 64 байта. Когда вы запускаете миллионы потоков (каждый поток имеет свое собственное состояние Curand), вы можете исчерпать память устройства. 1024^2*64 ~= 64 мегабайта на миллион потоков.

XORWOW, Philox, MRR32k3a, MTGP32 являются псевдослучайными генераторами, в то время как оба соболя являются генераторами квази-ранома.

* При вызове curand_init с семенем, он шифрует это семя, а затем пропускает 2^67 чисел (это довольно дорого, но имеет некоторые хорошие свойства)

источники: https://developer.nvidia.com/cuRAND http://cs.brown.edu/courses/cs195v/lecture/week11.pdf

Другие вопросы по тегам