Funktionsübersicht . . Kollektive Operationen

Hilfesystem für den Message Passing Interface Standard MPI


MPI_Gatherv

Sammelt Daten, die in einer Prozeßgruppe verteilt sind, ein. Dabei können die einzelnen Prozesse unterschiedlich viele Elemente senden.

Syntax:

Input Parameter: Output Parameter: Anmerkungen:

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);
    ...