CUDA-使用CURAND库制作傻瓜



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

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

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

谢谢!

你的问题是误导性的——你说"使用cuRAND库对付傻瓜",但实际上你并不想使用cuRAND。如果我理解正确,您实际上希望从头开始实现您自己的RNG,而不是使用cuRAND中可用的优化RNG。

  1. 第一个建议是重新考虑您使用自己的RNG的决定,为什么不使用cuRAND?如果统计属性适合您的应用程序,那么您最好使用cuRAND,因为它是为GPU的所有代进行调优的。它包括Marsaglia的XORWOW、l'Ecuyer的MRG32k3a和MTGP32 Mersenne Twister(以及用于准RNG的Sobol)
  2. 你也可以看看Thrust,它有一些简单的RNG,例如蒙特卡洛样本
  3. 如果你真的需要创建自己的生成器,那么GPU计算宝石中有一些有用的技术(翡翠版,第16章:随机数生成器的并行技术)

顺便说一句,请记住,虽然简单的LCG快速且易于跳过,但它们通常具有相当差的统计特性,尤其是在使用大量绘图时。当你说你需要"Mersenne Twister"时,我想你指的是MT19937。参考的Gems的书谈到了并行化MT19937,但最初的开发人员创建了MTGP生成器(也在上面参考),因为MT19937的实现相当复杂。

另一方面,仅仅使用不同的种子来实现并行化通常是个坏主意,从统计数据来看,你们不能保证独立性。你要么需要向前跳或蛙跳,要么使用其他技术(例如DCMT)来确保序列之间没有相关性。

最新更新