每个线程中需要多少个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);
...
}
答案 0 :(得分:1)
假设所有线程保持同步,那么您希望在所有线程中生成随机数,如同示例代码中所示。但是,根据我的理解,您不需要在每个线程中以不同方式播放cuRAND。我可能在那个问题上错了......
现在,他们在文档中使用术语“块”,如“在一个块中创建所有随机数”。它们并不意味着一个线程块将完成工作,而是意味着一个内存块将保存所有在一次调用中生成的随机数。所以如果你需要在你的循环中需要4096个随机数,你应该在开始时一次创建它们,然后再将它们从内存加载回来......你必须测试它是否能让你的内容更快无论如何。通常,许多内存访问会减慢速度,但是多次调用生成器并不是不太可能,因为它确实需要重新加载一组重要的值来计算下一个伪随机数。
来源:
http://docs.nvidia.com/cuda/curand/host-api-overview.html#performance-notes2