2016-05-05 17 views
0

MPI führt mein Programm mit mehreren Prozessen.Kann ich `std :: this_thread :: sleep_for()` mit einem MPI-Prozess verwenden?

Ich würde einen dieser Prozesse für eine Weile schlafen, so dass es minimale CPU verwendet.

std::this_thread::sleep_for() sieht aus wie ich will, aber das thread Bit sieht ein wenig skizzenhaft in diesem Zusammenhang.

Ist es in Ordnung, dies zu tun?

+0

Die meisten MPI-Implementierungen starten jeden Rang in einem eigenen separaten Prozess. Jeder Prozess hat mindestens einen Thread. Die Verwendung von 'this_thread' ist daher vollkommen in Ordnung, aber bedenken Sie, dass MPI oft zusätzliche Threads für den internen Gebrauch erzeugt und Sie sollten sich nicht mit ihnen anlegen (was eigentlich mit der C++ - Schnittstelle sowieso kaum möglich ist). –

+0

@HristoIliev: Ich würde dies als Antwort aufwerten. – Richard

Antwort

1

Dies ist vollkommen in Ordnung - nichts sollte abstürzen oder hängen als Folge davon.

Allerdings ist Ihre "so, dass es minimale CPU verwendet" ein wenig beunruhigend. Führen Sie mehr MPI-Prozesse aus, als Sie über Hardware-Threads verfügen, um sie auszuführen? Diese Art der Überzeichnung ist im Allgemeinen für die Leistung schrecklich und sollte vermieden werden. Die beste Leistung wird oft mit einem Prozess pro Hardwareknoten weniger als die Anzahl der Hardware-Threads, die es bietet angezeigt, damit Systemprozesse an einem beliebigen Ort ausgeführt werden können, ohne die Anwendung vorwegzunehmen.

Der Fall, wo dies gut begründet werden könnte (auf dem ich gerade veröffentlicht a paper) ist, wenn Sie einen Abschnitt Ihres Programms haben, wo Sie weniger Parallelität haben als Sie Prozesse haben. Wenn Sie auf Intel-CPUs mit Turbo Boost arbeiten, können die aktiven Prozesse durch den Leerlaufprozess tatsächlich mit einer höheren Taktfrequenz ausgeführt werden.

+0

Danke. Ich beschränke die Anzahl der aktiven MPI-Prozesse auf gleiche Hardware-Threads, aber es ist sehr praktisch, (viele) mehr Prozesse zu haben, die nicht arbeiten, aber in der Lage sind, Zwischenergebnisse der Berechnung festzuhalten. Ich habe die inaktiven Prozesse so eingestellt, dass sie ein Paar "MPI_Iprobe" + "sleep_for (50ms)" durchlaufen. – Richard

+0

@Richard, warum benutzt du nicht einfach die blockierende 'MPI_Probe' und sagst der MPI-Bibliothek, dass sie während der Abfrage der Netzwerkschnittstellen keine Busy Loops verwenden soll? Oder machst du etwas zusätzliche Arbeit in dieser 'MPI_Iprobe + sleep'-Schleife? –

+0

@HristoIliev: OpenMPI schien die 'mca'-Option, die ich gesendet habe, nicht zu erkennen. Es ist unklar, ob Intel MPI auf eine Umgebungsvariable reagiert hat. Ich habe eine neue und glorreiche Frage dazu gestellt [http://stackoverflow.com/q/37078753/752843]. – Richard