使用GPU随机数

我正在研究使用nvidia GPU进行蒙特卡罗模拟。 但是,我想使用gsl随机数生成器以及并行随机数生成器,如SPRNG。 有谁知道这是否可能?

更新

我使用GPU玩过RNG。 目前还没有一个很好的解决方案。 SDK附带的Mersenne Twister并不适合(我的)Monte-Carlo模拟,因为生成种子需要相当长的时间。

NAG库更有前途。 您可以批量生成RN,也可以在单个线程中生成RN。 但是,目前仅支持少数分布 – Uniform,exponential和Normal。

GSL手册推荐Mersenne Twister 。

Mersenne Twister的作者有一个Nvidia GPU的版本 。 我考虑将这个移植到R包gputools,但发现我需要过多的绘制(数百万,我认为)之前’生成GPU并使R可用’的组合比仅仅绘制R更快(仅使用R) CPU)。

它实际上是一种计算/通信权衡。

GPU所需的大规模并行随机生成是一个难题。 这是一个活跃的研究课题。 你必须要小心,不仅要有一个好的顺序随机生成器(这些你在文献中找到),但保证它们是独立的 。 成对独立性不足以进行良好的蒙特卡罗模拟。 AFAIK没有好的公共域代码。

我的同事和我有一个预印本,出现在SC11会议上 ,重新审视了一种替代技术,用于生成非常适合GPU的随机数。 这个想法是第n个随机数是:

x_n = f(n) 

与传统方法相比

 x_n = f(x_{n-1}) 

源代码可用,它实现了几个不同的生成器。 提供2 ^ 64或更多的流,每个流的周期为2 ^ 128或更多。 所有这些都通过了各种各样的测试(TestU01 Crush和BigCrush套件),包括流内和流间统计独立性。 该库还包括允许您在GSL框架中使用我们的生成器的适配器。

我刚刚发现NAG提供了一些RNG 例程 。 这些图书馆免费供学者使用。

使用CUDA SDK中提供的Mersenne Twister PRNG。

这里我们在GPU上使用sobol序列。

你必须自己实现它们。