Funktionsübersicht . . Kollektive Operationen

Hilfesystem für den Message Passing Interface Standard MPI


Beispiel für die Anwendung von MPI_Allreduce

Über zufällig erzeugten Daten werden globale Operationen (Auswahl über die Standardeingabe) ausgeführt, die Ergebnisse werden von jedem Prozeß ausgegeben.



#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

#define  DATA_SIZE 2

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();
    res=malloc(DATA_SIZE*sizeof(int));
    while (!stop) {
        MPI_Barrier(MPI_COMM_WORLD);
        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_Allreduce(data, res, DATA_SIZE, MPI_INT, 
                              MPI_MAX, MPI_COMM_WORLD); 
                break;
        case 2: MPI_Allreduce(data, res, DATA_SIZE, MPI_INT, 
                              MPI_MIN, MPI_COMM_WORLD);
                break;
        case 3: MPI_Allreduce(data, res, DATA_SIZE, MPI_INT, 
                              MPI_SUM, MPI_COMM_WORLD);
                break;
        case 4: MPI_Allreduce(data, res, DATA_SIZE, MPI_INT, 
                              MPI_PROD, MPI_COMM_WORLD);
                break;
        default: stop=1;
        }
	if (!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