私はこのlib Random123と関連する引用を見てきました:
1 人の謎の男が私のブースに来て、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に基づいていますか? 毎回新しい乱数を生成するにはどうすればよいですか。カーネルのパラメーターとしてシードを提供し、それを何らかの方法で使用することは可能ですか?
このライブラリを使用していて、その使用についてさらに洞察を得ることができる人はいますか?