Come generare pseudo casuali in CUDA
Domanda
sto cercando di costruire un sistema di particelle che utilizza CUDA per fare il sollevamento di carichi pesanti. Voglio ripartire le probabilità alcuni dei valori iniziali delle particelle come la velocità e la durata della vita. I numeri casuali non devono essere super casuale dal momento che è solo per effetto visivo. Ho trovato questo post che affronta lo stesso argomento:
generazione di numeri casuali in CUDA
Questo suggerisce un congruenziale lineare è la strada da percorrere. Sembra come dovrebbe essere semplice da implementare, ma sto avendo difficoltà a raggiungere qualcosa di utile della mia esecuzione. Qualcuno può fornire un codice che verrà eseguito nel dispositivo?
Sto usando CUDA con VC ++ su Windows 7 a 64 bit.
Soluzione
generatori CUDA pseudo numeri casuali sono
-
incluso nel SDK NVidia esempio
C/src/MersenneTwister/
eC/src/quasirandomGenerator
-
disponibile come carte e fonte separati:
Altri suggerimenti
A seconda delle esigenze ci sono una serie di opzioni open source. Ci sono anche diverse opzioni commerciali come NAG che hanno implementato MRG32k3a del l'Ecuyer. Diffidare di utilizzare un LCG se è necessario per garantire che i flussi non sono correlati - è possibile utilizzare cavallina / scissione, ma avrete bisogno di un periodo molto lungo
Se si vuole andare open source allora si dovrebbe assolutamente considerare l'utilizzo di spinta per la sua semplicità. Ci sono anche alcuni RNG nel NVIDIA SDK, tra cui il campione di Mersenne Twister PRNG (MT607, MT19937 è sui forum) e la Sobol e Niederreiter QRNGs.
Infine, CUDPP ha anche un generatore di numeri casuali.