我一直在查看这个 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;
}
我现在的问题是,这不会在每次运行时生成相同的随机数吗,随机数是基于全局 id 的吗?如何每次生成新的随机数。可以提供种子作为内核的参数然后以某种方式使用它吗?
任何一直在使用这个库并且可以让我对它的使用有更多了解的人吗?