CURAND 带有一组随机数生成器,但我没有找到它们每个的性能(和随机性)属性的任何比较;大多数情况下,我会对使用哪个生成器用于哪个应用程序以获得最大性能感兴趣。如果有人可以快速概述它们之间的差异或链接我一个这样做的资源,我会很高兴。
提前致谢。
这张图显示了不同 RNG 的性能。
对于随机性,它应该只与 RNG 类型/算法有关。所以你可以参考英特尔 MKL 文档。里面有详细信息和研究论文。CURAND 和 MKL 中的类型名称非常相似。
第一个区别是效率。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 是伪随机生成器,而两个 Sobol 都是准随机生成器。
*当使用种子调用 curand_init 时,它会打乱该种子,然后向前跳过 2^67 个数字(这有点贵,但有一些不错的属性)
资料来源: https ://developer.nvidia.com/cuRAND http://cs.brown.edu/courses/cs195v/lecture/week11.pdf