【问题标题】:Using random numbers with GPUs在 GPU 上使用随机数
【发布时间】:2011-03-08 16:44:23
【问题描述】:

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

更新

我使用 GPU 玩过 RNG。目前没有很好的解决方案。 SDK 附带的 Mersenne Twister 并不适合(我的)蒙特卡洛模拟,因为生成种子需要非常长的时间。

NAG 库更有希望。您可以批量或在单个线程中生成 RN。但是,目前仅支持少数分布 - 均匀分布、指数分布和正态分布。

【问题讨论】:

  • 您可能无法从 GPU 调用任何类型的 RNG,但您可以预先生成随机数并将它们用作程序的输入。

标签: c cuda gpu gsl


【解决方案1】:

我和我的同事有一个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 框架中使用我们的生成器的适配器。

【讨论】:

    【解决方案2】:

    GSL 手册recommends the Mersenne Twister.

    Mersenne Twister 作者有一个version for Nvidia GPUs。我考虑将其移植到 R 包gputools,但发现在“生成 GPU 并提供给 R”的组合比仅在 R 中绘图更快之前,我需要大量的绘图(我认为是数百万)(仅使用 CPU)。

    这确实是计算/通信的权衡。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我刚刚发现 NAG 提供了一些 RNG routines。这些图书馆对学术人员免费。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              您必须自己实现它们。

              【讨论】:

              • 嗯...*总是*值得一提的是,这意味着自己设计一个。使用易于理解的高质量算法。真的。
              • 他说的是两种特殊算法,所以我认为很明显他会实现这两种特殊算法,而不是发明新的东西。
              • GSL 和 SPRNG 不是算法,它们是库。它们包含许多不同的生成器。
              猜你喜欢
              • 2018-03-20
              • 1970-01-01
              • 2022-11-04
              • 1970-01-01
              • 1970-01-01
              • 2013-06-13
              • 1970-01-01
              • 1970-01-01
              • 2019-12-02
              相关资源
              最近更新 更多