我使用OpenCL在GPU上运行计算成本高昂的任务。此任务需要在每个工作人员中生成许多随机数。这些随机数中的一些应该在一定的时间间隔内统一生成,但是其他一些必须在(变化的)值周围高斯分布。
到目前为止,我一直在python中创建随机数并将它们传递给OpenCL。然而,现在的瓶颈是那些随机数的转移(至少比实际计算慢一个数量级)。
答案 0 :(得分:1)
答案 1 :(得分:1)
Box-Muller transform是一种易于并行化的方法,用于将均匀随机变量转换为正态分布变量。我已将它与ddemidov提到的Random123库结合使用。
答案 2 :(得分:0)
Boost.Compute库提供normal_distribution
类以及几个随机数生成器(mersenne_twister_engine
和linear_congruential_engine
)。这些可以一起用于在设备上产生正常(也称为高斯)分布式随机值。
例如,要生成以float
为中心的随机5.0
值:
// create a vector of floats on the device
boost::compute::vector<float> vec(1000, context);
// initialize the default random engine
boost::compute::default_random_engine engine(queue);
// setup the normal distribution to produce floats centered at 5
boost::compute::normal_distribution<float> distribution(5.0f, 1.0f);
// generate the random values and store them to 'vec'
distribution.generate(vec.begin(), vec.end(), engine, queue);