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.gifint getValue(int rank, int value){
InBlock.gif  return value;
InBlock.gif}
InBlock.gif
InBlock.gifint 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}