2009-07-03 8 views
2

Ich habe ein Programm, das in C++ implementiert wurde, die ich jetzt MPI-Unterstützung hinzufügen möchte. Es gibt eine MPI-Bindung für C++, mit Namespace MPI und allem.Hinzufügen von MPI-Unterstützung zu einem C++ - Programm

In meinem Fall habe ich ein bestimmtes Objekt, das geeignet ist, der parallelisierte Prozess in den Cluster zu sein.

Meine Fragen sind:

  • Hat jemand so etwas wie dies vorher getan? Kann ich einige Ratschläge erhalten, wie dies am besten umgesetzt werden kann?
  • Wie initialisiere ich MPI im Konstruktor? Werden nach dem Initialisieren von MPI innerhalb des Konstruktors der Klasse auch alle dazwischenliegenden Aufrufe parallelisiert?

Zum Beispiel:

MyClass obj; 

x = x; //this will be parallelized ? 
onj.calc(); 

y = x++; //this will be parallelized ? 

z = obj.result(); 
+1

Vielleicht meinst du OpenMP? – tstenner

Antwort

6

ich wirklich die Gropp MPI Book Aufnehmen würde empfehlen, es hilft wirklich für grundlegende MPI!

+0

Danke die Beispiele werden sehr helfen. – lvcargnini

+0

, aber es verwendet MPI C++ - Bindungen als eine normale c-Anwendung, das ist mein Punkt. Wie das in der OO-Programmierung funktioniert – lvcargnini

+0

Die MPI-Bindungen sind einfach Methodenaufrufe, und in Wirklichkeit haben sie sehr wenig Ähnlichkeit mit der OO-Programmierung. Sie müssen sie einfach so verwenden, wie sie vorgesehen sind, Methoden, um Informationen von einem Computer zu einem anderen zu übertragen. –

7

MPI parallelisiert nichts automatisch, es gibt Ihnen nur eine Schnittstelle zum Senden von Daten zwischen Knoten. Ihr Code wird geschrieben und läuft wie gewohnt sequenziell auf jedem Knoten und ab und zu senden Sie Daten an einen anderen Knoten oder versuchen, Daten von einem anderen Knoten zu empfangen.

+0

Nicht genau es starten Sie den gleichen Prozess in N-Knoten, als die Verwendung von Nachricht teilen und aktualisieren Sie die Informationen zwischen den Knoten auch streuen und sammeln manchmal in einem bestimmten Knoten konzentriert oder Aktualisieren der Werte in allen Knoten, was so genannte Reduktion. Mein Punkt ist, wie sich das in OO verhalten wird? Das Objekt wird nur parallelisiert? Also werden die MPI-Aufrufe innerhalb des Objekts nur innerhalb des Objekts angezeigt? oder ist die Umgebung außerhalb des Objekts ebenfalls betroffen? - lvcargnini vor 15 Minuten – lvcargnini

+0

Was wäre der Sinn, den gleichen genauen Prozess auf verschiedenen Knoten zu erstellen, ohne neue Daten auszugeben ??? Die MPIs, die ich gesehen habe, sind für eine C-Umgebung oder FORTRAN geschrieben ... es gibt keine OOP für MPI in diesen Implementierungen, also bin ich nicht sicher, warum Sie nach OOP fragen ... wenn Sie MPI-Code in eine Methode einfügen Für eine Klasse wird der MPI-Code aufgerufen, wenn diese Methode ausgeführt wird, genau wie jeder andere Code, den Sie in die Methode einfügen würden. –

3

Als Hintergrundinformation:

meisten Anwendungen, die MPI verwenden in Fortran oder C. Jede größere Implementierung von MPI geschrieben werden, ist in C geschrieben

Unterstützung für MPI C++ Bindungen ist bestenfalls lückenhaft: Einige die MPI-Datentypen sind nicht verfügbar (zB MPI_DOUBLE), es gibt Probleme mit I/O und die Reihenfolge, dass Header in den Quelldateien enthalten sind. Wenn die MPI-Bibliothek mit C erstellt wurde und wenn die Anwendung mit Fortran oder C++ erstellt wird, gibt es Probleme des Namens Mangling. mpich2 FAQ hat Einträge, die Ihnen helfen sollen, diese Probleme zu lösen. Ich bin mit Open MPI und seinem besonderen Verhalten mit Fortran und C++ weniger vertraut.

Für Ihre spezifische Fragen:

Ich denke, dass Sie ein grundlegendes Fehl Verständnis darüber, was MPI ist und nicht ist, und wie Anwendungscode mit den MPI-Bibliotheken interagieren soll.

Parallel Programming with MPI ist eine ausgezeichnete Referenz für das Lernen mit MPI zu programmieren. Die Codebeispiele sind in C und die meisten MPI-APIs sind in einem Beispiel dargestellt. Ich empfehle dringend, dass Sie dieses Buch durcharbeiten, um zu lernen, was paralleles Programmieren ist und was nicht.

+0

+1 für das grundsätzliche Missverständnis. –

+0

Ich habe zwei verschiedene E-Mails in einer anderen Liste erhalten: "MPI hat selbst einen objektorientierten Entwurf, daher sollte das kein Problem sein. Ich würde Sie davon abraten, die C++ - Bindungen zu verwenden, da sie (meines Wissens) entfernt werden von MPI 3.0 (es gibt einen solchen Vorschlag). " "Es gibt einen Vorschlag, der bisher eine Stimme abgegeben hat, um die C++ - Bindungen in MPI-2.2 abzulehnen (was bedeutet: habe sie noch, rate aber davon ab, sie zu verwenden). Dies öffnet die Tür für das potentielle Entfernen der C++ - Bindungen in MPI-. 3.0. " – lvcargnini

+0

Ich würde mir über MPI 3.0 noch nicht zu viele Gedanken machen. Erstens gibt es kein festes Veröffentlichungsdatum für 3.0. Zweitens werden alle wichtigen Implementierungen von MPI den Standard 2.0 für eine lange Zeit unterstützen, um ihren Benutzern/Kunden einen einfachen Übergang zu ermöglichen. Als Fallback können Sie immer eine Kopie der letzten MPI-Version, die den 2.0-Standard unterstützt, für die verbleibende Lebensdauer Ihrer Anwendung abholen. –

6

Chiming in einem alten Thread, fand ich OpenMPI und Boost::MPI schön, mit zu arbeiten. Das objektorientierte Design der Bibliothek mag ein bisschen angeschraubt sein, aber ich fand es viel schöner, mit reinem MPI zu arbeiten, insbesondere mit automatischer Serialisierung vieler Typen und einer eher erweiterbaren Schnittstelle für Sammel-/Verkleinerungsfunktionen sowie Serialisierung von Benutzertypen.

Verwandte Themen