CUDA - 使用 CURAND 傻瓜库

Wil*_*ado 3 cuda gpu gpgpu prng

我正在阅读 CURAND 库 API,我是 CUDA 的新手,我想看看是否有人能真正向我展示一个使用 CURAND 库生成随机数的简单代码。我正在考虑生成大量数字以用于离散事件模拟。我的任务只是开发算法以使用 GPGPU 来加速随机数生成。我已经在标准 C 语言编程中实现了 LCG、乘法和斐波那契方法。然而,我想将这些代码“移植”到 CUDA 中,并利用线程和块来加速生成随机数的过程。

链接1: http: //adnanboz.wordpress.com/tag/nvidia-curand/

那个人有我需要的两种方法(LCG 和 Mersenne Twister),但代码没有提供太多细节。我想知道是否有人可以扩展这些最初的实现,以实际为我指明如何正确使用它们的正确方向。

谢谢!

Tom*_*Tom 5

您的问题具有误导性 - 您说“使用 cuRAND 傻瓜库”,但您实际上并不想使用 cuRAND。如果我理解正确的话,您实际上想从头开始实现自己的RNG,而不是使用 cuRAND 中提供的优化 RNG。

  1. 第一个建议是重新考虑使用自己的 RNG 的决定,为什么不使用 cuRAND?如果统计属性适合您的应用程序,那么您最好使用 cuRAND,因为您知道它已针对所有代 GPU 进行了调整。它包括 Marsaglia 的 XORWOW、l'Ecuyer 的 MRG32k3a 和MTGP32 Mersenne Twister(以及准 RNG 的 Sobol')。
  2. 您还可以查看Thrust,它有一些简单的 RNG,例如,请参阅Monte Carlo 示例
  3. 如果您确实需要创建自己的生成器,那么GPU 计算宝石(翡翠版,第 16 章:随机数生成器的并行化技术)中提供了一些有用的技术。

附带说明一下,请记住,虽然简单的 LCG 速度快且易于跳过,但它们通常具有相当差的统计特性,尤其是在使用大量抽奖时。当您说您需要“Mersenne Twister”时,我假设您指的是 MT19937。引用的 Gems 书籍讨论了并行化 MT19937,但最初的开发人员创建了 MTGP 生成器(上面也提到了),因为 MT19937 实现跳过相当复杂。

另外,作为另一个旁注,仅使用不同的种子来实现并行化通常是一个坏主意,从统计角度来看,您无法保证独立性。您要么需要向前跳过或蛙跳,要么使用其他一些技术(例如DCMT)来确保序列之间不存在相关性。