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.
@Eric: Nette umschreiben. – dmckee
Wie ist die Anwendung parallelisiert? Sie könnten das anders handhaben, wenn Sie etwas wie MPI verwenden. –
Inzwischen ist es mit OpenMP parallelisiert, aber in naher Zukunft werde ich es mit MPI – Bellman