CUDA核内的均匀分布伪随机整数

CUDA核内的均匀分布伪随机整数,cuda,Cuda,如何在内核中生成均匀分布的伪随机整数?据我所知,Curand Api允许使用泊松离散分布,但不是均匀分布。我建议内核中有两个选项: 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 = _

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

我建议内核中有两个选项:

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之前使用最大的_float_或略小于1的值,因为随机选择1的可能性很小,您可以越界。我也没有检查GPU上最大的浮点运算是否保证不超过定义的界限

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

int randu_int = A + curand(&localState) % (B-A);
然而,模在GPU上非常昂贵,方法1速度更快