使用Random123和OpenCL的随机数

Pou*_*sen 3 random opencl

我一直在看这个lib Random123和相关的报价:

一位神秘男子来到我的展位,问我对使用OpenCL生成随机数的了解。我告诉他有关Mersenne Twister的实现,但他没有留下深刻的印象。他告诉我一篇新的技术论文,该论文解释了如何通过结合整数计数器和分组密码在GPU上生成随机数。他说,以计数调为基础,基于计数器的随机数生成器(CBRNG)产生的数字具有比MT更大的统计随机性,并且速度更快。

我能够使用此内核运行一个演示:

__kernel void counthits(unsigned n, __global uint2 *hitsp) {
    unsigned tid = get_global_id(0);
    unsigned hits = 0, tries = 0;
    threefry4x32_key_t k = {{tid, 0xdecafbad, 0xfacebead, 0x12345678}};
    threefry4x32_ctr_t c = {{0, 0xf00dcafe, 0xdeadbeef, 0xbeeff00d}};
    while (tries < n) {
        union {
            threefry4x32_ctr_t c;
            int4 i;
        } u;
        c.v[0]++;
        u.c = threefry4x32(c, k);
        long x1 = u.i.x, y1 = u.i.y;
        long x2 = u.i.z, y2 = u.i.w;
        if ((x1*x1 + y1*y1) < (1L<<62)) {
            hits++;
        }
        tries++;
        if ((x2*x2 + y2*y2) < (1L<<62)) {
            hits++;
        }
        tries++;
    }
    hitsp[tid].x = hits;
    hitsp[tid].y = tries;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,这会不会在每次运行时都生成相同的随机数,而是基于全局ID的随机数?每次如何生成新的随机数。可以提供一个种子作为内核的参数,然后以某种方式使用它?

有人一直在使用此库,并且可以给我更多使用它的见解吗?

jks*_*jks 5

是。每次被调用时,示例代码都会生成相同的随机数序列。

要获得不同的随机数流,只需以不同的方式初始化值k [1..3]和/或c [1..3]。您可以从命令行参数,环境变量,时间,保存状态,/ dev / urandom或任何其他来源初始化它们。请注意:

a)如果在两个不同的运行中以完全相同的方式初始化它们,那么这两个运行将获得相同的随机数流

b)如果您在两个不同的运行中对它们进行了不同的初始化,则这两个运行将获得不同的随机数流。

有时您需要财产a)。有时您需要属性b)。花一点时间考虑一下您想要哪个,并确保您正在按照自己的意愿进行。

更一般地,库中的函数(例如threefry4x32)没有state。如果更改输入中的任何位(即,c或k的任何元素中的任何位),您将获得完全不同的随机,统计独立,均匀分布的输出。

PS我是该库的作者之一,也是论文“并行编号:1、2、3一样简单”的作者之一:http : //dl.acm.org/citation.cfm?id=2063405

如果您不是ACM数字图书馆的订户,则上面的链接可能会收费。另外,您也可以通过以下页面上的链接免费获取纸张:

http://www.thesalmons.org/john/random123/index.html