Um die Zuweisung eines Zwischenspeichers zu vermeiden, macht es in meiner Anwendung Sinn, dass mein MPI_Recv
ein einzelnes großes Array empfängt, aber auf der sendenden Seite sind die Daten nicht zusammenhängend, und ich möchte es machen die Daten, die der Netzwerkschnittstelle zur Verfügung stehen, sobald es möglich ist, sie zu organisieren. Etwas wie folgt aus:Senden von Teil-MPI-Nachrichten
MPI_Request reqs[N];
for(/* each one of my N chunks */) {
partial_send(chunk, &reqs[chunk->idx]);
}
MPI_Waitall(N, reqs, MPI_STATUSES_IGNORE);
Oder noch besser für mich tun wie in POSIX die writev
Funktion:
/* Precalculate this. */
struct iovec iov[N];
for(/* each one of my N chunks */) {
iov[chunk->idx].iov_base = chunk->ptr;
iov[chunk->idx].iov_len = chunk->len;
}
/* Done every time I need to send. */
MPI_Request req;
chunked_send(iov, &req);
MPI_Wait(req, MPI_STATUS_IGNORE);
Ist so etwas möglich in MPI?
Sind Ihre Daten ungleichmäßig zusammenhängend, oder gibt es einen Grund, warum Sie keinen MPI-abgeleiteten Datentyp erstellen, um alle Ihre Daten auf der Sendeseite zu beschreiben? Das würde es Ihnen ermöglichen, Ihre Daten auf einmal zu senden, anstatt sich mit Teilversendungen zu befassen. – NoseKnowsAll
Es ist ein Array von nicht zusammenhängenden Doppel. – lvella
Sie können auch einen MPI-abgeleiteten Datentyp für nicht zusammenhängende Daten erstellen. Leider ist es meiner Erfahrung nach oft nicht vorteilhaft, einen solchen Datentyp über das manuelle Kopieren von Daten in einen Sendepuffer zu erstellen. Wenn Sie mehrere MPI_iSends haben, brauchen Sie auch mehrere MPI_recvs, fürchte ich. Dennoch könnten diese alle in derselben großen Anordnung mit unterschiedlichen Startpunkten empfangen werden. – haraldkl