1

我想在设备上生成统一的随机数,以在设备功能内部使用。每个线程应该生成一个不同的统一随机数。我有这段代码,但我遇到了分段错误。

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 在做什么,但我知道每个线程需要一个状态,对吧?

感谢您的帮助。

4

1 回答 1

2

我认为你在这条线上遇到了段错误:

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_11213MT 生成器在使用预先生成的内核参数 ( )时可以设置的状态数量有限制。您不妨阅读文档的相关部分。(使用 MTGP32 生成器生成位)

我不是真正的 CURAND 专家,但其他生成器(例如 XORWOW)没有这种类型的限制,因此如果您想轻松生成大量独立线程状态,请考虑使用其他生成器之一。使用您概述的特定方法,MTGP32 生成器似乎仅限于大约 200*256 独立线程生成。与我在评论中所说的相反(对于其他生成器类型也是如此),MTGP32 状态在一个状态下似乎足以容纳多达 256 个线程的块。文档中给出的示例(请参阅第二个示例)使用了这种类型的状态生成和线程块层次结构。

于 2013-06-24T04:33:58.473 回答