1

我正在使用 CURAND 生成随机数。我创建了一个curandGenerator_t来填充大约 3600 万个随机数的 3 个数组。这些数组中的每一个都有不同的种子。数字生成或多或少在一个循环内完成,如下所示:

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 生成随机数是否做错了?

在此处输入图像描述

4

1 回答 1

6
  1. 我无法重新创建您的分析结果,我没有在循环中获得减速效果。
  2. 我认为您以错误的方式使用 curand。

一般情况下,curandSetSeed()应仅在 之后使用一次curandCreateGenerator()

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

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

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

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

于 2013-08-20T17:25:04.183 回答