5

我对 CUDA 中的随机生成器有疑问。我正在使用 Curand 使用以下代码生成随机数:

__device__ float priceValue(int threadid){

    unsigned int seed = threadid ;
    curandState s;
    curand_init (seed , 0, 0, &s);

    float randomWalk = 2;
    while (abs(randomWalk)> 1) {
        randomWalk = curand_normal(&s);
    }
    return randomWalk; 
}

我多次尝试重新启动这段代码,我总是有相同的输出。我找不到这段代码有什么问题。线程给出相同的 ID,但 curand_normal 函数应该在每次启动时改变,对吧?

4

1 回答 1

3

每次请求随机值时,您都在运行 init。相反,您应该curand_init()在代码开头的单独内核中运行一次。然后,当您想要一个新的随机值时,只需调用curand_normal(). 然后,每次调用设备函数时,这些值都会改变。

例如,请参阅我的答案here

如果您想将时间用作种子而不是线程 ID,则传递返回的值clock()或您最喜欢的时间函数:

unsigned int seed = (unsigned int) clock64();
于 2013-03-08T16:09:18.467 回答