我想在设备上生成统一的随机数,以便在设备功能中使用。每个线程应该生成一个不同的统一随机数。我有这个代码,但是我遇到了分段错误。
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正在做,但我知道每个线程需要一个状态,对吗?
感谢您的帮助。
答案 0 :(得分:2)
我认为你在这一行上遇到了seg错误:
curandMakeMTGP32KernelState(devMTGPStates, mtgp32dc_params_fast_11213, devKernelParams,NUM_BLOCKS*NUM_THREADS, 1234);
我认为出现seg错误的原因是因为n
参数已超过200,您要传递NUM_BLOCKS*NUM_THREADS
。我尝试了你的代码版本,我能够在n = 540左右重现seg故障。
使用预生成的内核参数(mtgp32dc_params_fast_11213
)时,MT生成器对其可以设置的状态数量有限制。您可能希望阅读documentation的相关部分。 (使用MTGP32生成器生成位)
我不是真正的CURAND专家,但其他生成器(如XORWOW)没有这种限制,所以如果你想轻松生成大量的独立线程状态,请考虑其中一个发电机。使用您概述的特定方法,MTGP32生成器似乎仅限于大约200 * 256个独立线程生成。与我在评论中所说的相反(对于其他生成器类型也是如此),MTGP32状态在一个状态下似乎足以容纳多达256个线程的块。并且documentation中给出的示例(参考第二个示例)使用了该类型的状态生成和线程块层次结构。