繁体   English   中英

OpenCL 中的随机生成器?

[英]Random Generator in OpenCL?

由于 OpenCL 中没有内置随机函数(我不知道,如果这不是真的请指正)。 生成一个放入内核的随机列表对我的工作目的不起作用。 它必须是在 GPU(内核)上运行的随机生成器。 我打算编写自己的函数来生成 0 到 1 范围内的随机数。下面的代码是我在 CPU 上运行的代码,它似乎运行良好。

array_of_random_numbers = [0.0] * N
seed = 19073486328125
multiplier = 19073486328125
adder = 0
random_number = 19073486328125
modulus = 2**48.0
RAND_MAX = 2**48.0

for i in range( 0 , (N-1) ):
    random_number = (multiplier * random_number + adder ) % (modulus)
    print(multiplier * random_number)
    array_of_random_numbers[i] = (random_number / RAND_MAX)

但是,我很难将代码迁移到内核,因为我无法在循环中设置 random_number 并让它随着迭代而改变。

kernel = """__kernel void get_new_rand(__global float* c)
{      
      random_number = (19073486328125 * 19073486328125 + 0) % (281474976710656);
      c[thread_id] = (random_number / 281474976710656.0);
}"""

有没有办法在内核上编写随机生成器?

先感谢您!

我打算编写自己的函数来生成 0 到 1 范围内的随机数。下面的代码是我在 CPU 上运行的代码,它似乎运行良好。 但是,我很难将代码迁移到内核,因为我无法在循环中设置 random_number 并让它随着迭代而改变。

最简单的方法是使用线性同余生成器函数(就像您已经拥有的那样),它接受一个种子值并输出一个伪随机数,该伪随机数可以归一化到 [0,1[. 剩下的问题是如何获得种子。

解决方法:可以在host端传入一个seed值作为全局参数,在host端每次调用kernel时改变seed值。 这不会对性能产生任何影响。 最后,要为不同的 GPU 线程获取不同的种子,请在调用 LCG 函数之前将全局 ID 添加到从主机传来的种子中。

这样你就不需要存储任何数字数组。 此外,您还可以完全控制主机端的种子值,并且一切都保持完全确定性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM