我正在研究使用nvidia GPU进行蒙特卡罗模拟。但是,我想使用gsl随机数生成器以及并行随机数生成器,如SPRNG。有谁知道这是否可行?
更新
我使用GPU玩过RNG。目前还没有一个很好的解决方案。 SDK附带的Mersenne Twister并不适合(我的)Monte-Carlo模拟,因为生成种子需要相当长的时间。
NAG库更有前景。您可以批量生成RN,也可以在单个线程中生成RN。但是,目前仅支持少量分布 - Uniform,exponential和Normal。
答案 0 :(得分:5)
GPU需要大规模并行随机生成是一个难题。这是一个活跃的研究课题。你必须要小心,不仅要有一个好的顺序随机生成器(你在文献中找到),而是要保证它们独立。成对独立性不足以进行良好的蒙特卡罗模拟。 AFAIK没有好的公共域代码。
答案 1 :(得分:5)
GSL手册recommends the Mersenne Twister。
Mersenne Twister的作者有一个version for Nvidia GPUs。我考虑将此移植到R包gputools,但发现我需要过多的绘图(数百万,我认为)之前'生成GPU并使R可用'的组合比仅仅绘制更快R(仅使用CPU)。
这实际上是一种计算/通信权衡。
答案 2 :(得分:5)
我和我的同事preprint, to appear in the SC11 conference重新考虑了一种替代技术,用于生成非常适合GPU的随机数。这个想法是第n个随机数是:
x_n = f(n)
与传统方法相比
x_n = f(x_{n-1})
Source code可用,它实现了几个不同的生成器。提供2 ^ 64或更多的流,每个流的周期为2 ^ 128或更多。所有这些都通过了各种各样的测试(TestU01 Crush和BigCrush套件),包括流内和流间统计独立性。该库还包括允许您在GSL框架中使用我们的生成器的适配器。
答案 3 :(得分:2)
我刚刚发现NAG提供了一些RNG routines。这些图书馆免费供学者使用。
答案 4 :(得分:0)
使用CUDA SDK中提供的Mersenne Twister PRNG。
答案 5 :(得分:0)
这里我们在GPU上使用sobol序列。
答案 6 :(得分:-2)
您必须自己实施。