2017-01-21 27 views
-1

私がcurandを呼び出すと、スレッドでは常に同じ番号が返されます。ただし、スレッドごとに異なります。次のコードで何が間違っていますか?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++){ 
     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); 
} 

これは、出力:

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

これは数回以上繰り返されます。

+0

グローバルメモリの状態を決して変更しないでください。あなたは何を期待しますか? – talonmies

+0

よろしくお願い致します。 私はそれが自動的に行われたと仮定しましたが、グローバル状態への参照を渡さなかったので、それはコースからは不可能です。 – Curantil

答えて

1

私が指摘したように、私はグローバルな状態を変更しませんでした。

curand(localState)でte行後にstate[id] = localStateを追加すると、問題が修正されました。

関連する問題