OpenMP und MPI-Hybridprogramm

8

Ich habe eine Maschine mit 8 Prozessoren. Ich möchte mit OpenMP und MPI auf meinen Code wie folgt alternieren:

OpenMP-Phase:

  • Ränge 1-7 warten auf eine MPI_Barrier
  • Rang 0 verwendet alle 8 Prozessoren mit OpenMP

MPI-Phase:

  • Rang 0 erreicht Barriere und alle Ränge verwenden jeweils einen Prozessor

Bisher habe ich getan:

  • setze I_MPI_WAIT_MODE 1 so, dass die Ränge 1-7 die CPU nicht benutzen, während sie sich auf der Barriere befinden.
  • setze omp_set_num_threads (8) auf Rang 0, so dass 8 OpenMP-Threads gestartet werden.

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.

    
Italo 30.10.2012, 17:30
quelle

2 Antworten

0

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.

    
Italo 01.11.2012, 18:42
quelle
13

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).

%Vor%

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).

    
Hristo Iliev 30.10.2012 18:14
quelle

Tags und Links