C++ mit MPI-Crash durch Speicheranforderung?
-
Hallo,
ich weiß leider nicht in welches Forum ich das platzieren soll aber da ich
in C++ schreibe versuche ich es hier.Ich hab ein Minimalbeispiel erstellt welches meinen Fehler reproduziert.
Es handelt sich um ein triviales C++/MPI Programm.Das seltsame ist, dass es Abstürzt (egal ob auf einem Prozessor gestartet oder mehreren) mit der Meldung:
MPI process terminated unexpectedly Exit code -5 signaled from *** Killing remote processes...DONEDas Minimalbeispiel:
#include <iostream> #include <mpi.h> int main(int argc, char *argv[]) { int num_procs, my_id; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD,&num_procs); MPI_Comm_rank(MPI_COMM_WORLD,&my_id); if(my_id == 0) std::cout << "Starting..." << std::endl; for (int i = 0; i < 999999 ; i++) { double * test = new double[300000]; delete [] test; } if(my_id == 0) std::cout << "Finished!" << std::endl; MPI_Finalize(); return 0; }Der gleiche code ohne MPI Anweisungen und mit einem gewöhnlichen g++ compiliert läuft problemlos durch ohne Absturz.
FRAGEN:
* Ist es korrekt dass der Heap in der Schleife auch gleich wieder freigegen wird- es also nicht daran liegen dass irgendwie speicher "leaked" und die MPI Umgebung deswegen kracht?
* Ich lasse das ganze auf einem Knoten mit 16 GB Hauptspeicher laufen - nach meiner Rechnung werden pro Iteration ca. 2.29 MB angefordert und wieder freigegeben. Da der Knoten (und sein Speicher) sonst von keinem Programm benutzt werden (soll heißen es ist speicher da) kann es doch nicht sein dass diese anforderung an dem wert schuld ist... . Seltsam ist dass wenn ich das array auf "nur" 200000 setze es funktioniert.
* Woran könnte das liegen dass es kracht? Habt ihr Ideen/Vermutungen?MEINE Vermutung: Hier muss was an der MPI-Version schief laufen oder?
-
fragerzeichen schrieb:
Hallo,
ich weiß leider nicht in welches Forum ich das platzieren soll aber da ich
in C++ schreibe versuche ich es hier.Ich hab ein Minimalbeispiel erstellt welches meinen Fehler reproduziert.
Es handelt sich um ein triviales C++/MPI Programm.Das seltsame ist, dass es Abstürzt (egal ob auf einem Prozessor gestartet oder mehreren) mit der Meldung:
MPI process terminated unexpectedly Exit code -5 signaled from *** Killing remote processes...DONEDas Minimalbeispiel:
#include <iostream> #include <mpi.h> int main(int argc, char *argv[]) { int num_procs, my_id; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD,&num_procs); MPI_Comm_rank(MPI_COMM_WORLD,&my_id); if(my_id == 0) std::cout << "Starting..." << std::endl; for (int i = 0; i < 999999 ; i++) { double * test = new double[300000]; delete [] test; } if(my_id == 0) std::cout << "Finished!" << std::endl; MPI_Finalize(); return 0; }Das sieht mir richtig aus und es funktioniert bei mir auch völlig korrekt.
FRAGEN:
* Ist es korrekt dass der Heap in der Schleife auch gleich wieder freigegen wird- es also nicht daran liegen dass irgendwie speicher "leaked" und die MPI Umgebung deswegen kracht?Ja, wird sofort freigegeben.
* Ich lasse das ganze auf einem Knoten mit 16 GB Hauptspeicher laufen - nach meiner Rechnung werden pro Iteration ca. 2.29 MB angefordert und wieder freigegeben. Da der Knoten (und sein Speicher) sonst von keinem Programm benutzt werden (soll heißen es ist speicher da) kann es doch nicht sein dass diese anforderung an dem wert schuld ist... . Seltsam ist dass wenn ich das array auf "nur" 200000 setze es funktioniert.
Also ich hab's auf einem Knoten mit 12 GB Speicher laufen lassen. Funktioniert.
* Woran könnte das liegen dass es kracht? Habt ihr Ideen/Vermutungen?
MEINE Vermutung: Hier muss was an der MPI-Version schief laufen oder?Das ist wirklich überaus seltsam, besonders deine Bemerkung, das es mit 200000 läuft. Daher schließe ich mich deiner Vermutung an. Ich habe es mit OpenMPI in der neuesten(? zumindest nicht uralt) Version kompiliert und laufen lassen. Hast du Zugriff auf einen MPI Debugger? Vielleicht bekommst du damit Antworten. Da es bei mir funktioniert, bringt es wohl wenig, wenn ich bei mir debugge.
edit: Spasseshalber habe ich es mal mit wirklich vielen Prozessen gestartet, ab ca. 45 Prozessen bekomme ich Sachen wie
mpiexec noticed that process rank 3 with PID 26890 on node XXX exited on signal 9 (Killed).Das liegt natürlich daran, dass ich da die 12 GB auf meinem Knoten sprenge. Aber das macht ja auch recht wenig Sinn, da mein Knoten nur 8 physische Threads hat. Und du schreibst, dass es dir auch mit einem Prozess passiert...
-
Danke SeppJ für das ausprobieren. Ich habe mich bereits mit den Administratoren des Clusters in Verbindung gesetzt und warte jetzt auf Antwort.
Da endlich jemand auch parallelisiert hätte ich eine Frage an Dich weil du das Wort MPI-Debugger in den Mund (in die Finger) genommen hast:
Wie debuggst du parallel? Hast du eine eigene Methode ode welche Software benutzt du? Gibt es die SW auch opensource?
Danke Dir
-
Ich bin bis jetzt zum Glück davon verschont geblieben, dass ich MPI Code selber debuggen musste, da die Codebasis für die Parallelisierung die ich benutze von meinem Vorgänger geschrieben wurde. Ich kann daher MPI nur lesen. Ich weiß, dass auf einigen Maschinen, auf denen ich rechne, kommerzielle Debugger (TotalView) installiert sind, ich schätze die würde ich in dem Fall das es nötig ist dann auch benutzen.