2016-09-08 3 views
1

Ich versuche, intrinsischen PRNG Fortran in einem MPI-Code zu verwenden.Verwendung von Fortran RANDOM_SEED in Parallel MPI

Ich verstehe von diesem link, Das gfortran die PRNG implementieren mit xorshift1024 *, die über einen Zeitraum von 2^1024 hat - 1. Er sagt auch:

Beachten Sie, dass in einem Multithread-Programm (zB OpenMP mit Direktiven), Jeder Thread hat seinen eigenen Zufallszahlenstatus.

Dann this Lesen I gefunden:

Wenn ein neuer Thread RANDOM_NUMBER zum ersten Mal verwendet wird, das Saatgut aus dem Master- Samen kopiert wird, und N * 2^512 Schritte zur Garantie weitergeleitet dass der Zufall Strom Alias ​​keinen anderen Strom in dem System, wobei N die Anzahl der Threads ist, der RANDOM_NUMBER bisher während der Programmausführung

0 verwendet hat,

Wenn dies eine automatische Funktion von GFortran ist, funktioniert es nur in OpenMP? Was, wenn ich paralleles PRNG mit MPI haben möchte? Wie kann ich die Portabilität des Codes für andere Compiler sicherstellen?

Mit anderen Worten: Gibt es eine Möglichkeit zu tun, was GFortran sagt, dass es tut (d. H. Echte parallele PRNG garantieren) in einer tragbaren Weise mit den intran-Anweisungen von Fortran?

HINWEIS: Ich verwendete die PRNG von Numerical Recipes in MPI. Das hat einige Jahre gut funktioniert, aber jetzt bekomme ich ein paar Fehler in einigen Annahmen über das Ganzzahlmodell, das Numerical Recipes sagt, geht über Fortran hinaus ... also sehe ich nicht, wie ich das lösen soll und das ist die Art, wie ich das verwenden möchte intrinsische PRNG wenn möglich.

+0

Wenn Sie Portabilität/Konsistenz über Compiler (sogar Compiler-Versionen) interessieren, dann wird 'random_number' (und' random_seed') viele Probleme darstellen. – francescalus

+0

* Gibt es eine Möglichkeit zu tun, was GFortran sagt, dass es ... auf eine tragbare Weise mit den intran Anweisungen von Fortran? * Nein. This - http://stackoverflow.com/questions/8920411/possible-sources-for- Zufallszahlen - kann nützlich sein. –

+0

Vielen Dank für Ihre Kommentare. Wenn die intrinsischen sind nicht tragbar und die Numerical Recipes scheint auch nicht portierbar (nach meiner Erfahrung). Welche anderen Bibliotheken, Subroutinen oder Methoden schlagen Sie vor? – alexis

Antwort

1

Beachten Sie, dass die Verwendung von xorshoft1024 * eine sehr neue Funktion in GFortran ist, ist es nur in der Entwicklung Stammversion verfügbar, keine veröffentlichte Version hat es noch zu der Zeit des Schreibens dieser. Es wird als Teil von GCC 7 voraussichtlich im Frühjahr 2017 veröffentlicht werden.

Also, wenn Sie MPI verwenden, ist jeder MPI-Rang ein separater Prozess und die Zufallszahlengeneratoren in jedem Prozess ist völlig getrennt ohne Kommunikation zwischen den PRNG ist in verschiedenen Prozessen (außer du handelst es selbst mit MPI, natürlich). Die Sache mit der Weiterleitung der PRNG-Stream 2^512 Schritte passiert nur, wenn Sie die PRNG von mehreren Threads innerhalb des gleichen Prozesses verwenden.

Das besagt, xorshift1024 * hat eine ziemlich lange Periode (2^1024-1), und das erste Mal die PRNG in einem Prozess verwendet wird (wieder denke MPI-Rank) wird mit zufälligen Daten aus dem Betriebssystem initialisiert (/ dev/urandom auf POSIX-Systemen), außer es wurde bereits explizit mit RANDOM_SEED initialisiert. In der Praxis denke ich, dass es dir gut gehen wird, es ist äußerst unwahrscheinlich, dass die PRNG-Streams für verschiedene MPI-Ränge alias werden.

Und nein, das oben beschriebene beschreibt die PRNG in GFortran Version 7. Wenn Sie etwas tragbares wollen, können Sie sich nicht auf etwas verlassen, was über den Standard hinausgeht. Abgesehen von den parallelen Aspekten sind Sie bei tragbaren hochwertigen Zufallszahlen wahrscheinlich besser, wenn Sie eine bekannte gute PRNG verwenden, statt sich auf die vom Compiler bereitgestellte zu verlassen (ich habe persönliche Erfahrung mit mindestens einem Compiler, der mit der RANDOM_NUMBER intrinsisch, aber ich werde den Hersteller nicht nennen, da es vor vielen Jahren war und sie könnten es seither behoben haben, wenn sie überhaupt im Geschäft sind, weiß ich nicht).

(Wenn Sie die Semantik des neuen xorshift1024 finden * Implementierung schwierig, die Schuld a) mir, da ich es erdacht und umgesetzt es b) der Fortran-Standard, der es unmöglich macht, eine parallele PRNG mit einfacher Semantik haben)

+0

Vielen Dank @janneb. Könnten Sie einen bekannten guten und tragbaren PRNG in Fortran vorschlagen? – alexis

+0

Nun, ich denke xorshift1024 * ia eine ziemlich gute Wahl. Die Referenzimplementierung ist jedoch in C und verwendet vorzeichenlose 64-Bit-Arithmetik, die in Fortran nur schwer zu emulieren ist. Ich empfehle die Verwendung der C-Implementierung über ISO_C_BINDING. – janneb

1

Wenn Sie eine portable Version eines Multi-Stream-Zufallszahlengenerators für ein Fortran-Programm haben möchten, gibt es eine Multi-Stream Fortran-Version des Mersenne Twister. Siehe http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html. Es verwendet das Konzept, den PRNG durch eine sehr große Anzahl von Schritten für die verschiedenen Threads voranzutreiben. Es wird von Subroutinen-Aufrufen eingerichtet und konfiguriert, sodass Sie es aus verschiedenen Multithreading-Umgebungen verwenden können.