发电机的CURAND属性

时间:2013-08-29 09:11:29

标签: cuda prng

CURAND带有一组随机数生成器,但我没有找到它们各自的性能(和随机性)属性的任何比较;大多数情况下,我会对哪个应用程序用于哪个应用程序以获得最大性能感兴趣。如果有人可以快速勾勒出他们之间的差异或者链接我这样做的资源,我会很高兴。

提前致谢。

2 个答案:

答案 0 :(得分:2)

此图显示了不同RNG的性能。

Speed of cuRAND RNGs

对于随机性,它应该只与RNG类型/算法有关。所以你可以参考英特尔MKL文档。其中有详细信息和研究论文。 CURAND和MKL中的类型名称非常相似。

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

答案 1 :(得分:2)

第一个区别是效率。 XORWOW是默认生成器,但并不总是最有效。例如,Philox可以更快地生成正常分布的浮点数。

cuRAND

另一个不同之处在于,在实践中,每次使用某些生成器调用时,您都可以生成多个浮点数。 例如,使用Philox您可以在每次调用时生成正常或均匀分布的4个浮点数,而使用XORWOW,您可以正常生成或均匀分布最多两个浮点数。

__device__ float4 
curand_normal4 (curandStatePhilox4_32_10_t *state)

下一个区别是伪随机序列的周期(之前PRNG的总状态空间) 你开始看到重复)。 Xorwow的周期约为2 ^ 190(同一种子在2 ^ 67之后建立状态)*。对于Philox,子序列和偏移一起定义具有周期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是伪随机生成器,而两个Sobols都是准无序生成器。

*当用种子调用curand_init时,它会扰乱该种子然后向前跳过2 ^ 67个数字(这有点贵,但有一些不错的属性)

来源: https://developer.nvidia.com/cuRAND http://cs.brown.edu/courses/cs195v/lecture/week11.pdf