next up previous contents
Next: About this document ... Up: Ring: A User Application Previous: Overview

Source Listing

/* ring.c Copyright 1998, 1999 Sandia National Laboratories */

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

#define TIMES_AROUND 1000

int main (int argc, char* argv[])
{
  int my_node, num_nodes, other;
  int left_nbr, right_nbr;
  int ierr;
  int i;

  int token; /* pass this token around the ring of available
                processes; each time it's received, it's
                incremented */

  MPI_Status status;

  ierr = MPI_Init(&argc, &argv);
  if (ierr != MPI_SUCCESS) {
    printf("MPI initialization error\n");
  }
  
  MPI_Comm_size(MPI_COMM_WORLD, &num_nodes);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_node);

  printf("process %d: number of processes= %d\n", my_node, num_nodes);

  left_nbr  = (my_node + num_nodes - 1) % num_nodes;
  right_nbr = (my_node + 1            ) % num_nodes;

  if (my_node == 0) { /* get things started */
    token = 0;
    for (i=0; i<TIMES_AROUND; i++) {
      MPI_Send(&token, 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD);
      MPI_Recv(&token, 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &status);
      token++;
    }
    if (token == num_nodes*TIMES_AROUND) {
      printf("token= %d, matches TIMES_AROUND*num_nodes (things look ok).\n", token); 
    }
    else {
      printf("error: value of token (%d) does not match TIMES_AROUND*num_nodes (%d)!\n", token, num_nodes); 
    }
  } 
  else { /* swing your partner, yee-hah */
    for (i=0; i<TIMES_AROUND; i++) {
      MPI_Recv(&token, 1, MPI_INT, left_nbr, 0, MPI_COMM_WORLD, &status);
      token++;
      MPI_Send(&token, 1, MPI_INT, right_nbr, 0, MPI_COMM_WORLD);
    }
  }
  return 0;
}



James Otto
1999-01-26