2016-07-25 40 views
1

Ich habe einige Vektoren, die ich zwischen Prozessen mit MPI in C++ übertragen möchte. Ich habe broadcast verwendet, um die Daten ein Vektor zu einem Zeitpunkt auszutauschen, aber es scheint nicht mit der Anzahl der Prozesse gut zu skalieren. Mir wurde gesagt, dass dies daran liegt, dass ich zu viele Broadcast-Anrufe verwende und es zu viel Verzögerung verursacht, wenn die Anzahl der Prozesse zunimmt. Daher wurde mir empfohlen, alle Daten in einer Struktur zu packen und alle auf einmal zu versenden.Wie Vektoren von verschiedenen Typen in MPI mit einem Broadcast übertragen werden

Mein Problem ist, dass meine Vektoren vom Typ int und double (2 Vektoren jedes Typs) sind, und ihre Länge ist nicht zur Kompilierzeit bekannt (es ist gleich der Anzahl der Prozesse). Daher kann ich kein struct erstellen, um alle Daten zu speichern und dann das Senden mithilfe einer benutzerdefinierten MPI-Struktur (MPI_Type_create_struct) wie beschrieben here zu senden, da es erfordert, die Größen der C-Arrays zur Kompilierungszeit fest zu codieren. Ich weiß, wie man die benutzerdefinierte MPI-Struktur erstellt, aber ich kann nicht herausfinden, wie man die Daten in eine Struktur packt, um sie zu senden.

Also, gibt es eine Möglichkeit, 4 Vektoren verschiedener Typen (2 int und 2 double) zwischen Prozessen mit nur einer Sendung zu senden?

+0

MPI strukturierte Datentypen sind generisch und müssen nicht unbedingt C/C++ 'struct's entsprechen. –

+0

Das stimmt, aber wie kann ich dann die Daten tatsächlich senden? Als Beispiel könnte ich verwenden: MPI_Send (& custom_object_to_send, 1, mpi_custom_type, dest, Tag, MPI_COMM_WORLD); aber ich muss custom_object_to_send erstellen und Werte zuweisen, damit ich sie senden kann, und soweit ich das beurteilen kann, muss dies in der Sprache erstellbar sein. – nikaza

+0

Nein, das tust du nicht.Sie erstellen einfach einen MPI-Strukturtyp und geben die absolute Adresse des Anfangs jedes Arrays/Vektors als Offset an. Geben Sie dann "MPI_BOTTOM" als Datenpufferadresse im Aufruf von "MPI_Send" an. Suchen Sie einfach mit Ihrer bevorzugten Suchmaschine nach "MPI_Type_create_struct" "MPI_BOTTOM" '. –

Antwort

1

Hinweis: Die Zahlen wie "4.1.2" im MPI-Standard v3.0 auf Kapitel beziehen

Dies sollte möglich sein mit MPI_Type_create_struct (4.1.2) und ohne eine tatsächliche C- struct.

Verwenden Sie MPI_Type_vector (4.1.2), um zwei Datentypen zu erstellen. Eine für einen Vektor von int und eine für einen Vektor von double, wie Sie von vector<>::data() erhalten werden. Sie können davon ausgehen, dass vector<> die Daten fortlaufend speichert.
Sie können MPI_Type_vector mit den Größenwerten zur Laufzeit einspeisen.

Verwenden Sie nun MPI_Type_create_struct, um zwei Instanzen jedes der beiden Vektortypen zu einem einzigen Datentyp zu kombinieren, den Sie dann problemlos für die Kommunikation verwenden können.

Mit MPI_Get_address (4.1.5) können wir die MPI-freundliche Adresse einer Variablen zur Laufzeit erhalten. Sie werden das wahrscheinlich während der Konstruktion des abgeleiteten Datentyps für die virtuelle Struktur benötigen. (Lesen Sie die Hinweise an den Benutzer in der MPI-Standard auf, warum nicht Verwendung &)

Für mehr Flexibilität, lassen Sie die Zwischenvektor-Datentypen und direkt die Adressen berechnen und erstreckt sich der vector<>::data() Arrays und Futtermittel, die direkt in MPI_Type_create_struct .


Haftungsausschluss: IIRC, ich habe mehrere nicht-kontinuierliche Blöcke kontinuierlicher Daten mit einzelnen Nachrichten für das Senden dieser Ansatz erfolgreich mit (vor einiger Zeit).