Ich habe eine Maschine mit 8 Prozessoren. Ich möchte mit OpenMP und MPI auf meinen Code wie folgt alternieren:
OpenMP-Phase:
MPI-Phase:
Bisher habe ich getan:
Es hat alles funktioniert. Rang 0 hat 8 Threads gestartet, aber alle sind auf einen Prozessor beschränkt. In der OpenMP-Phase bekomme ich 8 Threads von Rang 0 auf einem Prozessor und alle anderen Prozessoren sind inaktiv.
Wie kann ich MPI mitteilen, dass Rang 0 die anderen Prozessoren verwenden soll? Ich verwende Intel MPI, könnte aber bei Bedarf zu OpenMPI oder MPICH wechseln.
Danke allen für die Kommentare und Antworten. Du bist in Ordnung. Es geht nur um die "PIN" -Option.
Um mein Problem zu lösen, musste ich einfach:
I_MPI_WAIT_MODE = 1
I_MPI_PIN_DOMAIN = omp
Einfach so. Jetzt sind alle Prozessoren für alle Ränge verfügbar.
Die Option
I_MPI_DEBUG = 4
zeigt an, welche Prozessoren jeder Rang bekommt.
Der folgende Code zeigt ein Beispiel zum Speichern der CPU-Affinitätsmaske vor dem OpenMP-Teil, ändern Sie diesen, um alle CPUs für die Dauer des parallelen Bereichs zuzulassen, und stellen Sie dann die vorherige CPU-Affinitätsmaske wieder her. Der Code ist Linux-spezifisch und es macht keinen Sinn, wenn Sie das Prozess-Pinning durch die MPI-Bibliothek nicht aktivieren - aktiviert , indem Sie in Open MPI --bind-to-core
oder --bind-to-socket
an mpiexec
übergeben; deaktiviert durch Setzen von I_MPI_PIN
auf disable
in Intel MPI (der Standardwert von 4.x ist das Anheften von Prozessen).
Sie können auch die Pinning-Argumente der OpenMP-Laufzeit anpassen. Für GCC/libgomp
wird die Affinität durch die Umgebungsvariable GOMP_CPU_AFFINITY gesteuert, während sie für Intel-Compiler KMP_AFFINITY . Sie können den obigen Code weiterhin verwenden, wenn die OpenMP-Laufzeit die bereitgestellte Affinitätsmaske mit der des Prozesses schneidet.
Nur der Vollständigkeit halber - Speichern, Einstellen und Wiederherstellen der Affinitätsmaske unter Windows:
%Vor%Sollte mit einer einzelnen Prozessorgruppe arbeiten (bis zu 64 logische Prozessoren).