Vektornutzung in MPI (C ++)

8

Ich bin neu in der MPI-Programmierung, habe gelernt, bis zur Erstellung der Abgeleiteten Datentypen durch Definition der Strukturen. Jetzt möchte ich Vector in meine Struktur aufnehmen und die Daten über den Prozess senden. für ex:

%Vor%

Nun möchte ich mit MPI die Daten in der Struktur über die Prozesse senden. Ist es mir möglich, die eingeschlossenen MPI_type_struct Vektoren zu erstellen und die Daten zu senden?

Ich habe versucht, Foren zu lesen, aber ich bin nicht in der Lage, ein klares Bild von den Antworten zu bekommen. Ich hoffe, ich würde eine klare Idee oder einen Ansatz bekommen, um die Daten zu senden

PS: Ich kann die Daten einzeln senden, aber es ist ein Overhead des Sendens der Daten unter Verwendung von MPI_Send / Recieve, wenn wir die Domäne als sehr groß betrachten (sagen wir 10000 * 10000)

    
lsk1985 30.03.2010, 15:09
quelle

5 Antworten

10

Das Definieren von Strukturen in MPI ist ein Schmerz. Ich denke, ein einfacherer Ansatz bestünde darin, die Tatsache zu nutzen, dass STL-Vektoren garantiert zusammenhängend zugewiesenen Speicher haben. Das heißt, Sie können sie wie C-Arrays behandeln, indem Sie einen Zeiger auf das erste Element erhalten.

%Vor%     
E.M. 30.03.2010 15:18
quelle
0

Ich beschreibe hier meine Lösung für ein ähnliches Problem:

Nachricht, die willkürliche Objektdiagramme übergibt?

Denken Sie daran, dass Sie benutzerdefinierte MPI-Datentypen aus vorher definierten benutzerdefinierten MPI-Datentypen erstellen können. Zum Beispiel können Sie ein Struct definieren, das das Layout und den Inhalt einer einzelnen Instanz von Structure beschreibt, und dann einen Vector aus diesen Struct-Datentypen für den gesamten Vektor von Objekten. Heck, wenn Sie mehrere solche Vektoren haben, können Sie eine dritte Abstraktionsschicht erstellen, indem Sie einen Vector Index von Vectors of Structs erstellen und dann alle mit einer einzigen Nachricht senden.

In dem oben verlinkten Post finden Sie Links zu den Beschreibungen der verschiedenen benutzerdefinierten MPI-Datentypen, die Ihnen bei der Entscheidung für den richtigen Ansatz helfen sollen.

    
suszterpatt 02.04.2010 17:46
quelle
0

Ich mache sowas wie du, und ich weiß, dass meine Prozessorarchitektur homogen ist. Ich vermeide viele Byte-Swapping und viel MPI-Packen und Entpacken mit Boost Serialisierung .

Senden:

%Vor%

Empfangen:

%Vor%     
Jim Hunziker 05.04.2010 18:48
quelle
0

Hmm ... Das Senden von C / C ++ - Struct als Datenstrom funktioniert nur, wenn sichergestellt ist, dass das Datenlayout auf allen beteiligten Rechnern genau gleich ist. Im Allgemeinen wird dies nicht funktionieren. Außerdem gibt es Leute, die argumentieren, dass das Senden einer Struktur, die als MPI-abgeleiteter Datentyp gepackt ist, +1 für die Klarheit des Codes ist und die Absicht zeigt.

    
devendra rai 05.01.2012 10:41
quelle
-2

Ich bin sicherlich kein MPI-Datenstrukturexperte, aber ich denke nicht, dass dies möglich ist. Der Grund ist, dass Sie im Grunde eine Struktur mit Zeigern zu den zu sendenden Daten haben. Alle MPI-Datentypfunktionen gehen davon aus, dass sich die zu sendenden Daten in einem zusammenhängenden Speicherbereich befinden. Wenn die Vektoren eine feste maximale Größe haben, könnten Sie

machen %Vor%

und senden Sie dann nur die Elemente, die ausgefüllt sind.

Alternativ können Sie die Daten vor dem Senden in ein Array packen und das Array senden. Sie müssten ein Profiling durchführen, um zu sehen, ob dies schneller ist als separate Sends.

    
KeithB 30.03.2010 18:51
quelle