Random curand在线程中每次都给出相同的数字
当我打电话给curand时,我总是在一个线程中得到相同的号码。但是,每种线程都不同。在下一个代码中我做错了什么Random curand在线程中每次都给出相同的数字,random,cuda,Random,Cuda,当我打电话给curand时,我总是在一个线程中得到相同的号码。但是,每种线程都不同。在下一个代码中我做错了什么 #define MAXTHREADS 2 #define NBBLOCKS 2 __global__ void testRand ( curandState * state, int nb ){ int id = threadIdx.x + blockIdx.x * blockDim.x; int value; for (int i=0;i<nb;i
#define MAXTHREADS 2
#define NBBLOCKS 2
__global__ void testRand ( curandState * state, int nb ){
int id = threadIdx.x + blockIdx.x * blockDim.x;
int value;
for (int i=0;i<nb;i++){
curandState localState = state[id];
value = curand(&localState);
printf("Id %i, value %i\n",id,value);
}
}
__global__ void setup_kernel ( curandState * state, unsigned long seed )
{
int id = threadIdx.x + blockIdx.x * blockDim.x;
curand_init ( seed, id , 0, &state[id] );
}
/**
* Image comes in in horizontal lines
*/
void findOptimum() {
const dim3 blockSize(MAXTHREADS);
const dim3 gridSize(NBBLOCKS);
curandState* devStates;
cudaMalloc ( &devStates,MAXTHREADS*NBBLOCKS*sizeof( curandState ) );
time_t t;
time(&t);
setup_kernel <<< gridSize, blockSize >>> ( devStates, (unsigned long) t );
int nb = 4;
testRand <<< gridSize, blockSize >>> ( devStates,nb);
testRand <<< gridSize, blockSize >>> ( devStates,nb);
cudaFree(devStates);
}
这会重复几次。正如Talonmes指出的,我没有修改全局状态
使用
curand(localState)
在te行之后添加state[id]=localState
修复了该问题。您永远不会修改全局内存生成器或状态。你认为会发生什么?好的,谢谢!我假设它是自动完成的,但由于我没有传递任何对全局状态的引用,这是不可能的。
Id 0, value -1075808309
Id 1, value -1660353324
Id 2, value 1282291714
Id 3, value -1892750252
Id 0, value -1075808309
Id 1, value -1660353324
Id 2, value 1282291714
Id 3, value -1892750252
...