2016-07-19 16 views
0

Ich versuche, einen Code auf einem alten Cluster auszuführen, auf dem ich keine Root-Berechtigungen habe. In meinem eigenen Ordner auf dem Hauptknoten habe ich eine lokale Kopie von neueren Versionen von gcc und OpenMPI installiert, mit denen ich meinen Code kompiliere. Als Versuch habe ich beschlossen, ein "Hallo Welt" -Programm zu schreiben und es auf dem Cluster laufen zu lassen. Dann lege ich diese Prozesse durch den PBS Drehmoment Job-Scheduler auf dem Cluster Wenn ich diesen Code alsCXX ABI Fehler beim Ausführen auf einem Cluster

mpic++ --std=c++11 -L/home/sidk/libraries/gcc/lib64 -o mpitrial mpitrial.cpp 

kompilieren wo mpitrial.cpp

int main(int argc, char *argv[]) 
{ 
    int rank=0,size=0; 
    MPI_Init(&argc,&argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&size); 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
    cout<<"Hello from "<<rank<<" of "<<size<<endl; 
    MPI_Finalize(); 
} 

ist. Jedoch kann jeder der Prozesse (die auf jedem Knoten im Cluster sein kann), wenn ausgeführt wird, senden Sie mir eine Fehlermeldung, dass:

/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /shared/users/sidk/mpitrial) 

die, dass jeder der Prozesse scheint zu sagen, ist die Verknüpfung mit älteren C++ Bibliotheken (weil Die neueren Bibliotheken befinden sich in einem Ordner/home/sidk/libraries/gcc/lib64 und nicht im oben gezeigten Pfad. Auf dem Hauptknoten habe ich LD_LIBRARY_PATH aktualisiert, um auf den Speicherort der neueren C++ - Bibliotheken zu zeigen.

Kann Ihnen jemand Ratschläge geben, wie Sie dieses Problem beheben können?

Vielen Dank für Ihre Hilfe,

Siddharth

+0

"Also habe ich eine lokale Kopie von neueren Versionen von gcc installiert" ... dann "meine Vermutung ist, dass dies daran liegt, dass jeder der Prozesse mit den alten C++ - Bibliotheken verknüpft ist".Diese beiden Aussagen widersprechen sich. Wenn Sie mit einer neuen Version von gcc kompiliert und gebaut haben, wäre die resultierende ausführbare Datei offensichtlich mit den neuen, nicht alten C++ - Bibliotheken verknüpft. Diese Frage ist verwirrend. Sie müssen es klarer machen. –

+0

Hallo, habe es bearbeitet. Ich hoffe, es ist klarer. Ich stimme zu, dass die resultierende ausführbare Datei mit den neuen C++ - Bibliotheken verknüpft werden sollte. Wenn ich es einfach mit mpirun auf dem lokalen Rechner starte, funktioniert es, aber ich bekomme den oben erwähnten Fehler, wenn ich denselben Code über einen Job-Scheduler an den Cluster sende. –

Antwort

0

Verwenden ldd auf dem binären, um sicherzustellen, dass libstdc++ aus diesem nicht-Standardpfad geladen wird.

Unter der Annahme, dass LD_LIBRARY_PATH richtig eingestellt ist, wenn ldd ausgeführt wird, gibt es nur zwei Möglichkeiten.

1) Obwohl LD_LIBRARY_PATH korrekt eingestellt ist, zeigt ldd, dass libstdc++ immer noch von lib64 geladen wird.

Der wahrscheinlichste Grund dafür ist, dass DT_RPATH auf die ausführbare Datei festgelegt ist, die auf /lib64 verweist, die LD_LIBRARY_PATH überschreibt.

Als explained here hat DT_RPATH Vorrang vor LD_LIBRARY_PATH. Aktualisieren Sie Ihr Makefile oder das von Ihnen verwendete Build-Tool, um die Erstellung der ausführbaren Datei mit dem Tag DT_RPATH zu beenden.

2) ldd, mit LD_LIBRARY_PATH, lädt libstdc++.so von dem nicht standardmäßigen Speicherort ohne Probleme. In diesem Fall sind Probleme mit dem Ausführen der ausführbaren Datei offensichtlich ein Umweltproblem. Trotz Ihrer gegenteiligen Meinung wird LD_LIBRARY_PATH zur Laufzeit nicht richtig eingestellt.

+0

Vielen Dank für Ihre Antwort. Die libstdC++ Linie vom LDD-Ausgabe ist: libstdC++ so.6 => /home/sidk/libraries/gcc/lib64/libstdc++.so.6 (0x00002b456e4e3000) , die die korrekte Lage.. Ich habe etwas über die Option --inhibit-rpath gelesen, und ich bin mir ehrlich gesagt nicht ganz sicher, wie ich das DT_RPATH-Tag deaktivieren soll. Da ich die nicht standardmäßige Version von g ++ und mpi verwende, sollte ich vielleicht die neuen Bibliotheken auf alle fernen Knoten kopieren, damit dieser Pfad auf allen fernen Knoten gültig ist? –

+0

Lesen Sie meine Antwort. Wenn 'ldd' korrekte Ergebnisse liefert, haben Sie keine Probleme mit' DT_RPATH'. –

0

Ich konnte es zum Laufen bringen. Ich habe herausgefunden, dass dieser Fehler aufgrund der Art und Weise, wie der Cluster eingerichtet wurde, aufgetreten ist - es gibt eine Unklarheit bezüglich des Stammordners und jeder Cluster hat einen Stammordner mit demselben Namen wie der Stammordner des Hauptknotens. Aus diesem Grund konnten die Rechenknoten nicht auf die neueren Bibliotheken (die sich im Stammordner des Hauptknotens befanden) zugreifen und verbanden stattdessen ihre eigene/lib64. Ich lege die benötigten Bibliotheken in den allgemeinen Scratch Space, der für alle Knoten zugänglich ist, und setze LD_LIBRARY_PATH auf diesen Ort im Submissionsskript, und es funktioniert jetzt.