CURAND运行速度较慢

BRa*_*t27 1 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述

kan*_*yin 6

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

一般来说,之后curandSetSeed()应该只使用一次curandCreateGenerator().

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

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

如果没有,你可以curandSetSeed()离开循环.

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