カーネルから256 個のスレッドの 1 ブロックを生成して、256 個の CURAND 状態を持つ配列をセットアップします。Setup()
RNGstates
__global__ void Setup(curandState *RNGstates, long seed) {
int tid = threadIdx.x;
curand_init(seed, tid, 0, &RNGstates[tid]);
}
ここで、カーネルから256 スレッドの 1000 ブロックを生成して、配列を 256,000 の乱数で埋めます。ただし、各状態が 1000 スレッド (各ブロックから 1 つ) によってアクセスされるように、 の 256 状態のみを使用してそうします。Generate()
result
RNGstates
__global__ void Generate(curandState *RNGstates, float *result) {
int tid = blockIdx.x*blockDim.x + threadIdx.x;
float rnd = curand_uniform(&RNGstates[threadIdx.x]);
result[tid] = rnd;
}
呼び出すcurand_uniform()
と何らかの形で状態が更新されることはわかっているので、何らかの書き込み操作が行われていると思います。
では、256 の CURAND 状態のそれぞれにマップされた 1000 のスレッドが を介して暗黙的に状態を更新しようとするときに発生するデータ競合について心配する必要がありますcurand_uniform()
か? これは乱数の品質に影響を与えますか (例: 値が頻繁に重複する)?
どうもありがとう。