OpenCL中的高斯分布随机数

时间:2014-02-11 13:38:06

标签: random opencl gaussian

我使用OpenCL在GPU上运行计算成本高昂的任务。此任务需要在每个工作人员中生成许多随机数。这些随机数中的一些应该在一定的时间间隔内统一生成,但是其他一些必须在(变化的)值周围高斯分布。

  1. 这是否有图书馆?
  2. 如果没有,实现这样的事情有什么简单方法?
  3. 到目前为止,我一直在python中创建随机数并将它们传递给OpenCL。然而,现在的瓶颈是那些随机数的转移(至少比实际计算慢一个数量级)。

3 个答案:

答案 0 :(得分:1)

来自VexCL套件的

providesRandom123基于计数器的随机数生成器(免责声明:我是该库的开发人员)。

同时检查Boost.computeViennaCL个库。

答案 1 :(得分:1)

Box-Muller transform是一种易于并行化的方法,用于将均匀随机变量转换为正态分布变量。我已将它与ddemidov提到的Random123库结合使用。

答案 2 :(得分:0)

Boost.Compute库提供normal_distribution类以及几个随机数生成器(mersenne_twister_enginelinear_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);