Über zufällig erzeugten Daten werden globale Operationen (Auswahl über die Standardeingabe) ausgeführt und die Ergebnisse ausgegeben.
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#define DATA_SIZE 2 /* Der Einfachheit halber als Konstante */
int main(int argc, char *argv[]) {
int choice, i, stop=0;
int *data, *res;
int me, numprocs;
if (MPI_Init(&argc, &argv)!=MPI_SUCCESS) {
fprintf( stderr,"MPI_Init failed.\n");
}
MPI_Comm_rank(MPI_COMM_WORLD, &me);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
data=init_data();
if (me==0) {
res=malloc(DATA_SIZE*sizeof(int));
}
MPI_Barrier(MPI_COMM_WORLD);
while (!stop) {
if (me==0) {
fprintf(stderr,"\nChose global operation:\n\n");
fprintf(stderr,"1 global maximum\n2 global minimum\n");
fprintf(stderr,"3 global sum\n4 global product\n0 quit\n");
fprintf(stderr,"Your choice: ");
if (scanf("%d", &choice)!=1) {
choice=0;
}
}
MPI_Bcast(&choice,1,MPI_INT,0,MPI_COMM_WORLD);
switch (choice) {
case 1: MPI_Reduce(data, res, DATA_SIZE, MPI_INT, MPI_MAX,
0, MPI_COMM_WORLD);
break;
case 2: MPI_Reduce(data, res, DATA_SIZE, MPI_INT, MPI_MIN,
0, MPI_COMM_WORLD);
break;
case 3: MPI_Reduce(data, res, DATA_SIZE, MPI_INT, MPI_SUM,
0, MPI_COMM_WORLD);
break;
case 4: MPI_Reduce(data, res, DATA_SIZE, MPI_INT, MPI_PROD,
0, MPI_COMM_WORLD);
break;
default: stop=1;
}
if (me==0 && (!stop)) {
fprintf(stderr,"Proc %d: Result:\n(", me);
for (i=0; i<DATA_SIZE; i++) {
fprintf(stderr,"%d ", res[i]);
}
fprintf(stderr,")\n");
}
}
MPI_Finalize();
}
/* "zufällige" Daten erzeugen */
int *init_data() {
int *data;
int i, me;
div_t x;
data=malloc(DATA_SIZE*sizeof(int));
MPI_Comm_rank(MPI_COMM_WORLD, &me);
srand( me);
for (i=0; i<DATA_SIZE; i++) {
x=div(rand(), 10);
data[i]=x.rem;
}
for (i=0; i<DATA_SIZE; i++) {
fprintf(stderr,"Proc %d: %d\n", me, data[i]);
}
return data;
}
| Makefile | C-Quelltext |