【问题标题】:Random generator & CUDA随机发生器和CUDA
【发布时间】:2015-07-07 00:58:52
【问题描述】:

我对 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 函数应该在每次启动时改变,对吧?

【问题讨论】:

  • 每次启动每个线程时都使用相同的种子,即其线程 ID。你怎么能期望序列不同?
  • 其实我每次都想利用时间设置一个新的种子,但是我不确定这个解决方案

标签: random cuda


【解决方案1】:

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

例如看我的回答here

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

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

【讨论】:

  • 如果 curand_init() 可以从主机调用,那就太好了。您正在编写一个完整的函数来初始化 curand!
猜你喜欢
  • 2010-10-24
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
相关资源
最近更新 更多