2013-08-20 5 views
1

J'utilise CURAND pour générer des nombres aléatoires. J'ai créé un curandGenerator_t pour remplir 3 tableaux qui sont environ 36 millions de nombres aléatoires. Chacun de ces tableaux a une graine différente. La génération de nombres se fait dans une boucle plus ou moins comme ceci:CURAND plus lent

curandGenerator_t randGenerator; 
curandCreateGenerator(&randGenerator, CURAND_RNG_PSEUDO_DEFAULT); 

for(i = 0; i < 100; i++) 
{ 
    curandSetStream(randGenerator, stream[0]); 
    curandSetPseudoRandomGeneratorSeed(randGenerator, seed[0]); 
    curandGenerateUniformDouble(randGenerator, d_rv0, N); 

    curandSetStream(randGenerator, stream[1]); 
    curandSetPseudoRandomGeneratorSeed(randGenerator, seed[1]); 
    curandGenerateUniformDouble(randGenerator, d_rv1, N); 

    curandSetStream(randGenerator, stream[2]); 
    curandSetPseudoRandomGeneratorSeed(randGenerator, seed[2]); 
    curandGenerateUniformDouble(randGenerator, d_rv2, N); 
} 

Il fonctionne très bien que les résultats que je reçois sont ceux attendus mais après profilage l'application j'ai réalisé que, après quelques itérations de la boucle de la génération des nombres aléatoires devient plus lent. Dans l'image suivante, l'élément bleu-verdâtre passe de 100 ms à 1 s. Est-ce que quelqu'un pourrait expliquer si c'est un comportement normal de la génération de nombre aléatoire?

Suis-je en train de générer des nombres aléatoires avec trois graines différentes et un seul curandGenerator?

enter image description here

Répondre

6
  1. Je ne peux pas recréer le résultat de votre profil, je ne suis pas un effet de ralentissement dans la boucle.
  2. Je pense que vous utilisez mal le curand.

En général, curandSetSeed() ne doit être utilisé qu'une seule fois après curandCreateGenerator().

Dans votre code vous l'avez utilisé à chaque fois avant de générer des nombres aléatoires, ce qui réinitialisera le générateur au même état w.r.t. la graine. Bien que vous remplissiez d_rv0 100 fois dans votre code, vous le remplissez réellement avec les mêmes nombres aléatoires N chaque fois.

Si vous aviez l'intention de le faire, vous pourriez générer un nombre aléatoire de N une fois, puis les copier 100 fois.

Sinon, vous pouvez déplacer curandSetSeed() hors de la boucle. D'autre part, quel est votre but d'utiliser 3 graines? Si vous voulez juste obtenir un résultat reproductible de votre programme, 1 graine suffit. Si vous voulez maintenir des flux de nombres aléatoires séparés, vous avez besoin de 3 générateurs ayant chacun 1 graine.

+0

Je pensais que le générateur sauvait l'état même après avoir changé la graine. Et bien j'ai vraiment besoin de 3 graines différentes pour 3 flux aléatoires différents. Je vais y jeter un coup d'oeil et voir comment ça se passe. Si le problème persiste, je le posterai à nouveau. – BRabbit27

+0

Le problème était en fait 'curandSetSeed()' j'ai exécuté le même test et maintenant il n'y a plus d'effet de ralentissement et en fait j'ai eu plus de vitesse. – BRabbit27