【问题标题】:Uniformly distributed pseudorandom integers inside CUDA kernel [duplicate]CUDA内核内均匀分布的伪随机整数[重复]
【发布时间】:2014-07-31 02:09:23
【问题描述】:

如何在内核中生成均匀分布的伪随机整数?据我所知,Curand Api 允许使用泊松离散分布,但不均匀。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    我建议在内核中使用两个选项:

    1) 使用 curand_uniform 从均匀分布中获取一个随机浮点数,然后将其映射到整数区间:

    float randu_f = curand_uniform(&localState);
    randu_f *= (B-A+0.999999); // You should not use (B-A+1)*
    randu_f += A;
    int randu_int = __float2int_rz(randu_f);
    

    __float2int_rz 将单精度浮点值 x 转换为向零舍入模式的有符号整数。

    *curand_uniform 返回一系列伪随机浮点数,均匀分布在 0.0 和 1.0 之间。它可能会从 0.0 返回到 1.0,其中包括 1.0,不包括 0.0。 你应该使用最大浮点数或者比 1 略小的值,因为你随机 1 的可能性很小,而且你可能会越界。我还没有检查 GPU 上的最大浮点运算和浮点运算是否保证不会超出定义的范围。

    2) 调用 curand 返回一个伪随机数序列:

    int randu_int = A + curand(&localState) % (B-A);
    

    但是,在 GPU 上取模非常昂贵,方法 1 更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多