Random 从均匀分布中生成不同的随机数
我正在尝试使用CURAND库生成从0到100完全独立的随机数。因此,我将时间作为种子分配给每个线程,并将“id=threadIdx.x+blockDim.x*blockIdx.x”指定为序列和偏移量。 然后在得到随机数作为float之后,我将它乘以100,然后取它的整数值 现在,我面临的问题是,无论我运行代码多少次,线程[0,0]和[0,1]都会得到相同的随机数,即11。我无法理解我做错了什么。请帮忙 我正在将代码粘贴到下面:Random 从均匀分布中生成不同的随机数,random,cuda,seed,Random,Cuda,Seed,我正在尝试使用CURAND库生成从0到100完全独立的随机数。因此,我将时间作为种子分配给每个线程,并将“id=threadIdx.x+blockDim.x*blockIdx.x”指定为序列和偏移量。 然后在得到随机数作为float之后,我将它乘以100,然后取它的整数值 现在,我面临的问题是,无论我运行代码多少次,线程[0,0]和[0,1]都会得到相同的随机数,即11。我无法理解我做错了什么。请帮忙 我正在将代码粘贴到下面: #include <stdlib.h> #include
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include<curand_kernel.h>
#include "util/cuPrintf.cu"
#include<time.h>
#define NE WA*HA //Total number of random numbers
#define WA 2 // Matrix A width
#define HA 2 // Matrix A height
#define SAMPLE 100 //Sample number
#define BLOCK_SIZE 2 //Block size
__global__ void setup_kernel ( curandState * state, unsigned long seed )
{
int id = threadIdx.x + blockIdx.x + blockDim.x;
curand_init ( seed, id , id, &state[id] );
}
__global__ void generate( curandState* globalState, float* randomMatrix )
{
int ind = threadIdx.x + blockIdx.x * blockDim.x;
if(ind < NE){
curandState localState = globalState[ind];
float stopId = curand_uniform(&localState) * SAMPLE;
cuPrintf("Float random value is : %f",stopId);
int stop = stopId ;
cuPrintf("Random number %d\n",stop);
for(int i = 0; i < SAMPLE; i++){
if(i == stop){
float random = curand_normal( &localState );
cuPrintf("Random Value %f\t",random);
randomMatrix[ind] = random;
break;
}
}
globalState[ind] = localState;
}
}
/////////////////////////////////////////////////////////
// Program main
/////////////////////////////////////////////////////////
int main(int argc, char** argv)
{
// 1. allocate host memory for matrix A
unsigned int size_A = WA * HA;
unsigned int mem_size_A = sizeof(float) * size_A;
float* h_A = (float* ) malloc(mem_size_A);
time_t t;
// 2. allocate device memory
float* d_A;
cudaMalloc((void**) &d_A, mem_size_A);
// 3. create random states
curandState* devStates;
cudaMalloc ( &devStates, size_A*sizeof( curandState ) );
// 4. setup seeds
int n_blocks = size_A/BLOCK_SIZE;
time(&t);
printf("\nTime is : %u\n",(unsigned long) t);
setup_kernel <<< n_blocks, BLOCK_SIZE >>> ( devStates, (unsigned long) t );
// 4. generate random numbers
cudaPrintfInit();
generate <<< n_blocks, BLOCK_SIZE >>> ( devStates,d_A );
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
// 5. copy result from device to host
cudaMemcpy(h_A, d_A, mem_size_A, cudaMemcpyDeviceToHost);
// 6. print out the results
printf("\n\nMatrix A (Results)\n");
for(int i = 0; i < size_A; i++)
{
printf("%f ", h_A[i]);
if(((i + 1) % WA) == 0)
printf("\n");
}
printf("\n");
// 7. clean up memory
free(h_A);
cudaFree(d_A);
}
#包括
#包括
#包括
#包括
#包括“util/cuPrintf.cu”
#包括
#定义NE WA*HA//随机数的总数
#定义WA 2//矩阵的宽度
#定义HA 2//矩阵A高度
#定义样本100//样本编号
#定义块大小2//块大小
__全局\无效设置\内核(curandState*状态,无符号长种子)
{
int id=threadIdx.x+blockIdx.x+blockDim.x;
curand_init(种子、id、id和状态[id]);
}
__全局无效生成(curandState*全局状态,浮点*随机矩阵)
{
int ind=threadIdx.x+blockIdx.x*blockDim.x;
if(ind(devStates,(unsigned long)t);
//4.生成随机数
cudaPrintfInit();
生成>(数据状态,d_A);
cudaPrintfDisplay(标准输出,真);
cudaPrintfEnd();
//5.将结果从设备复制到主机
cudaMemcpy(h_A、d_A、mem_size_A、cudamemcpydevicetoost);
//6.打印结果
printf(“\n\n矩阵A(结果)\n”);
对于(int i=0;i
我得到的输出是:
时间是:1347857063
[0,0]:浮点随机值为:11.675105[0,0]:随机数11
[0,0]:随机值0.358356[0,1]:浮点随机值为:11.675105[0,1]:随机数11
[0,1]:随机值0.358356[1,0]:浮点随机值为:63.840496[1,0]:随机数63
[1,0]:随机值0.696459[1,1]:浮点随机值为:44.712799[1,1]:随机数44
[1,1]:随机值0.735049这里有一些错误,我在这里介绍第一个问题,让您开始: 一般要点
- 请检查所有CUDA API调用的返回值,有关更多信息,请参阅
- 请运行cuda memcheck检查是否存在明显的问题,如越界访问
- 在为RNG状态分配空间时,每个线程应该有一个状态的空间(而不是像现在这样为每个矩阵元素分配一个状态)
- 您在setup_kernel()中的线程ID计算错误,应该是
(*而不是+)threadIdx.x+blockIdx.x*blockDim.x
- 使用螺纹ID作为序列号和偏移量,只需按照cuRAND手册中的说明将偏移量设置为零:
最后,每个块运行两个线程,效率非常低。有关更多信息,请参阅《CUDA C编程指南》中的“最大化利用率”部分,但您应该希望每个块启动32个线程的倍数(例如128、256个)和大量块(例如上万个)。如果你的问题很小,那么考虑一次运行多个问题(无论是在单个内核中进行批量处理,还是在不同的流中作为内核来并行执行)。我运行了你的代码,它创建了四个完全不同的随机值。你能尝试升级到CUDA 5.0 RC吗?注:我还使用
-arch=sm_20
进行编译,因此我可以使用printf
,因为我周围不再有cuPrintf
。我正在使用CUDA 4.2。。。你能用这个版本运行代码并检查一下吗?因为我找不到在Nvidia上下载CUDA 5.0 RC的地方。。请试一试。顺便说一句,谷歌很擅长发现这些东西好啊我现在正在使用CUDA 4.2…我得到了CUDA 5.0 RC。。。我将尝试使用CUDA 5.0,并让您知道结果是的,我在第一次搜索中错过了链接,我想:)。现在明白了…我没有为每个线程分配1个状态的空间,因为根据我的理解,每个线程都生成一个随机数,对应于我矩阵中的一个元素。不管怎样,你发现了正确的打字错误。。。问题在于setup_内核中的id计算。所以非常感谢你