我使用CURAND生成随机数.我创建了一个curandGenerator_t
填充3个大约3600万随机数的数组.每个阵列都有不同的种子.数字生成在一个循环内完成,或多或少像这样:
curandGenerator_t randGenerator;
curandCreateGenerator(&randGenerator, CURAND_RNG_PSEUDO_DEFAULT);
for(i = 0; i < 100; i++)
{
curandSetStream(randGenerator, stream[0]);
curandSetPseudoRandomGeneratorSeed(randGenerator, seed[0]);
curandGenerateUniformDouble(randGenerator, d_rv0, N);
curandSetStream(randGenerator, stream[1]);
curandSetPseudoRandomGeneratorSeed(randGenerator, seed[1]);
curandGenerateUniformDouble(randGenerator, d_rv1, N);
curandSetStream(randGenerator, stream[2]);
curandSetPseudoRandomGeneratorSeed(randGenerator, seed[2]);
curandGenerateUniformDouble(randGenerator, d_rv2, N);
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,因为我得到的结果是那些预期的但是在分析应用程序后我意识到在循环的一些迭代之后随机数的生成变得更慢.在下图中,蓝绿色项目从100毫秒到1秒.
有人可以解释这是否是随机数生成的正常行为?
我做错了用三个不同的种子和一个curandGenerator生成随机数吗?
一般来说,之后curandSetSeed()
应该只使用一次curandCreateGenerator()
.
在您的代码中,每次生成随机数之前都会使用它,这会将生成器重置为与种子相同的状态.虽然您d_rv0
在代码中填写了100次,但实际上N
每次填充相同的随机数.
如果您打算这样做,您可以生成N
一次随机数,然后将它们复制100次.
如果没有,你可以curandSetSeed()
离开循环.
另一方面,你使用3粒种子的目的是什么?如果您只想从程序中获得可重复的结果,那么1粒就足够了.如果要维护单独的随机数流,则需要3个生成器,每个生成器有1个种子.
归档时间: |
|
查看次数: |
769 次 |
最近记录: |