2013-08-20 183 views
1

我使用CURAND来生成随机数。我创建了一个curandGenerator_t来填充3个大约3600万个随机数的数组。每个数组都有不同的种子。数生成一个循环内完成或多或少是这样的:CURAND运行速度较慢

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); 
} 

因为我得到的结果是这些预期,但剖析应用程序后,我意识到它工作正常环路产生的一些迭代后的随机数变得更慢。在下图中,蓝绿色的项目从100毫秒变为1秒。

有人可以解释这是否是随机数生成的正常行为?

我做错了用三个不同的种子和只有一个curandGenerator生成随机数?

enter image description here

回答

6
  1. 我不能重新创建你的分析结果,我没有得到在回路中的减速效果。
  2. 我想你是用错误的方式使用curand。

通常,curandSetSeed()只能在curandCreateGenerator()后使用一次。

在您的代码中,您每次都在生成随机数之前使用它,这会将生成器重置为相同的状态w.r.t.种子。 尽管您在代码中填充了d_rv0 100次,但实际上每次都使用相同的N随机数填充。

如果您打算这样做,您可以生成一次N随机数,然后将它们复制100次。

如果不是,则可以将curandSetSeed()移出循环。

另一方面,你使用3粒种子的目的是什么?如果你只是想从程序中获得可重复的结果,那么1粒种子就足够了。如果你想保持独立的随机数字流,你需要3个发电机,每个发电机有1个种子。

+0

我希望生成器即使在更改种子后也能保存状态。我真的需要为3种不同的随机流提供3种不同的种子。我会看看它,看看它是如何发展的。如果问题仍然存在,我会再次发布。 – BRabbit27

+0

问题其实是'curandSetSeed()'我跑了相同的测试,现在没有更多的减速效果,事实上我得到了更多的加速。 – BRabbit27