【发布时间】:2012-06-29 19:44:04
【问题描述】:
我一直在查看这个库 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 的吗?如何每次生成新的随机数。可以提供种子作为内核的参数,然后以某种方式使用它吗?
有谁一直在使用这个库,可以给我一些关于它的使用的更多见解吗?
【问题讨论】: