【问题标题】:how to generate Gaussian distributed random numbers in OpenCL?如何在 OpenCL 中生成高斯分布的随机数?
【发布时间】:2019-08-08 18:43:32
【问题描述】:

有没有其他方法可以得到高斯分布的随机数,或者今天有没有这方面的库?

我看到了关于Gaussian distributed random numbers in OpenCL的问题

我想在 OpenCL 中生成许多高斯分布的随机数,就像上面的 url 问题。

它可以通过两步来做到这一点:

http://cas.ee.ic.ac.uk/people/dt10/research/rngs-gpu-mwc64x.html#source_code 它可能会生成许多随机均匀数,而不是高斯分布的随机数。

然后我可以使用https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform 将均匀随机变量转换为正态分布变量。

这可能很耗时,所以有没有其他方法可以得到高斯分布的随机数(最好使用内核生成一个数组随机数,如 cuda 函数:curandGenerateNormal(....))或者有没有今天的图书馆?

【问题讨论】:

  • @Someprogrammerdude,对不起,我下次会做得更好。
  • @Someprogrammerdude 我认为这个问题是有效的,如果你不这么认为,也许你可以提出改进它的方法。 (不过我会删除 c 和 c++ 标记,它们不太合适。)
  • 明确要求库或其他外部资源是题外话。这不是免费的编码服务,我们很乐意为现有代码提供帮助,但我们不是来从头开始编写代码的。
  • @Someprogrammerdude,对不起,有些算法可能用简单的语言表达不清楚。我的意思是在其他现有程序中是否还有其他一些高斯分布随机函数(如github.com/ddemidov/vexcl),所以我可以分析它的算法以改进正态分布函数。我认为这个问题可以帮助一些人知道如何提高效率用于在opencl中生成高斯分布的随机数。

标签: gpu opencl gpgpu


【解决方案1】:

首先,我认为没有人可以给您一个明确的答案,我们只能为您提供不同的选项,您需要自己针对您的特定用例运行性能测量,以找到最适合您的特定要求的解决方案。

一些建议:

  • Box-Muller 变换无疑是生成高斯分布值的一种不错的方法,但需要sincos、对数和平方根计算。您可以通过切换到Marsaglia polar method 来消除对正弦和余弦的需求。这确实需要您生成大量均匀分布的值。不过,根据您的 RNG 在 GPU 上的执行情况,这可能仍然对您有利。
  • 小心线性同余 RNG (LCG),它们表现出的模式有时会与 Box-Muller 等变换算法产生不良交互。您链接的是 MWC 生成器,它是一种与线性同余相关的技术,因此可能存在类似问题。我可能会尝试探索其他生成器。我还没有机会亲自尝试,但有一个Mersenne Twister variant for GPUs,我认为它适用于许多应用程序。 Mersenne Twister 的一个优点是它主要使用按位操作指令,与整数乘法和除法不同,这在 GPU 上往往非常快。

那里肯定有很多库,但我要指出,为了获得最佳性能,您可能希望保持随机数生成代码与使用示例的代码在同一个 OpenCL 工作项中运行。写入内存缓冲区会对内存带宽造成压力,但如果您的后续处理代码受 ALU/FPU 限制,这可能无关紧要。

与任何随机数生成一样,测试是关键 - 至少,绘制您的代码生成的样本的直方图,并将其与您尝试获得的理论分布函数叠加并目视检查以确保它看起来很合理。

【讨论】:

  • 非常感谢!现在,我正在尝试绘制一个直方图,用于分析 Box-Mulle 和 MWC 组合的结果。
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 2011-06-12
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2012-03-14
相关资源
最近更新 更多