我想在设备上生成统一的随机数,用于设备函数内部。每个线程应该生成一个不同的统一的随机数。我有这个代码,但我得到了分段错误。在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)中。是的,如果你想要每个线程独立的随机序列,你需要每个线程一个状态。 –