Funktionsübersicht
. .
Kollektive Operationen
Hilfesystem für den Message Passing Interface Standard MPI
MPI_Scatterv
Verteilt Daten vom Prozeß 'root' unter alle anderen Prozesse in
der Gruppe. Dabei können die einzelnen Prozesse unterschiedlich viele Elemente
erhalten.
Syntax:
MPI_Scatterv(sendbuf, sendcnts, displs, sendtype, recvbuf, recvcnt,
recvtype, root, comm)
Input Parameter:
sendbuf - Anfangsadresse des Sendepuffers (Wert ist
lediglich für 'root' signifikant)
sendcnts - Anzahl der zu sendenden Elemente (array of integer)
sendcnts[i] gibt an, wieviele Elemente an den Prozeß i zu schicken sind. Das
Feld muß soviele Einträge haben wie Prozesse in der Gruppe comm sind.
displs - Displacement relativ zu sendbuf (array of integer)
displs[i] gibt an, von wo die Daten an Prozeß i zu schicken sind. Die
Feldgröße muß wieder der Zahl der Prozesse in der Gruppe entsprechen.
sendtype - Datentyp der Elemente in sendbuf (handle)
recvcnt - Anzahl der Elemente im Empfangspuffer (integer)
recvtype - Datentyp der Elemente des Empfangspuffers (handle)
root - Rang des Prozesses in comm, der die Daten versendet
(integer)
comm - Kommunikator (handle)
Output Parameter:
recvbuf - Anfangsadresse des Empfangsbuffers
Aufruf:
Annahme für das Beispiel: man hat 10 Prozesse und sendbuf sei eine 10x10
Matrix beim Prozeß 0.
Die obere Dreiecksmatrix soll zeilenweise an alle 10 Prozesse verteilt werden.
#include "mpi.h"
...
#define ROOT 0
#define MAXX 10
#define MAXY 10
int myid, numprocs, i, offset;
int *counts, *displs;
void *sendbuf, *recvbuf;
MPI_Comm comm;
MPI_Datatype recvtype;
...
MPI_Comm_size(comm, &numprocs);
MPI_Comm_rank(comm, &myid);
...
counts=(* int)malloc(numprocs*sizeof(int));
displs=(* int)malloc(numprocs*sizeof(int));
offset=0;
for (i=0; i<numprocs; i++) {
counts[i]=MAXX-i;
displs[i]=offset;
offset =offset+MAXX;
}
MPI_Scatterv(sendbuf, counts, displs, MPI_INT,
recvbuf, count[myid], recvtype,
ROOT, comm);
...