线程唯一随机数需要多少个cuRand状态? (CUDA)

时间:2014-07-07 01:35:42

标签: random cuda state

每个线程中需要多少个cuRand状态才能获得唯一的随机数?从网站上发布的其他问题来看,有些人说每个线程需要一个,而其他人说每个块需要一个。

每个线程使用一个cuRand状态是否意味着更好的随机数? 每个线程使用1个cuRand状态会显着减慢CUDA应用程序(5000 +线程)吗?

同样,对于每个线程使用1个cuRand状态的实现,这个内核是否正确且高效?:

__global__ void myKernel (const double *seeds) // seeds is an array of length = #threads
int tid = ... // set tid = global thread ID
{
curandState s;
curand_init (seeds[tid],0,0,&s)

....

double r = cuRand_uniform(&s);

...

}

1 个答案:

答案 0 :(得分:1)

假设所有线程保持同步,那么您希望在所有线程中生成随机数,如同示例代码中所示。但是,根据我的理解,您不需要在每个线程中以不同方式播放cuRAND。我可能在那个问题上错了......

现在,他们在文档中使用术语“块”,如“在一个块中创建所有随机数”。它们并不意味着一个线程块将完成工作,而是意味着一个内存块将保存所有在一次调用中生成的随机数。所以如果你需要在你的循环中需要4096个随机数,你应该在开始时一次创建它们,然后再将它们从内存加载回来......你必须测试它是否能让你的内容更快无论如何。通常,许多内存访问会减慢速度,但是多次调用生成器并不是不太可能,因为它确实需要重新加载一组重要的值来计算下一个伪随机数。

来源:
http://docs.nvidia.com/cuda/curand/host-api-overview.html#performance-notes2