Ich habe einen Fortran-Code, den ich verwende, um einige Mengen im Zusammenhang mit der Arbeit zu berechnen, die ich mache. Der Code selbst beinhaltet mehrere verschachtelte Schleifen und erfordert sehr wenig Festplatten-E/A. Wenn der Code geändert wird, führe ich ihn gegen eine Reihe von Eingabedateien (um sicherzustellen, dass er richtig funktioniert).Serial Programm läuft langsamer mit mehreren Instanzen oder parallel
Um eine lange Geschichte kurz zu machen: das letzte Update, um die Laufzeit des Programms um etwa den Faktor vier erhöht hat, und seriell mit einer CPU dauert etwa 45 Minuten jede Eingabedatei ausgeführt wird (eine lange Zeit zu warten, nur um zu sehen, ob etwas kaputt war). Folglich möchte ich jede Eingabedatei parallel über die 4 CPUs auf dem System laufen lassen. Ich habe versucht, die Parallelität über ein Bash-Skript zu implementieren.
Die interessante Sache, die ich festgestellt habe, ist, dass, wenn nur eine Instanz des Programms auf der Maschine läuft, es dauert etwa dreieinhalb Minuten, um durch eine der Eingabedateien durchzudrehen. Wenn vier Instanzen des Programms laufen, dauert es mehr als elfeinhalb Minuten, um durch eine Eingabedatei zu gehen (was meine Gesamtlaufzeit von etwa 45 Minuten auf 36 Minuten reduziert) - eine Verbesserung, ja, aber nicht ganz, was ich hatte hoffte auf).
Ich habe versucht, die Parallelität mit gnu parallel, xargs, warten und sogar nur vier Instanzen des Programms im Hintergrund von der Kommandozeile starten. Unabhängig davon, wie die Instanzen gestartet werden, sehe ich die gleiche Verzögerung. Folglich bin ich mir ziemlich sicher, dass dies kein Artefakt des Shell-Skripts ist, sondern dass irgendetwas mit dem Programm selbst passiert.
Ich habe versucht, das Programm mit deaktivierten Debugging-Symbolen neu zu erstellen und auch statische Verknüpfungen zu verwenden. Keine von diesen hatte einen spürbaren Einfluss. Ich baue das Programm derzeit mit den folgenden Optionen:
$ gfortran -Wall -g -O3 -F Backtrace -ffpe-Trap = ungültig, Null, Überlauf, Unterlauf, Denormal -fbounds-check -finit-real = nan -finit-integer = nan -o [Programmname] {Quellen}
Jede Hilfe oder Anleitung wäre sehr willkommen!
Sind Sie sicher, dass Sie GNU Parallel Shell verwenden? Wenn nicht, überprüfen Sie bitte die Beschreibungen Ihrer Tags und verwenden Sie nur die zutreffenden. Ist das Bash-Tag wirklich relevant? Irgendein Code wird wahrscheinlich notwendig sein. –
Ja, ich habe versucht, GNU parallel als Lösung zu verwenden. Ich habe auch versucht, mit xargs, warten und einfach mehrere Instanzen im Hintergrund starten. –
Haben Sie vier Hardwarekerne? Ist Ihre Programmspeicherbandbreite schwer? Bitte geben Sie spezifischere Informationen zu Ihrer Hardware und einem Beispielprogramm an. – IanH