Kiedy mówisz „musi wygenerować taką samą sekwencję liczb losowych” masz na myśli, że
- Każdy wątek musi generować strumień liczb identyczną z innego wątku? Oznacza to wybór nasion przed oderwaniem nici, a następnie utworzenie lokalnie PRNG z gwintem w każdym wątku z tym samym nasieniem.
lub
- Chcesz być w stanie powtórzyć ten sam ciąg liczb pomiędzy różnymi ciągami programów, ale każdy wątek generuje swój własny niezależny sekwencja? W tym przypadku nadal nie można współużytkować pojedynczego PRNG, ponieważ sekwencja operacji wątku jest niedeterministyczna. Dlatego przed uruchomieniem wątków należy wysiać pojedyncze PRNG ze znanym nasieniem i użyć go do wygenerowania początkowych ziaren dla wątków. Następnie tworzysz generatory wątków lokalnych w każdym wątku ...
W każdym z tych przypadków należy pamiętać co Neil Butterworth powiedzieć o statystykach: Większość zwykłych gwarancji, że PRNG lubią zastrzeżenia są nie niezawodny gdy strumienie mix generowane w ten sposób.
W obu przypadkach potrzebny jest lokalny PRNG gwintowany. Nie wiem, co jest dostępne w f90 ... ale możesz również napisać własne (wyszukaj Mersenne Twister i napisz trasę, która pobiera zapisany stan jako parametr ...).
W Fortran 77, będzie to wyglądać
function PRNGthread (state)
double state(statesize)
c stuff happens here which uses and manipulates the state vector...
PRNGthread = result
return
i każdego z wątków należy utrzymać oddzielny wektora stanu, choć wszyscy będą używać tej samej wartości początkowej.
@Eric: Nice przepisać. – dmckee
W jaki sposób aplikacja jest zrównoleglona? Możesz potraktować to inaczej, jeśli używasz czegoś podobnego do MPI. –
Do tej pory jest zrównoleglony za pomocą OpenMP, ale w niedalekiej przyszłości zrównoluję go używając MPI – Bellman