-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
...
これは数回以上繰り返されます。
グローバルメモリの状態を決して変更しないでください。あなたは何を期待しますか? – talonmies
よろしくお願い致します。 私はそれが自動的に行われたと仮定しましたが、グローバル状態への参照を渡さなかったので、それはコースからは不可能です。 – Curantil