Je génère 1 bloc de 256 threads à partir de mon noyau Setup()
pour configurer un tableau RNGstates
avec 256 états CURAND :
__global__ void Setup(curandState *RNGstates, long seed) {
int tid = threadIdx.x;
curand_init(seed, tid, 0, &RNGstates[tid]);
}
Maintenant, je génère 1000 blocs de 256 threads à partir de mon noyau Generate()
pour remplir le tableau résultat
avec 256 000 nombres aléatoires. Cependant, je le fais en n'utilisant que les 256 états de RNGstates
, de sorte que chaque état sera accédé par 1000 threads (un de chaque bloc) :
__global__ void Generate(curandState *RNGstates, float *result) {
int tid = blockIdx.x*blockDim.x + threadIdx.x;
float rnd = curand_uniform(&RNGstates[threadIdx.x]);
result[tid] = rnd;
}
Je sais que l'appel à curand_uniform()
met à jour les états d'une manière ou d'une autre, donc je suppose qu'une opération d'écriture a lieu.
Devrais-je m'inquiéter des conflits de données qui se produisent lorsque les 1000 threads mappés à chacun des 256 états CURAND tentent de mettre à jour l'état implicitement via curand_uniform()
? Cela impactera-t-il la qualité de mes nombres aléatoires (par exemple, obtenir des valeurs dupliquées fréquemment)?
Merci beaucoup.