3

私は CURAND Library API を読んでいましたが、私は CUDA の初心者であり、誰かが実際に CURAND ライブラリを使用して乱数を生成する簡単なコードを表示できるかどうかを確認したかったのです。Discrete Event Simulation で使用する大量の数値を生成することを検討しています。私の仕事は、乱数生成を高速化するために GPGPU を使用するアルゴリズムを開発することです。標準の C 言語プログラミングで、LCG、乗法、およびフィボナッチ メソッドを実装しました。ただし、これらのコードを CUDA に「移植」し、スレッドとブロックを利用して乱数を生成するプロセスを高速化したいと考えています。

リンク 1: http://adnanboz.wordpress.com/tag/nvidia-curand/

その人は、私が必要とする 2 つのメソッド (LCG と Mersenne Twister) を持っていますが、コードには詳細が記載されていません。誰かがこれらの初期実装を拡張して、それらを適切に使用する方法について正しい方向に実際に向けることができるかどうか疑問に思っていました.

ありがとう!

4

1 に答える 1

4

あなたの質問は誤解を招きます-あなたは「ダミーのためにcuRANDライブラリを使用する」と言いますが、実際にはcuRANDを使用したくありません。私が正しく理解していれば、cuRANDで利用可能な最適化されたRNGを使用するのではなく、実際には独自のRNGを最初から実装したいと考えています。

  1. 最初の推奨事項は、独自のRNGを使用するという決定を再検討することです。なぜ、cuRANDを使用しませんか?統計プロパティがアプリケーションに適している場合は、GPUのすべての世代に合わせて調整されていることを知っているので、cuRANDを使用する方がはるかに良いでしょう。これには、MarsagliaのXORWOW、l'EcuyerのMRG32k3a、およびMTGP32 Mersenne Twister(およびQuasi-RNGのSobol')が含まれます。
  2. また、いくつかの単純なRNGを持つThrustを見ることができます。たとえば、モンテカルロサンプルを参照してください。
  3. 本当に独自のジェネレーターを作成する必要がある場合は、GPUコンピューティングジェムにいくつかの便利なテクニックがあります(Emerald Edition、第16章:乱数ジェネレーターの並列化テクニック)。

補足として、単純なLCGは高速でスキップしやすいものですが、特に大量の描画を使用する場合は、通常、統計的特性がかなり劣ることを覚えておいてください。「メルセンヌツイスター」が必要だと言うときは、MT19937を意味すると思います。参照されているGemsの本では、MT19937の並列化について説明していますが、MT19937の実装はかなり複雑であるため、元の開発者はMTGPジェネレーター(上記も参照)を作成しました。

また、別の補足として、並列化を実現するために別のシードを使用することは通常は悪い考えであり、統計的には独立性が保証されていません。シーケンス間に相関関係がないことを確認するには、スキップアヘッドまたはリープフロッグを使用するか、他の手法(DCMTなど)を使用する必要があります。

于 2012-09-11T09:38:22.223 に答える