我想在設備上生成統一的隨機數,用於設備函數內部。每個線程應該生成一個不同的統一的隨機數。我有這個代碼,但我得到了分段錯誤。在CUDA設備上生成均勻的雙隨機數
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在做什麼,但是我知道每個線程都需要一個狀態,對吧?
謝謝你的幫助。
如果您發現這樣的問題,如果您爲您的讀者確定哪條線路會給您發生故障,這很方便。如果你不知道 - 請做那種微不足道的調試。此外,你應該[檢查你的cuda API調用](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime -api)和curand調用,並進行錯誤檢查。 Curand錯誤檢查包含在[documentation](http://docs.nvidia.com/cuda/curand/index.html#topic_1_2_3)中。是的,如果你想要每個線程獨立的隨機序列,你需要每個線程一個狀態。 –