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

Random 线程唯一随机数需要多少cuRand状态?(CUDA),random,cuda,state,Random,Cuda,State,每个线程中需要多少个cuRand状态才能获得唯一的随机数?从网站上发布的其他问题来看,有些人说每个线程需要一个,而另一些人说每个区块需要一个 每个线程使用一个cuRand状态是否意味着更好的随机数? 每个线程使用1个cuRand state是否会显著降低CUDA应用程序的速度(5000多个线程) 同样,对于每个线程使用1个cuRand状态的实现,这个内核看起来正确且高效吗 __global__ void myKernel (const double *seeds) // seeds is an

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

每个线程使用一个cuRand状态是否意味着更好的随机数? 每个线程使用1个cuRand state是否会显著降低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);

...

}

假设所有线程都保持同步,那么您希望在所有线程中同时生成随机数,如示例代码中所示。然而,从我的理解来看,你不需要在每一个线程中使用不同的种子。我可能在这一点上错了

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

来源: