设备功能内的高性能CUDA均匀浮点随机数发生器

时间:2017-10-29 07:54:57

标签: algorithm performance optimization cuda gpu

我需要一个高性能的随机数生成器,用于粒子传输的蒙特卡罗计算。要求是:

  1. 由每个帖子独立生成

  2. 发电机的周期应大于2 ^ 40

  3. 我尝试过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发生器好几倍?功能形式仅限于上述样本。非常感谢!

0 个答案:

没有答案