在CUDA中在设备上生成统一的双随机数

时间:2013-06-23 22:33:31

标签: 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正在做,但我知道每个线程需要一个状态,对吗?

感谢您的帮助。

1 个答案:

答案 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中给出的示例(参考第二个示例)使用了该类型的状态生成和线程块层次结构。