我一直在看这个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的随机数?每次如何生成新的随机数。可以提供一个种子作为内核的参数,然后以某种方式使用它?
有人一直在使用此库,并且可以给我更多使用它的见解吗?
是。每次被调用时,示例代码都会生成相同的随机数序列。
要获得不同的随机数流,只需以不同的方式初始化值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
归档时间: |
|
查看次数: |
2606 次 |
最近记录: |