如何在内核中生成均匀分布的伪随机整数?据我所知,Curand Api允许使用泊松离散分布,但不均匀。
答案 0 :(得分:2)
我建议在内核中使用两个选项:
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。 你应该使用largest_float_before_1或者少于1,因为你很可能会随机1,你可以超越界限。我还没检查max_float_before_1和GPU上的浮点运算是否保证不超过定义的界限。
2)调用curand返回一系列伪随机数:
int randu_int = A + curand(&localState) % (B-A);
然而,模数在GPU上非常昂贵,方法1更快。