Vektor-Einsatz in MPI(C++)
Ich bin neu in die MPI-Programmierung,trotzdem zu lernen , war ich erfolgreich, bis zum erstellen von Abgeleiteten Datentypen, die von der Definition der Strukturen . Jetzt möchte ich zählen Vektor in meine Struktur und zum senden von Daten über den Prozess. für ex:
struct Structure{
//Constructor
Structure(): X(nodes),mass(nodes),ac(nodes) {
//code to calculate the mass and accelerations
}
//Destructor
Structure() {}
//Variables
double radius;
double volume;
vector<double> mass;
vector<double> area;
//and some other variables
//Methods to calculate some physical properties
Nun mittels MPI ich möchte zum senden der Daten in der Struktur, über die Prozesse. Ist es möglich für mich zu erstellen, die MPI_type_struct Vektoren enthalten, und die Daten senden?
Ich habe versucht, das Lesen durch Foren, aber ich bin nicht in der Lage, das klare Bild von der gegebenen Antworten gibt. Hoffe, dass ich in der Lage wäre, eine klare Idee oder Ansatz, Daten zu senden,
PS: ich kann senden Sie die Daten einzeln , aber seine ein overhead für das senden der Daten verwenden kann MPI_Send/Erhalten, wenn wir Bedenken, dass die domain sehr groß(sagen wir 10000*10000)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definition von Strukturen in MPI ist ein Schmerz. Ich denke, dass ein einfacher Ansatz wäre, um die Tatsache, dass die STL-Vektoren sind garantiert zusammenhängend reservierten Speicher. Das heißt, Sie können Sie behandeln wie C arrays, indem man einen Zeiger auf das erste element.
Beschreibe ich meine Lösung für ein ähnliches problem hier:
Message-Passing-Beliebigen Objekt-Graphen?
Denken Sie daran, dass Sie können benutzerdefinierte MPI-Datentypen aus prevoiusly benutzerdefinierte MPI-Datentypen. Zum Beispiel, können Sie definieren eine Struktur, die beschreibt das layout und der Inhalt einer einzelnen Instanz der Struktur, dann wird ein Vektor aus diesen Struct-Datentypen für die gesamte vector-Objekte. Heck, wenn Sie mehrere solche Vektoren, können Sie erstellen Sie eine Dritte Ebene der Abstraktion, die Schaffung eines HIndexed Datentyp aus Vektoren von Strukturen, und schicken Sie dann alle mit einer einzigen Nachricht.
In der post den ich weiter oben verlinkt finden Sie die links zu den Beschreibungen der verschiedenen custom-MPI-Datentypen, das sollte Hilfe Sie entscheiden über den richtigen Ansatz.
Ich Sachen tun, wie Sie tun, und ich weiß, dass meine Prozessor-Architektur ist in sich homogen. Ich vermeide viel byte-swapping und jede Menge MPI-Verpacken und Auspacken von mit Boost-Serialisierung.
Senden:
Empfang:
Hmm... Senden C/C++ struct als ein Strom von Daten funktioniert nur, wenn Sie garantiert, dass die Daten-layout auf allen beteiligten Maschinen ist genau das gleiche. Im Allgemeinen wird dies nicht funktionieren. Plus, es gibt Leute, die würden argumentieren, dass das versenden einer Struktur verpackt, wie ein MPI-abgeleitete Datentyp ist +1 für Klarheit des Codes und zeigen die Absicht.
Ich bin sicherlich nicht ein MPI-Daten-Struktur Experte, aber ich glaube nicht, dass dies getan werden kann. Der Grund dafür ist, dass im Grunde, Sie haben eine Struktur mit Zeigern auf die Daten gesendet werden. Alle MPI-Datentyp-Funktionen annehmen, dass die Daten, die Sie senden möchten, in einem zusammenhängenden Bereich des Speichers. Wenn die Vektoren sind, die eine Feste maximale Größe, die Sie tun könnten,
und dann senden Sie nur die Elemente, die ausgefüllt sind.
Alternativ könnte man pack die Daten selbst in einem array vor, um das senden und das array. Sie würde tun, einige Profilerstellung, um zu sehen, ob dies schneller als separates sendet.