5

CUDAのランダムジェネレーターについて質問があります。Curandを使用して、次のコードで乱数を生成しています。

__device__ float priceValue(int threadid){

    unsigned int seed = threadid ;
    curandState s;
    curand_init (seed , 0, 0, &s);

    float randomWalk = 2;
    while (abs(randomWalk)> 1) {
        randomWalk = curand_normal(&s);
    }
    return randomWalk; 
}

私はこのコードを何度も再起動しようとしましたが、常に同じ出力があります。このコードの何が問題なのかわかりませんでした。スレッドは同じIDを提供しますが、curand_normal関数は起動するたびに変更する必要がありますよね?

4

1 に答える 1

3

ランダムな値を要求するたびに init を実行しています。curand_init()代わりに、コードの開始時に別のカーネルで 1 回実行する必要があります。次に、新しいランダム値が必要な場合は、 を呼び出すだけcurand_normal()です。その後、デバイス関数を呼び出すたびに値が変更されます。

例については、こちらの回答を参照してください。

スレッド ID の代わりに時間をシードとして使用したい場合は、または好きな時間関数で返された値を渡します。clock()

unsigned int seed = (unsigned int) clock64();
于 2013-03-08T16:09:18.467 に答える