CUDA - 使用CURAND Library for Dummies

时间:2012-07-30 20:00:20

标签: cuda gpu gpgpu prng

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

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

  1. 首先建议您重新考虑使用自己的RNG的决定,为什么不使用cuRAND?如果统计属性适合您的应用程序,那么您可以更好地使用cuRAND,因为它已经针对所有GPU的GPU进行了调整。它包括Marsaglia的XORWOW,l'Ecuyer的MRG32k3a,以及MTGP32 Mersenne Twister(以及准RNG的Sobol')。
  2. 您还可以查看Thrust,其中包含一些简单的RNG,例如,请参阅Monte Carlo sample
  3. 如果你真的需要创建自己的生成器,那么GPU Computing Gems中有一些有用的技术(翡翠版,第16章:随机数生成器的并行化技术)。
  4. 作为旁注,请记住,虽然简单的LCG快速且易于跳过,但它们通常具有fairly poor statistical properties,尤其是在使用大量绘图时。当你说你需要“Mersenne Twister”时,我认为你的意思是MT19937。引用的Gems书讨论了并行化MT19937,但原始开发人员创建了MTGP生成器(也在上面引用),因为MT19937实现跳过是相当复杂的。

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