-/*
- * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
- * University Research and Technology
- * Corporation. All rights reserved.
- * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
- *
- * Simple ring test program
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <mpi.h>
-
-int main(int argc, char *argv[])
-{
- int rank, size, next, prev, message, tag = 201;
-
- /* Start up MPI */
-
- MPI_Init(&argc, &argv);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
-
- /* Calculate the rank of the next process in the ring. Use the
- modulus operator so that the last process "wraps around" to
- rank zero. */
-
- next = (rank + 1) % size;
- prev = (rank + size - 1) % size;
-
- /* If we are the "master" process (i.e., MPI_COMM_WORLD rank 0),
- put the number of times to go around the ring in the
- message. */
-
- if (0 == rank) {
- message = 10;
-
- printf("Process 0 sending %d to %d, tag %d (%d processes in ring)\n",
- message, next, tag, size);
- MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
- printf("Process 0 sent to %d\n", next);
- }
-
- /* Pass the message around the ring. The exit mechanism works as
- follows: the message (a positive integer) is passed around the
- ring. Each time it passes rank 0, it is decremented. When
- each processes receives a message containing a 0 value, it
- passes the message on to the next process and then quits. By
- passing the 0 message first, every process gets the 0 message
- and can quit normally. */
-
- sleep(3);
-
- while (1) {
- MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
- MPI_STATUS_IGNORE);
-
- if (0 == rank) {
- --message;
- printf("Process 0 decremented value: %d\n", message);
- }
-
- MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
- if (0 == message) {
- printf("Process %d exiting\n", rank);
- break;
- }
- }
-
- /* The last process does one extra send to process 0, which needs
- to be received before the program can exit */
-
- if (0 == rank) {
- MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
- MPI_STATUS_IGNORE);
- }
-
- /* All done */
-
- MPI_Finalize();
- return 0;
-}