Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
mpi example with several combinations of point-to-point message-passing functions
[simgrid.git] / examples / smpi / smpi_traced.c
1 /* Copyright (c) 2009, 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include "mpi.h"
8 #include <stdio.h>
9
10 int main(int argc, char *argv[])
11 {
12   int rank, numprocs, i;
13
14   MPI_Init(&argc,&argv);
15   MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
16   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
17
18   //Tests: 
19   //A: 0(isend -> wait) with 1(recv)
20   int A = 1;
21   //B: 0(send) with 1(irecv -> wait)
22   int B = 1;
23   //C: 0(N * isend -> N * wait) with 1(N * recv)
24   int C = 1;
25   //D: 0(N * isend -> N * waitany) with 1(N * recv)
26   int D = 1;
27   //E: 0(N*send) with 1(N*irecv, N*wait)
28   int E = 1;
29   //F: 0(N*send) with 1(N*irecv, N*waitany)
30   int F = 1;
31   //G: 0(N* isend -> waitall) with 1(N*recv)
32   int G = 1;
33   //H: 0(N*send) with 1(N*irecv, waitall)
34   int H = 1;
35   //I: 0(2*N*send, 2*N*Irecv, Waitall) with
36   //   1(N*irecv, waitall, N*isend, N*waitany) with 
37   //   2(N*irecv, N*waitany, N*isend, waitall)
38   int I = 1;
39   //J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
40   int J = 1;
41
42   int N = 13;
43
44   int tag = 12345;
45 /////////////////////////////////////////
46 ////////////////// RANK 0
47 ///////////////////////////////////
48   if (rank == 0){
49     MPI_Request request;
50     MPI_Status status;
51     MPI_Request req[2*N];
52     MPI_Status sta[2*N];
53     int r;
54     if (A){
55       MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
56       MPI_Wait (&request, &status);
57     }
58     MPI_Barrier (MPI_COMM_WORLD);
59
60     if (B){
61       MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
62     }
63     MPI_Barrier (MPI_COMM_WORLD);
64
65     if (C){
66       for (i = 0; i < N; i++){
67         MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
68       }
69       for (i = 0; i < N; i++){
70         MPI_Wait (&req[i], &sta[i]);
71       }
72     }
73     MPI_Barrier (MPI_COMM_WORLD);
74
75     if (D){
76       for (i = 0; i < N; i++){
77         MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
78       }
79       for (i = 0; i < N; i++){
80         int completed;
81         MPI_Waitany (N, req, &completed, sta);
82       }
83     }
84     MPI_Barrier (MPI_COMM_WORLD);
85
86     if (E){
87       for (i = 0; i < N; i++){
88         MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
89       }
90     }
91     MPI_Barrier (MPI_COMM_WORLD);
92
93     if (F){
94       for (i = 0; i < N; i++){
95         MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
96       }
97     }
98     MPI_Barrier (MPI_COMM_WORLD);
99
100     if (G){
101       for (i = 0; i < N; i++){
102         MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
103       }
104       MPI_Waitall (N, req, sta);
105     }
106     MPI_Barrier (MPI_COMM_WORLD);
107
108     if (H){
109       for (i = 0; i < N; i++){
110         MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
111       }
112     }
113     MPI_Barrier (MPI_COMM_WORLD);
114
115     if (I){
116       for (i = 0; i < 2*N; i++){
117         if (i < N){
118           MPI_Send(&rank, 1, MPI_INT, 2, tag, MPI_COMM_WORLD);
119         }else{
120           MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
121         }
122       }
123       MPI_Barrier (MPI_COMM_WORLD);
124       for (i = 0; i < 2*N; i++){
125         if (i < N){
126           MPI_Irecv(&r, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
127         }else{
128           MPI_Irecv(&r, 1, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
129         }
130       }
131       MPI_Waitall (2*N, req, sta);
132     }
133     MPI_Barrier (MPI_COMM_WORLD);
134
135     if (J){
136       for (i = 0; i < N; i++){
137         MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
138       }
139       for (i = 0; i < N; i++){
140         int flag;
141         MPI_Test (&req[i], &flag, &sta[i]);
142       }
143       for (i = 0; i < N; i++){
144         MPI_Wait (&req[i], &sta[i]);
145       }
146     }
147
148 /////////////////////////////////////////
149 ////////////////// RANK 1
150 ///////////////////////////////////
151   }else if (rank == 1){
152     MPI_Request request;
153     MPI_Status status;
154     MPI_Request req[N];
155     MPI_Status sta[N];
156     int r;
157
158     if (A){
159       MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
160     }
161     MPI_Barrier (MPI_COMM_WORLD);
162
163     if (B){
164       MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
165       MPI_Wait (&request, &status);
166     }
167     MPI_Barrier (MPI_COMM_WORLD);
168
169     if (C){
170       for (i = 0; i < N; i++){
171         MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
172       }
173     }
174     MPI_Barrier (MPI_COMM_WORLD);
175
176     if (D){
177       for (i = 0; i < N; i++){
178         MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
179       }
180     }
181     MPI_Barrier (MPI_COMM_WORLD);
182
183     if (E){
184       for (i = 0; i < N; i++){
185         MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
186       }
187       for (i = 0; i < N; i++){
188         MPI_Wait (&req[i], &sta[i]);
189       }
190     }
191     MPI_Barrier (MPI_COMM_WORLD);
192
193     if (F){
194       for (i = 0; i < N; i++){
195         MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
196       }
197       for (i = 0; i < N; i++){
198         int completed;
199         MPI_Waitany (N, req, &completed, sta);
200       }
201     }
202     MPI_Barrier (MPI_COMM_WORLD);
203
204     if (G){
205       for (i = 0; i < N; i++){
206         MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
207       }
208     }
209     MPI_Barrier (MPI_COMM_WORLD);
210
211     if (H){
212       for (i = 0; i < N; i++){
213         MPI_Irecv(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
214       }
215       MPI_Waitall (N, req, sta);
216     }
217     MPI_Barrier (MPI_COMM_WORLD);
218
219     if (I){
220       for (i = 0; i < N; i++){
221         MPI_Irecv(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
222       }
223       MPI_Waitall (N, req, sta);
224
225       MPI_Barrier (MPI_COMM_WORLD);
226       for (i = 0; i < N; i++){
227         MPI_Isend(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
228       }
229       MPI_Waitall (N, req, sta);
230 //      for (i = 0; i < N; i++){
231 //        MPI_Wait (&req[i], &sta[i]);
232 //      }
233     }
234     MPI_Barrier (MPI_COMM_WORLD);
235
236     if (J){
237       for (i = 0; i < N; i++){
238         MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
239       }
240       for (i = 0; i < N; i++){
241         int flag;
242         MPI_Test (&req[i], &flag, &sta[i]);
243       }
244       for (i = 0; i < N; i++){
245         MPI_Wait (&req[i], &sta[i]);
246       }
247     }
248
249 /////////////////////////////////////////
250 ////////////////// RANK 2
251 ///////////////////////////////////
252   }else if (rank == 2){
253 //    MPI_Request request;
254 //    MPI_Status status;
255     MPI_Request req[N];
256     MPI_Status sta[N];
257     int r;
258
259     if (A) {} 
260     MPI_Barrier (MPI_COMM_WORLD);
261     if (B) {} 
262     MPI_Barrier (MPI_COMM_WORLD);
263     if (C) {} 
264     MPI_Barrier (MPI_COMM_WORLD);
265     if (D) {} 
266     MPI_Barrier (MPI_COMM_WORLD);
267     if (E) {} 
268     MPI_Barrier (MPI_COMM_WORLD);
269     if (F) {} 
270     MPI_Barrier (MPI_COMM_WORLD);
271     if (G) {} 
272     MPI_Barrier (MPI_COMM_WORLD);
273     if (H) {} 
274     MPI_Barrier (MPI_COMM_WORLD);
275     if (I){
276       for (i = 0; i < N; i++){
277         MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
278       }
279       for (i = 0; i < N; i++){
280         int completed;
281         MPI_Waitany (N, req, &completed, sta);
282       }
283       MPI_Barrier (MPI_COMM_WORLD);
284
285       for (i = 0; i < N; i++){
286         MPI_Send(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
287       }
288     }
289     MPI_Barrier (MPI_COMM_WORLD);
290     if (J){}
291   }
292   MPI_Barrier (MPI_COMM_WORLD);
293   MPI_Finalize();
294   return 0;
295 }