Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Also include hostfile into the archive since makecheck needs that
[simgrid.git] / examples / smpi / ring_c.c
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
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   sleep(3);
52
53   while (1) {
54     MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
55              MPI_STATUS_IGNORE);
56
57     if (0 == rank) {
58       --message;
59       printf("Process 0 decremented value: %d\n", message);
60     }
61
62     MPI_Send(&message, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
63     if (0 == message) {
64       printf("Process %d exiting\n", rank);
65       break;
66     }
67   }
68
69   /* The last process does one extra send to process 0, which needs
70      to be received before the program can exit */
71
72   if (0 == rank) {
73     MPI_Recv(&message, 1, MPI_INT, prev, tag, MPI_COMM_WORLD,
74              MPI_STATUS_IGNORE);
75   }
76
77   /* All done */
78
79   MPI_Finalize();
80   return 0;
81 }