Random 在cuda内核中生成0到1之间的随机数
我有一个cuda应用程序,我想在其中生成0到1之间的随机数。我编写了一个伪代码,其中8x256大小的矩阵将由内核生成的随机数填充。我的原始矩阵将类似于8XBIG_数字。但可能我的代码中缺少了一些东西,因为我无法生成所需的结果Random 在cuda内核中生成0到1之间的随机数,random,cuda,gpgpu,Random,Cuda,Gpgpu,我有一个cuda应用程序,我想在其中生成0到1之间的随机数。我编写了一个伪代码,其中8x256大小的矩阵将由内核生成的随机数填充。我的原始矩阵将类似于8XBIG_数字。但可能我的代码中缺少了一些东西,因为我无法生成所需的结果 void main(int argc,char* argv[]) { float *test_var,*dev_test; curandState *state; test_var = (float *)malloc(8*256*sizeo
void main(int argc,char* argv[])
{
float *test_var,*dev_test;
curandState *state;
test_var = (float *)malloc(8*256*sizeof(float));
memset(test_var,0,8*256*sizeof(float));
cudaMalloc((void **)&dev_test,8*256*sizeof(float));
cudaMemcpy(dev_test,test_var,8*256*sizeof(float),cudaMemcpyHostToDevice);
dim3 gridDim(1,256/32,1);
dim3 blockDim(8,32,1);
cudaMalloc((void **)&state,8*256*sizeof(curandState));
setup_kernel<<<gridDim,blockDim>>>(state,unsigned(time(NULL)));
test_kernel<<<gridDim,blockDim>>>(state,dev_test);
cudaMemcpy(test_var,dev_test,8*256*sizeof(float),cudaMemcpyDeviceToHost);
system("PAUSE");
for (int i=0;i<256;i++)
{ for (int j=0;j<8;j++)
{ printf("%f\t",test_var[i*8+j]);
}
printf("\n");
}
cudaFree(dev_test);
cudaFree(state);
free(test_var);
exit(0);
}
__global__ void setup_kernel(curandState *state,unsigned long seed)
{
int id_col = threadIdx.x + blockDim.x*blockIdx.x;
int id_row = threadIdx.y+blockDim.y*blockIdx.y;
curand_init(seed,(id_row*8+id_col),0,&state[id_row*8+id_col]);
}
__global__ void test_kernel(curandState *state,float *dev_test)
{
int id_col = threadIdx.x + blockDim.x*blockIdx.x;
int id_row = threadIdx.y+blockDim.y*blockIdx.y;
curandState local_state = state[id_row*8+id_col];
dev_test[id_row*8+id_col] = curand(&local_state);
state[id_row*8+id_col] = local_state;
}
我想为矩阵中的每个单元格生成一个介于0和1之间的随机数。我非常感谢任何人的帮助。谢谢如果您参考curand,您将注意到为您正在使用的设备api函数提供的声明:
__device__ unsigned int curand (curandState_t *state)
这个特定的API调用返回一个无符号的int。因此,除非您以某种方式修改它,否则将无法获得浮点值
由于它返回无符号的int值,一种可能的修改方法是缩放结果:
dev_test[id_row*8+id_col] = curand(&local_state)/(float)(0x0FFFFFFFFUL);
此修改将为您提供介于0和1之间的浮点值。然而,由于各种原因,这是相当粗糙的。正如评论中所建议的,选择其中一个设备生成器更为合理,可以为您实现这一点,例如:
dev_test[id_row*8+id_col] = curand_uniform(&local_state);
我不是这方面的专家,但似乎多项式分布基本上是离散分布。因此,如果打算从0到1之间的浮点随机数开始,则需要某种方法将连续值分布转换为离散值分布。Wikipedia从0到1之间的连续值随机数开始,根据我对该方法的了解,curand_均匀分布/生成器将是一个合理的起点。如果您提到curand,您将注意到为您正在使用的设备api函数给出的声明:
__device__ unsigned int curand (curandState_t *state)
这个特定的API调用返回一个无符号的int。因此,除非您以某种方式修改它,否则将无法获得浮点值
由于它返回无符号的int值,一种可能的修改方法是缩放结果:
dev_test[id_row*8+id_col] = curand(&local_state)/(float)(0x0FFFFFFFFUL);
此修改将为您提供介于0和1之间的浮点值。然而,由于各种原因,这是相当粗糙的。正如评论中所建议的,选择其中一个设备生成器更为合理,可以为您实现这一点,例如:
dev_test[id_row*8+id_col] = curand_uniform(&local_state);
我不是这方面的专家,但似乎多项式分布基本上是离散分布。因此,如果打算从0到1之间的浮点随机数开始,则需要某种方法将连续值分布转换为离散值分布。Wikipedia以0到1之间的连续值随机数为起点,根据我对该方法的了解,curand_均匀分布/生成器将是一个合理的起点。curandèGenerateUniform有什么问题吗?我没有尝试过。但我试图生成一个不属于任何分布的随机数。这就是为什么我是库兰。一个不属于任何分布的随机数是没有意义的。这就像说一条没有形状的线。均匀分布就是它听起来的样子:0和1之间的每个值都有相同的可能性。是的,我能理解你想说的。事实上,我试图用多项式分布生成数字。但是因为库中没有它,所以我尝试使用curand。如果你能发布一个实际可编译的代码版本,其中包含函数原型、includes等所有额外的行,可能会很有用,这样你就可以轻松编译代码并帮助你,请参阅我的一篇帖子:curandGenerateUniform有什么问题吗?我还没试过。但我试图生成一个不属于任何分布的随机数。这就是为什么我是库兰。一个不属于任何分布的随机数是没有意义的。这就像说一条没有形状的线。均匀分布就是它听起来的样子:0和1之间的每个值都有相同的可能性。是的,我能理解你想说的。事实上,我试图用多项式分布生成数字。但由于库中没有curand,所以我尝试使用curand。如果您能发布一个实际可编译的代码版本,其中包含函数原型、includes等所有额外的行,可能会有所帮助,这样您就可以轻松编译代码并帮助您,请参阅我的一篇文章中的Talonmies:-