2009-03-02 10 views
5

Ich habe einige parallele Fortran90-Code, in dem jeder Thread die gleiche Folge von Zufallszahlen generieren muss.Thread-sichere einheitliche Zufallszahlengenerator

Ich habe einen Zufallszahlengenerator, der Thread-unsicher scheint, da ich für einen bestimmten Seed vollständig nicht bin, die gleichen Ergebnisse jedes Mal zu wiederholen, wenn ich das Programm ausführe.

Ich surfte erfolglos (fast) das gesamte Web auf der Suche nach einem Code eines Thread-Safe RNG. Könnte mir jemand (den Link) den Code von einem geben?

Vielen Dank im Voraus!

+0

@Eric: Nette umschreiben. – dmckee

+0

Wie ist die Anwendung parallelisiert? Sie könnten das anders handhaben, wenn Sie etwas wie MPI verwenden. –

+0

Inzwischen ist es mit OpenMP parallelisiert, aber in naher Zukunft werde ich es mit MPI – Bellman

Antwort

3

Die meisten wiederholbaren Zufallszahlengeneratoren benötigen einen Zustand in irgendeiner Form. Ohne Staat können sie nicht tun, was als nächstes kommt. Um threadsicher zu sein, müssen Sie den Staat selbst halten (dh er kann nicht global sein).

0

Die Alternativen zu sein scheinen:

  • Verwenden Sie ein Synchronisationsobjekt (wie ein Mutex) auf den Samen des Generators Wert. Dies wird leider Code auf Zugriffe auf Generator im Generator
  • Verwendung gewinde lokalen Speicher serialise so dass jeder Thread seine eigene Samen bekommt - das statstical Probleme für Ihre Anwendung
  • verursachen können, wenn Ihre Plattform ein unterstützt geeignet atomare Operation, verwenden sie das auf dem Samen (es wird wahrscheinlich nicht, aber)

nicht sehr ermutigend Liste, ich weiß. Und um es hinzuzufügen, ich habe keine Ahnung, wie ich sie in FORTRAN implementieren soll!

+0

Bah parallelisieren. Fortran 90 ist nicht weniger als C. –

+0

Ich weiß - FORTRAN IV war meine erste Sprache. Ich meinte, dass "ich persönlich" nicht weiß, wie man sie im modernen Fortran umsetzt. –

2

Wenn Sie sagen, „muss die gleiche Folge von Zufallszahlen erzeugen“ meinen Sie, dass

  • Jeder Thread einen Strom von Zahlen identisch mit dem anderen Thread zu erzeugen braucht? Das bedeutet, dass Sie den Seed vor dem Ablösen von Threads auswählen und dann den Thread-lokalen PRNG in jedem Thread mit demselben Seed instanziieren.

oder

  • Sie wollen die gleiche Zahlenfolge zwischen verschiedenen Läufen der Programme in der Lage sein zu wiederholen, aber jeder Thread erzeugt eine eigene unabhängige Folge ist? In diesem Fall können Sie immer noch keinen einzelnen PRNG freigeben, da die Thread-Operationsfolge nicht deterministisch ist. Setzen Sie also einen einzelnen PRNG mit einem bekannten Seed ein, bevor Sie Threads starten, und verwenden Sie ihn, um die anfänglichen Seeds für die Threads zu generieren. Dann instanziieren Sie Thread-lokale Generatoren in jedem Thread ...

In jedem dieser Fälle sollten Sie beachten, was die Statistiken sagen Neil Butterworth: Die meisten der üblichen Garantien, dass der PRNG gerne Anspruch sind nicht zuverlässig wenn Mischung auf diese Weise erzeugten Ströme.


In beiden Fällen benötigen Sie eine Thread-lokale PRNG. Ich weiß nicht, was in F90 verfügbar ist ... aber Sie können auch Ihre eigenen schreiben (Lookup Mersenne Twister, und schreiben Sie ein Programm, das den gespeicherten Zustand als Parameter verwendet ...).

in Fortran 77, dies wäre so etwas wie

 function PRNGthread (state) 

     double state(statesize) 

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

     PRNGthread = result 
     return 

und jedes Ihrer Fäden aussehen sollte einen eigenen Staat Vektor beibehalten, obwohl alle den gleichen Anfangswert verwendet werden.

1

Ich verstehe Sie jeden Thread müssen den gleichen Strom von Zufallszahlen zu erzeugen.

Ein sehr guter Pseudo-Zufallsgenerator, der einen reproduzierbaren Strom von Zahlen erzeugt und ziemlich schnell ist, ist die MT19937. Stellen Sie nur sicher, dass Sie den Startwert generieren, bevor Sie die Threads generieren, aber generieren Sie eine separate Instanz des MT in jedem Thread (machen Sie die Instanz des MT-Thread lokal). Auf diese Weise wird garantiert, dass jedes MT denselben Zahlenstrom produziert.

1

Wie wäre es SPRNG? Ich habe es selbst nicht versucht.

Verwandte Themen