Funktionsübersicht . . Kollektive Operationen

Hilfesystem für den Message Passing Interface Standard MPI


Beispiel für die Verwendung der kollektiven Operationen MPI_Barrier, MPI_Bcast, MPI_Scatter, MPI_Gather
/* Parallele Multiplikation eines Vektors mit einem Faktor */

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#define FAKTOR 2          /* Der Einfachheit halber als Konstante */

int *vekt_init(int *size);
int *mult(int *v, int faktor, int size);

int main(argc,argv)
int  argc;
char *argv[];
{
    int     numprocs, me, i;
    int     *v, *vbuf, *res, size, vsize;
    div_t   part;

    if (MPI_Init(&argc,&argv)!=MPI_SUCCESS) {
	fprintf(stderr,"MPI_Init failed.\n");
	return -1;
    }
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &me);
    fprintf(stderr,"Proc %d: I live.\n", me, numprocs);
    if (me==0) {
	vbuf=vekt_init(&size);
	for (i=0; i<size; i++) {
	    fprintf(stderr,"%d, ", vbuf[i]);
	}
	fprintf(stderr,")\n");

        /* berechnen, wieviele Daten jeder Prozess bekommt */
        part=div(size,numprocs);
        if (part.rem!=0) {
	    vsize=part.quot+1;
        }
        else {
	    vsize=part.quot;
	}
    }
    MPI_Bcast(&vsize,1,MPI_INT,0,MPI_COMM_WORLD);
    v=malloc(vsize*sizeof(int));
    MPI_Scatter(vbuf, vsize, MPI_INT, v, vsize,
		MPI_INT, 0, MPI_COMM_WORLD);

    res=mult(v, FAKTOR, vsize);
    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Gather(res, vsize, MPI_INT, vbuf, vsize, MPI_INT, 0,
	       MPI_COMM_WORLD);
    MPI_Barrier(MPI_COMM_WORLD);
    if (me==0) {
	fprintf(stderr,"Result of multiplication:\n(");
    	for (i=0; i<size; i++) {
	    fprintf(stderr,"%d, ", vbuf[i]);
	}
	fprintf(stderr,")\n\n");
    }
    MPI_Finalize();
}

int *vekt_init(int *size) {
#define SIZE 12  
    int  i;
    int  *dummy;
     
    dummy=malloc(SIZE*sizeof(int));
    for (i=0; i<SIZE; i++) {
        dummy[i]=i+1;
    }
    *size=SIZE;
    fprintf(stderr,"\ndummy starts at: %d\n", dummy);
    return dummy;
}

int *mult(int *v, int faktor, int size) {
    int i;
    int *res;

    res=malloc(size*sizeof(int));
    for (i=0; i<size; i++) {
	res[i]=v[i]*faktor;
    }
    return res;
}


Makefile C-Quelltext