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;
}