2

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?

+0

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

+0

Es ist ein Array von nicht zusammenhängenden Doppel. – lvella

+1

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

Antwort

0

Ich mag würde einfach sagen, aber nicht, wie ich bin Überlauf zu stapeln und haben nicht genügend Ruf ...

Wenn alle Ihre Stücke auf regelmäßige Grenzen ausgerichtet sind (zB sie sind Zeiger in ein größeres zusammenhängendes Array), dann sollten Sie MPI_Type_indexed verwenden, wobei die Verschiebungen und Zählungen alle in Vielfachen des Grundtyps gemessen werden (hier ist es MPI_DOUBLE, denke ich). Wenn die Chunks jedoch zum Beispiel einzeln malloc'd sind und es keine Garantie für die Ausrichtung gibt, dann müssen Sie einen allgemeineren MPI_Type_create_struct verwenden, der Verschiebungen in Bytes angibt (und auch einen anderen Typ für jeden Block erlaubt, den Sie nicht verwenden) brauche ich nicht).

Ich war besorgt, dass Sie einige Sortierung tun müssen, um sicherzustellen, dass Sie linear durch den Speicher scannen, so dass die Verschiebungen nie rückwärts gehen (d. H. Sie sind "monoton nicht abnehmend"). Ich glaube jedoch, dass dies nur eine Einschränkung ist, wenn Sie die Typen für Datei-IO mit MPI-IO anstatt für Punkt-zu-Punkt-Senden/Empfangen verwenden.