0

私はCUDA言語にかなり慣れていないので、粒子の位置にランダムな値を追加することによって、各タイムステップで更新される粒子のシミュレーションを実行する必要があります(互いに異なりますが、同じ分布に従います)。

私の考えは、すべてのパーティクルに異なるcurandState(異なるシードを使用)を与え、各タイムステップで単純にcurand(curandState [particle_id])を実行することです。

ランダムな状態とパーティクルIDをGPUの定数メモリに保存できると考えていました。しかし、私は誰もそれをどこでもしているのを見たことがありません、それは記憶の問題を引き起こしますか?これでプログラムをスピードアップできますか?

ご協力ありがとうございました :)

4

1 に答える 1

4

それは意味がないと思います。 __constant__メモリは一定であり、GPUで実行されているスレッドによって直接変更することはできません。ただし、curandStateは、スレッドによって乱数が生成されるたびに変更する必要があります(そうしないと、同じ番号が何度も生成されます)。

すべてのパーティクルに独自の状態を与えることに何の問題もありません。これがこのシナリオの一般的な使用法です。

curandStateの取得と使用、および乱数の生成はGPU上のNVIDIAライブラリによって行われているため、NVIDIAエンジニアは、効率的で合体するようにメモリアクセスを最適化するというかなり良い仕事をしたと見なすことができます。状態を取得および更新し、乱数を生成する操作。

__constant__メモリには、クロックごとにSMごとに1つの32ビット値のみを処理するという特性もあります。したがって、すべてのスレッドが同じデータ要素にアクセスしている場合(つまりブロードキャスト)は便利ですが、各スレッドが異なる要素にアクセスしている場合(たとえば、個別のcurandState)は一般的には役立ちません。 )そのアクセスが通常合体する場合でも、たとえば、通常のグローバルメモリ内にある場合。

于 2013-03-26T16:06:20.970 に答える