デバイス関数内で使用するために、デバイスで一様乱数を生成したいと思います。各スレッドは、異なる一様乱数を生成する必要があります。このコードがありますが、セグメンテーション違反が発生します。
int main{
curandStateMtgp32 *devMTGPStates;
mtgp32_kernel_params *devKernelParams;
cudaMalloc((void **)&devMTGPStates, NUM_THREADS*NUM_BLOCKS * sizeof(curandStateMtgp32));
cudaMalloc((void**)&devKernelParams,sizeof(mtgp32_kernel_params));
curandMakeMTGP32Constants(mtgp32dc_params_fast_11213, devKernelParams);
curandMakeMTGP32KernelState(devMTGPStates,
mtgp32dc_params_fast_11213, devKernelParams,NUM_BLOCKS*NUM_THREADS, 1234);
doHenry <<NUM_BLOCKS,NUM_THREADS>>> (devMTGPStates);
}
そして、デバイスで評価されるグローバル関数 doHenry 内に、次のように記述します。
double rand1 = curand_uniform_double(&state[threadIdx.x+NUM_THREADS*blockIdx.x]);
これは、スレッドごとに乱数を生成する最良の方法ですか? devKernelParams が何をしているのかわかりませんが、スレッドごとに 1 つの状態が必要なのはわかっていますよね?
ご協力ありがとうございました。