2009-03-02 21 views
5

Mam trochę równoległego kodu Fortran90, w którym każdy wątek musi generować tę samą sekwencję liczb losowych.Uniwersalny generator liczb losowych w postaci wątku

Mam generator liczb losowych, który wydaje się być niebezpieczny dla wątków, ponieważ dla danego materiału siewnego, nie jestem w stanie powtórzyć tych samych wyników za każdym razem, gdy uruchomię program.

Przeszukałem bezskutecznie (prawie) całą sieć, szukając kodu bezpiecznego wątku RNG. Czy ktoś może mi podać (link do) kod jednego?

Z góry dziękuję!

+0

@Eric: Nice przepisać. – dmckee

+0

W jaki sposób aplikacja jest zrównoleglona? Możesz potraktować to inaczej, jeśli używasz czegoś podobnego do MPI. –

+0

Do tej pory jest zrównoleglony za pomocą OpenMP, ale w niedalekiej przyszłości zrównoluję go używając MPI – Bellman

Odpowiedz

3

Najbardziej powtarzalne generatory liczb losowych muszą być w jakiejś formie. Bez państwa nie mogą robić tego, co będzie potem. Aby być bezpiecznym dla wątków, potrzebujesz sposobu, aby samemu utrzymać stan (tj. Nie może być globalny).

0

alternatywy wydają się być:

  • Użycie obiektu synchronizacji (takich jak mutex) na nasiona wartości generatora. To będzie niestety serialise swój kod na dostępów do generatora
  • Zastosowanie nitki lokalnej pamięci w generatorze więc każdy wątek ma własne nasienie - może to spowodować statstical problemy dla aplikacji
  • Jeśli platforma podtrzymuje nadaje operacja atomowa, należy, że na materiał siewny (prawdopodobnie nie będzie jednak)

Niezbyt zachęcający lista, wiem. I dodając do tego, nie mam pojęcia, jak zaimplementować którykolwiek z nich w FORTRAN!

+0

Bah. Fortran 90 nie jest mniej zdolny niż C. –

+0

Wiem - FORTRAN IV był moim pierwszym językiem. Miałem na myśli, że "ja osobiście" nie wiem, jak je zastosować we współczesnym fortran. –

2

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.

1

Rozumiem, że każdy wątek jest potrzebny do wytworzenia tego samego strumienia liczb losowych.

Bardzo dobry generator pseudolosowy, który generuje odtwarzalny strumień liczb i jest dość szybki, to jest MT19937. Po prostu upewnij się, że wygenerowałeś ziarno przed odszczepieniem wątków, ale wygeneruj oddzielne wystąpienie MT w każdym wątku (spraw, aby instancja wątku MT była lokalna). W ten sposób będzie zagwarantowane, że każdy MT będzie wytwarzał ten sam strumień liczb.

1

Co powiecie na SPRNG? Sam jednak tego nie próbowałem.

Powiązane problemy