【问题标题】:Function like rand(), to generate random number in CUDA _global_ kernel? [duplicate]像 rand() 这样的函数,在 CUDA _global_ 内核中生成随机数? [复制]
【发布时间】:2020-11-18 07:55:48
【问题描述】:

我正在尝试创建一个随机生成器来初始化向量。

我在CUDA中写的核函数如下:

__global__ void randgenvec( int *a, int t) {
    int tid = blockIdx.x; // handle the data at this index
    if (tid < t){
        a[tid] = rand() % 100; //****ang replacement for rand() here expect cuRAND?*****
    }
}

我知道我不能在内核函数中使用rand() 函数。有没有其他功能可以用rand()代替。

我知道我们有可以使用的 cuRAND 库。但是想让我的代码更便携、更轻便,并且 cuRAND 需要链接器来执行,我不想使用它。

我的随机化目标是生成 1 到 100 之间的任何 int。

By linker, I mean :: linker flag -lcurand

非常感谢任何其他建议。

【问题讨论】:

  • 你的意思是你需要链接器来执行?如果您使用的是 CUDA,则您已经在项目中链接了 Nvidia 库和驱动程序。
  • 嗨@Kaldrr,我的意思是链接器-linker flag -lcurand。我已经更清楚地编辑了我的问题。
  • 请不要投票重新打开它。链接的副本是一个很好的答案

标签: cuda nvidia random-seed


【解决方案1】:

试试这个

 unsigned short lfsr = 0xACE1u;
  unsigned bit;

  unsigned randomize()
  {
    bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
    return lfsr =  (lfsr >> 1) | (bit << 15);
  }

【讨论】:

  • 嗨@MaslovKk,感谢您的回答。我希望生成 1 到 100 之间的数字。如果我这样做 randomize()%100 ,代码会起作用吗?
  • 不,不要尝试这个。它不是线程安全的,并且在像 CUDA 这样的大规模并行环境中无法正常工作,这是个问题
  • @talonmies,你能推荐一些我可以用于随机化的其他函数吗?
  • 是的。使用凝乳。高质量的随机数很难正确。双重如此并行。使用为此目的设计的库。你不这样做的理由毫无意义
  • 好的,我决定使用 cuRAND,但我不知道如何使用 cuRAND 生成 0 到 100 之间的随机数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2020-03-02
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多