CURAND运行速度较慢

时间:2013-08-20 12:49:07

标签: cuda gpgpu nvidia

我使用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);
}

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

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

我是否错误地使用三个不同的种子和一个curandGenerator生成随机数?

enter image description here

1 个答案:

答案 0 :(得分:6)

  1. 我无法重新创建您的分析结果,我在循环中没有减慢效果。
  2. 我认为你是以错误的方式使用curand。
  3. 通常,curandSetSeed()只能在curandCreateGenerator()之后使用一次。

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

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

    如果没有,您可以将curandSetSeed()移出循环。

    另一方面,你使用3粒种子的目的是什么?如果您只想从程序中获得可重复的结果,那么1粒就足够了。如果要维护单独的随机数流,则需要3个生成器,每个生成器有1个种子。