3

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

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

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

谢谢!

4

1 回答 1

4

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

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

作为旁注,请记住,虽然简单的 LCG 快速且易于跳过,但它们通常具有相当差的统计特性,尤其是在使用大量平局时。当您说您将需要“Mersenne Twister”时,我假设您的意思是 MT19937。参考的 Gems 书中谈到了并行化 MT19937,但最初的开发人员创建了 MTGP 生成器(上面也提到过),因为 MT19937 实现跳过相当复杂。

另请注意,仅使用不同的种子来实现并行化通常是一个坏主意,从统计上讲,您不能保证独立性。您要么需要跳过或跳跃,要么使用其他一些技术(例如DCMT)来确保序列之间没有相关性。

于 2012-09-11T09:38:22.223 回答