【发布时间】:2014-07-31 02:09:23
【问题描述】:
如何在内核中生成均匀分布的伪随机整数?据我所知,Curand Api 允许使用泊松离散分布,但不均匀。
【问题讨论】:
标签: cuda
如何在内核中生成均匀分布的伪随机整数?据我所知,Curand Api 允许使用泊松离散分布,但不均匀。
【问题讨论】:
标签: cuda
我建议在内核中使用两个选项:
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 更快。
【讨论】: