CURAND带有一组随机数生成器,但我没有找到它们各自的性能(和随机性)属性的任何比较;大多数情况下,我会对哪个应用程序用于哪个应用程序以获得最大性能感兴趣。如果有人可以快速勾勒出他们之间的差异或者链接我这样做的资源,我会很高兴。
提前致谢。
答案 0 :(得分:2)
此图显示了不同RNG的性能。
对于随机性,它应该只与RNG类型/算法有关。所以你可以参考英特尔MKL文档。其中有详细信息和研究论文。 CURAND和MKL中的类型名称非常相似。
答案 1 :(得分:2)
第一个区别是效率。 XORWOW是默认生成器,但并不总是最有效。例如,Philox可以更快地生成正常分布的浮点数。
另一个不同之处在于,在实践中,每次使用某些生成器调用时,您都可以生成多个浮点数。 例如,使用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