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?
MPI strukturierte Datentypen sind generisch und müssen nicht unbedingt C/C++ 'struct's entsprechen. –
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
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" '. –