【问题标题】:Seeding QUASI_SCRAMBLED_SOBOL64 in CURAND在 CURAND 中播种 QUASI_SCRAMBLED_SOBOL64
【发布时间】:2015-10-07 21:35:18
【问题描述】:

如何为CURAND_RNG_QUASI_SCRAMBLED_SOBOL64 生成器播种?因为每次运行它时它都会给我相同的数字,而且我不能使用curandSetPseudoRandomGeneratorSeedCURAND_RNG_QUASI_SCRAMBLED_SOBOL64 来生成带有curandGenerateLongLong 的64 位随机整数。

如何在以下代码中为生成器播种?

size_t n = 10;
curandGenerator_t gen;
unsigned long long *devData, *hostData;

hostData = (unsigned long long *)calloc(n, sizeof(unsigned long long));

cudaMalloc(&devData, n*sizeof(unsigned long long));
curandCreateGenerator(&gen, curandRngType_t::CURAND_RNG_QUASI_SCRAMBLED_SOBOL64);

for (size_t j = 0; j < 3; j++)
{
    curandGenerateLongLong(gen, devData, n);
    cudaMemcpy(hostData, devData, n * sizeof(unsigned long long), cudaMemcpyDeviceToHost);
    for (size_t i = 0; i < 3; i++) {
        printf("%llx\n", hostData[i]);
    }
    printf("\n\n");
}

curandDestroyGenerator(gen);
cudaFree(devData);
free(hostData);

【问题讨论】:

  • 为什么不能使用 curandSetPseudoRandomGeneratorSeed ?
  • 因为CURAND_RNG_QUASI_SCRAMBLED_SOBOL64和它不兼容,而curandGenerateLongLong需要64位生成器。

标签: random cuda gpu gpgpu nvidia


【解决方案1】:

根据documentation,准随机生成器(如您使用的 SOBOL 生成器)不使用种子。他们使用偏移量和维度向量来初始化生成器。

所以你的代码中的初始化顺序应该是这样的

curandCreateGenerator(&gen, curandRngType_t::CURAND_RNG_QUASI_SCRAMBLED_SOBOL64);
curandSetGeneratorOffset (gen, std::time(0));
curandSetQuasiRandomGeneratorDimensions(gen, 10);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2016-06-17
    • 1970-01-01
    • 2010-11-12
    • 2016-10-14
    相关资源
    最近更新 更多