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.
@Eric: Bella riscrittura. – dmckee
Come viene parallelizzata l'applicazione? Potresti gestirlo diversamente se stai usando qualcosa come MPI. –
Ormai è parallelizzato usando OpenMP ma in un prossimo futuro, lo parallelizzerò usando MPI – Bellman