InBlock.gif#include<stdio.h>
InBlock.gif#include<mpi.h>
InBlock.gif#define MAX 10000
InBlock.gif /***************************************************
InBlock.gifmpicc -o reduce reduce.c
InBlock.gifmpirun -np 10 reduce
InBlock.gifint    MPI_Reduce(
InBlock.gif  void     *sendBuf;
InBlock.gif  void     *receiveBuf;
InBlock.gif  int             count;
InBlock.gif  MPI_Datatype    dataType;    //e.g., MPI_INT
InBlock.gif  MPI_Op    operator;     //e.g., MPI_SUM
InBlock.gif  int    root;         // root process
InBlock.gif  MPI_Comm  comm
InBlock.gif)
InBlock.gif***************************************************/

InBlock.gif int getValue( int rank, int value){
InBlock.gif   return value;
InBlock.gif}
InBlock.gif
InBlock.gif int main( int argc, char *argv[]){
InBlock.gif   int numTasks, rank, rc;
InBlock.gif    
InBlock.gif  rc = MPI_Init(&argc, &argv);
InBlock.gif   if(rc != MPI_SUCCESS) {
InBlock.gif    printf( "Error Starting MPI program. Terminating.\n");
InBlock.gif    MPI_Abort(MPI_COMM_WORLD, rc);     //errorCode
InBlock.gif  }
InBlock.gif    
InBlock.gif  MPI_Barrier(MPI_COMM_WORLD);
InBlock.gif   double wallTime1 = MPI_Wtime(); //
InBlock.gif   double precision = MPI_Wtick(); //wallTime's precision
InBlock.gif
InBlock.gif  MPI_Comm_size(MPI_COMM_WORLD, &numTasks); //get from -np    
InBlock.gif  MPI_Comm_rank(MPI_COMM_WORLD, &rank); //each process's ID
InBlock.gif                
InBlock.gif         int i, globalSolutions, localSolutions = 0;
InBlock.gif   for(i = rank; i < MAX; i += numTasks){           //interleave data distribution
InBlock.gif    localSolutions += getValue(rank, i);
InBlock.gif  }
InBlock.gif    
InBlock.gif  MPI_Reduce(&localSolutions, &globalSolutions, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);        
InBlock.gif    
InBlock.gif  printf( "Process %d is done.\n", rank);
InBlock.gif  fflush(stdout);
InBlock.gif    
InBlock.gif   double wallTime2 = MPI_Wtime();
InBlock.gif    
InBlock.gif   if(rank == 0){     // if(!rank)
InBlock.gif    printf( "argc = %d\n", argc);
InBlock.gif     int i;
InBlock.gif     for(i = 0; i < argc; i++)
InBlock.gif      printf( "argv[%d] = %s\n", i, argv[i]);
InBlock.gif
InBlock.gif    printf( "elapsedTime = %f, precision = %f\n", wallTime2 - wallTime1, precision);
InBlock.gif                printf( "globalSolutions = %d\n", globalSolutions);
InBlock.gif  }
InBlock.gif    
InBlock.gif  MPI_Finalize();
InBlock.gif   return 0;
InBlock.gif}