2013-03-08 171 views
4

我有一个关于CUDA中的随机生成器的问题。我使用Curand用下面的代码生成随机数:随机生成器和CUDA

__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; 
} 

我试图重新启动这个代码很多次了,我一直在相同的输出。我无法找到此代码中的错误。线程给出相同的Ids,但curand_normal函数应该在每次启动时更改,对吧?

+1

你每次启动每个线程使用相同的种子,其线程ID。你怎么能期望序列是不同的? – 2013-03-08 15:28:21

+0

其实我想用时间来设置一个新的种子,但我不知道有关thi解决方案 – ALFRAM 2013-03-08 15:57:49

回答

3

您每次要求随机值时都运行init。相反,您应该在代码开始的一个单独的内核中运行一次curand_init()。然后,当你想要一个新的随机值时,只需拨打curand_normal()即可。然后,每次调用设备功能时,这些值都会改变。

举个例子,看我的回答here

如果你想使用时间作为种子,而不是线程ID,然后路过clock()返回the value或什么是你最喜欢的计时功能:

unsigned int seed = (unsigned int) clock64(); 
+1

如果curand_init()可以从主机调用,那将会很棒。你正在编写一个完整的函数来初始化curand! – 2013-03-08 20:15:20