【问题标题】:How to generate pseudo random in cuda如何在cuda中生成伪随机
【发布时间】:2010-02-04 19:27:05
【问题描述】:

我正在尝试构建一个粒子系统,利用 CUDA 来完成繁重的工作。我想随机化一些粒子的初始值,比如速度和寿命。随机数不必是超级随机的,因为它只是为了视觉效果。我发现这篇文章涉及相同的主题:

Random Number Generation in CUDA

这表明线性同余是要走的路。看起来它应该很容易实现,但是我在实现任何有用的东西时遇到了麻烦。谁能提供一些可以在设备中运行的代码?

我在 Windows 7 64 位上使用 CUDA 和 VC++。

【问题讨论】:

  • 到底是什么问题?线性同余生成器代码是 Q = (Q*a)+b,Q 是所讨论的随机数。常量 a 和 b 因实现而异 - 您可以在 en.wikipedia.org/wiki/Linear_congruential_generator 找到一些流行的组合
  • 询问来源被认为是公然冒犯。一个更好的技巧是发布一些你自己振作起来的东西(即使是最基本的,如果你愿意的话)以引起人们的兴趣!并且,请始终解释您在实施时遇到困难的原因、位置和部分。
  • Dirkgently:为什么要求代码(尤其是可能达到十几行的代码更少)公然冒犯?
  • Mingos:问题是我需要在设备中生成随机数,但我不知道如何生成它们。线性同余是要走的路吗?有更好的吗?如果线性同余是方式,那么在CUDA中是如何实现的?
  • 哦,所以要求是在GPU中计算?好吧,我的坏。 LCG 是最快但质量低的随机数。如果可能的话,我会使用另一种快速算法,但具有更高的周期和随机数质量,例如带进位的互补乘法、广义反馈移位寄存器或 Mersenne Twister。不过,我不知道 CUDA 的任何实现,抱歉...

标签: c++ random cuda gpgpu


【解决方案1】:

CUDA 伪随机数生成器是

  1. 包含在 NVidia SDK 中,例如 C/src/MersenneTwister/C/src/quasirandomGenerator

  2. 可作为单独的论文和来源获得:

    2.a Langdon's paperLangdon's source code

    2.b Mersenne Twister on GPU

【讨论】:

    【解决方案2】:

    根据您的要求,有许多开源选项。还有几个商业选项,例如NAG,他们已经实施了l'Ecuyer的MRG32k3a。如果您需要确保您的流不相关,请谨慎使用 LCG - 您可以使用跳跃/拆分,但您需要很长时间!

    如果您想开源,那么您绝对应该考虑使用thrust,因为它很简单。 NVIDIA SDK 中还有一些 RNG,包括 Mersenne Twister PRNG 示例(论坛上有 MT607、MT19937)以及 Sobol 和 Niederreiter QRNG。

    最后,CUDPP 也有一个随机数生成器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 2016-12-24
      • 2022-06-19
      • 2023-01-03
      • 2015-08-07
      • 2012-02-12
      • 1970-01-01
      • 2013-02-21
      相关资源
      最近更新 更多