root/examples/ring_c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /*
   2  * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2006      Cisco Systems, Inc.  All rights reserved.
   6  *
   7  * Simple ring test program in C.
   8  */
   9 
  10 #include <stdio.h>
  11 #include "mpi.h"
  12 
  13 int main(int argc, char *argv[])
  14 {
  15     int rank, size, next, prev, message, tag = 201;
  16 
  17     /* Start up MPI */
  18 
  19     MPI_Init(&argc, &argv);
  20     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  21     MPI_Comm_size(MPI_COMM_WORLD, &size);
  22 
  23     /* Calculate the rank of the next process in the ring.  Use the
  24        modulus operator so that the last process "wraps around" to
  25        rank zero. */
  26 
  27     next = (rank + 1) % size;
  28     prev = (rank + size - 1) % size;
  29 
  30     /* If we are the "master" process (i.e., MPI_COMM_WORLD rank 0),
  31        put the number of times to go around the ring in the
  32        message. */
  33 
  34     if (0 == rank) {
  35         message = 10;
  36 
  37         printf("Process 0 sending %d to %d, tag %d (%d processes in ring)\n",
  38                message, next, tag, size);
  39         MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
  40         printf("Process 0 sent to %d\n", next);
  41     }
  42 
  43     /* Pass the message around the ring.  The exit mechanism works as
  44        follows: the message (a positive integer) is passed around the
  45        ring.  Each time it passes rank 0, it is decremented.  When
  46        each processes receives a message containing a 0 value, it
  47        passes the message on to the next process and then quits.  By
  48        passing the 0 message first, every process gets the 0 message
  49        and can quit normally. */
  50 
  51     while (1) {
  52         MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
  53                  MPI_STATUS_IGNORE);
  54 
  55         if (0 == rank) {
  56             --message;
  57             printf("Process 0 decremented value: %d\n", message);
  58         }
  59 
  60         MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
  61         if (0 == message) {
  62             printf("Process %d exiting\n", rank);
  63             break;
  64         }
  65     }
  66 
  67     /* The last process does one extra send to process 0, which needs
  68        to be received before the program can exit */
  69 
  70     if (0 == rank) {
  71         MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
  72                  MPI_STATUS_IGNORE);
  73     }
  74 
  75     /* All done */
  76 
  77     MPI_Finalize();
  78     return 0;
  79 }

/* [<][>][^][v][top][bottom][index][help] */