2009-03-02 16 views
5

Ho un codice Fortran90 parallelo in cui ogni thread deve generare la stessa sequenza di numeri casuali.Generatore di numeri casuali uniforme thread-safe

Ho un generatore di numeri casuali che sembra essere non sicuro dal thread, poiché, per un dato seme, non riesco a ripetere gli stessi risultati ogni volta che eseguo il programma.

Ho navigato senza successo (quasi) l'intero web alla ricerca di codice di un RNG sicuro per thread. Qualcuno potrebbe fornirmi (il link a) il codice di uno?

Grazie in anticipo!

+0

@Eric: Bella riscrittura. – dmckee

+0

Come viene parallelizzata l'applicazione? Potresti gestirlo diversamente se stai usando qualcosa come MPI. –

+0

Ormai è parallelizzato usando OpenMP ma in un prossimo futuro, lo parallelizzerò usando MPI – Bellman

risposta

3

I generatori di numeri casuali più ripetibili necessitano di uno stato in qualche modo. Senza stato, non possono fare ciò che viene dopo. Per essere sicuri, hai bisogno di un modo per tenerti te stesso (cioè, non può essere globale).

0

Le alternative sembrano essere:

  • Utilizzare un oggetto di sincronizzazione (ad esempio un mutex) sul seme valore del generatore. Ciò purtroppo puntate il vostro codice su accessi a generatore
  • utilizzare l'archiviazione thread-local nel generatore così ogni thread prende il proprio seme - ciò può causare statstical problemi per la vostra applicazione
  • Se la piattaforma supporta un adatto operazione atomica, l'uso che sul seme (probabilmente non sarà, però)

non una lista molto incoraggiante, lo so. E per aggiungerlo, non ho idea di come implementare nessuno di loro in FORTRAN!

+0

Bah. Fortran 90 non è meno capace di C. –

+0

Lo so - FORTRAN IV è stata la mia prima lingua. Intendevo dire che "Io personalmente" non so come implementarli nel fortran moderno. –

2

Quando si dice "deve generare la stessa sequenza di numeri casuali" vuoi dire che

  • Ogni thread ha bisogno di generare un flusso di numeri identica a l'altro thread? Ciò implica scegliere il seme prima di staccare i thread, quindi istanziare un PRNG thread-local in ogni thread con lo stesso seme.

o

  • si vuole essere in grado di ripetere la stessa sequenza di numeri tra diverse esecuzioni di programmi, ma ogni thread genera il proprio sequenza indipendente? In questo caso, non è ancora possibile condividere un singolo PRNG perché la sequenza di operazioni thread non è deterministica. Quindi seminare un singolo PRNG con un seme noto prima di avviare i thread e utilizzarlo per generare i semi iniziali per i thread. Quindi si istanziano i generatori di thread locale in ogni thread ...

In ognuno di questi casi si dovrebbe notare che cosa Neil Butterworth dire circa le statistiche: la maggior parte delle garanzie usuali che il PRNG piace affermare sono non affidabili quando flussi mix generati in questo modo.


In entrambi i casi è necessario un PRNG locale thread. Non so cosa sia disponibile in f90 ... ma puoi anche scriverlo (cercare Mersenne Twister e scrivere una routine che accetta lo stato salvato come parametro ...).

in Fortran 77, questo sarebbe un aspetto simile

 function PRNGthread (state) 

     double state(statesize) 

c stuff happens here which uses and manipulates the state vector... 

     PRNGthread = result 
     return 

e ciascuna delle vostre discussioni dovrebbe mantenere un vettore di stato indipendente, anche se tutti useranno lo stesso valore iniziale.

1

Capisco che è necessario ogni thread per produrre lo stesso flusso di numeri casuali.

Un ottimo generatore di Pseudo Casuale che genera un flusso riproducibile di numeri ed è piuttosto veloce è lo MT19937. Assicurati di generare il seed prima di generare i thread, ma genera un'istanza separata del MT in ogni thread (crea l'istanza del thread MT locale). In questo modo sarà garantito che ogni MT produrrà lo stesso flusso di numeri.

1

Che ne dici di SPRNG? Non ho provato me stesso però.

Problemi correlati