Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
added compute timer test
[simgrid.git] / src / smpi / sample / 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 }