samedi 21 janvier 2017

curand gives the same number every time in a thread

When I call curand, I always get the same number in a thread. They are different for each thread however. What am I doing wrong in the next code?

#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);
}

It outputs:

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
...

This repeats a few times more.




Aucun commentaire:

Enregistrer un commentaire