2012-07-30 150 views
2

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

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

那人有两个,我会需要(LCG和梅森难题),但代码不提供太多细节的方法。我想知道是否有人能够在这些初始实现上进行扩展,以便实际指出我如何正确使用它们的正确方向。

谢谢!

+0

在演示简单CURAND使用的SDK示例程序中,应该有蒙特卡罗估计PI。例如。在MonteCarloCURAND下估算PiP。你有机会看看吗? – njuffa 2012-07-30 22:04:31

+0

是的,我看着它。不过,我正在寻找一个随机数生成器的例子。我将编辑我的问题,发布我开发的代码,我遇到了麻烦。 – 2012-07-31 00:57:00

+0

@njuffa任何人都想分享/详细说明这一点? – 2012-08-01 18:05:57

回答

4

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

  1. 第一个建议是重新决定使用自己的RNG,为什么不使用cuRAND?如果统计属性适用于您的应用程序,那么使用cuRAND可以更好地了解它适用于所有代GPU。它包括Marsaglia的XORWOW,l'Ecuyer的MRG32k3a和MTGP32 Mersenne Twister(以及Sobol'准RNG)。
  2. 你也可以看看Thrust,它有一些简单的RNG,例如见Monte Carlo sample
  3. 如果您确实需要创建自己的生成器,那么在GPU Computing Gems(Emerald Edition,第16章:随机数生成器的并行化技术)中有一些有用的技巧。

作为一个方面说明,请记住,虽然简单的LCG快速且易于跳过,但它们通常具有fairly poor statistical properties,特别是在使用大量绘图时。当你说你需要“Mersenne Twister”时,我认为你的意思是MT19937。引用的Gems的书谈到了MT19937的并行化,但是最初的开发者创建了MTGP生成器(上面也提到过),因为MT19937实现跳过(skip-ahead)相当复杂。

另外作为另一方面的说明,只是使用不同的种子来实现并行化通常是一个坏主意,统计上你不能保证独立性。您需要先行跳跃或跳跃式跳跃,或者使用其他技术(例如DCMT)来确保序列之间没有关联。