我需要一个高性能的随机数生成器,用于粒子传输的蒙特卡罗计算。要求是:
由每个帖子独立生成
发电机的周期应大于2 ^ 40
我尝试过Tausworthe generator(计算数学,65,213(1996),203-213),其周期为2 ^ 88。设备功能如下:
__device__ float GenerateRNF(unsigned int *seed, int seedNum=3)
{
unsigned int s1 = seed[0];
unsigned int s2 = seed[1];
unsigned int s3 = seed[2];
unsigned int b = (((s1 << 13)^s1) >> 19);
s1 = (((s1 & 0xFFFFFFFE) << 12)^b);
b = (((s2 << 2) ^ s2) >> 25);
s2 = (((s2 & 0xFFFFFFF8) << 4) ^ b);
b = (((s2 << 3) ^ s3) >> 11);
s3 = (((s3 & 0xFFFFFFF0) << 17) ^ b);
return ((s1 ^ s2 ^ s3) * 2.32830644e-10f);
}
来自种子的参数应该是寄存器号,并且该函数由一个线程调用数百次。 每个线程都拥有它自己的种子序列。如果块大小为64,线程数为1024,则在主机中初始化的初始种子数将为1024 * 64 * 3.
但是,上面的发电机仍然很慢。我尝试过park-miller算法,与Tausworthe发生器相比,速度提高了几倍(在GTX1070中使用CUDA双乘操作测试)
然而,它的周期远小于2 ^ 40。
我的问题是,是否有随机数发生器,其周期优于park-miller算法,但它的速度比Tausworthe发生器好几倍?功能形式仅限于上述样本。非常感谢!