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.
7 * Simple ring test program
13 int main(int argc, char *argv[])
15 int rank, size, next, prev, message, tag = 201;
19 MPI_Init(&argc, &argv);
20 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
21 MPI_Comm_size(MPI_COMM_WORLD, &size);
23 /* Calculate the rank of the next process in the ring. Use the
24 modulus operator so that the last process "wraps around" to
27 next = (rank + 1) % size;
28 prev = (rank + size - 1) % size;
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
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);
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. */
54 MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
59 printf("Process 0 decremented value: %d\n", message);
62 MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
64 printf("Process %d exiting\n", rank);
69 /* The last process does one extra send to process 0, which needs
70 to be received before the program can exit */
73 MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,