Syntax:
Im Empfangspuffer werden die Daten in der Reihenfolge der Ränge der Prozesse in der Gruppe abgelegt; dh. zuerst die von Prozeß 0, dann von Prozeß 1 usw. Der Programmierer ist selbst dafür verantwortlich, daß ein Puffer von ausreichender Größe vorhanden ist.
Aufruf:
Vorausgesetzt werden im Beispiel MAXY Prozesse und eine Matrix MAXX mal MAXY. Jeder Prozeß berechnet eine Zeile der oberen Dreiecksmatrix. Als sendtype und recvtype könnte man sich der Einfachheit halber MPI_INT vorstellen. Die Resultate werden beim Prozeß 0 gesammelt.
#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 sendtype, recvtype;
...
MPI_Comm_size(comm, &numprocs);
MPI_Comm_rank(comm, &myid);
...
counts =(* int)malloc(numprocs*sizeof(int));
displs =(* int)malloc(numprocs*sizeof(int));
if (myid==ROOT) {
recvbuf=(int *)calloc(MAXX*MAXY, sizeof(int));
...
}
offset=0;
for (i=0; i<numprocs; i++) {
counts[i]=MAXX-i;
displs[i]=offset;
offset =offset+MAXX;
}
MPI_Gatherv(sendbuf, counts[myid], sendtype,
recvbuf, counts, displs, recvtype,
ROOT, comm);
...