1 /* Copyright (c) 2009, 2010. The SimGrid Team.
2 * All rights reserved. */
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. */
10 int main(int argc, char *argv[])
12 int rank, numprocs, i;
14 MPI_Init(&argc,&argv);
15 MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
16 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
19 //A: 0(isend -> wait) with 1(recv)
21 //B: 0(send) with 1(irecv -> wait)
23 //C: 0(N * isend -> N * wait) with 1(N * recv)
25 //D: 0(N * isend -> N * waitany) with 1(N * recv)
27 //E: 0(N*send) with 1(N*irecv, N*wait)
29 //F: 0(N*send) with 1(N*irecv, N*waitany)
31 //G: 0(N* isend -> waitall) with 1(N*recv)
33 //H: 0(N*send) with 1(N*irecv, waitall)
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)
39 //J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
45 /////////////////////////////////////////
46 ////////////////// RANK 0
47 ///////////////////////////////////
55 MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
56 MPI_Wait (&request, &status);
58 MPI_Barrier (MPI_COMM_WORLD);
61 MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
63 MPI_Barrier (MPI_COMM_WORLD);
66 for (i = 0; i < N; i++){
67 MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
69 for (i = 0; i < N; i++){
70 MPI_Wait (&req[i], &sta[i]);
73 MPI_Barrier (MPI_COMM_WORLD);
76 for (i = 0; i < N; i++){
77 MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
79 for (i = 0; i < N; i++){
81 MPI_Waitany (N, req, &completed, sta);
84 MPI_Barrier (MPI_COMM_WORLD);
87 for (i = 0; i < N; i++){
88 MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
91 MPI_Barrier (MPI_COMM_WORLD);
94 for (i = 0; i < N; i++){
95 MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
98 MPI_Barrier (MPI_COMM_WORLD);
101 for (i = 0; i < N; i++){
102 MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
104 MPI_Waitall (N, req, sta);
106 MPI_Barrier (MPI_COMM_WORLD);
109 for (i = 0; i < N; i++){
110 MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
113 MPI_Barrier (MPI_COMM_WORLD);
116 for (i = 0; i < 2*N; i++){
118 MPI_Send(&rank, 1, MPI_INT, 2, tag, MPI_COMM_WORLD);
120 MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
123 MPI_Barrier (MPI_COMM_WORLD);
124 for (i = 0; i < 2*N; i++){
126 MPI_Irecv(&r, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
128 MPI_Irecv(&r, 1, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
131 MPI_Waitall (2*N, req, sta);
133 MPI_Barrier (MPI_COMM_WORLD);
136 for (i = 0; i < N; i++){
137 MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
139 for (i = 0; i < N; i++){
141 MPI_Test (&req[i], &flag, &sta[i]);
143 for (i = 0; i < N; i++){
144 MPI_Wait (&req[i], &sta[i]);
148 /////////////////////////////////////////
149 ////////////////// RANK 1
150 ///////////////////////////////////
151 }else if (rank == 1){
159 MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
161 MPI_Barrier (MPI_COMM_WORLD);
164 MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
165 MPI_Wait (&request, &status);
167 MPI_Barrier (MPI_COMM_WORLD);
170 for (i = 0; i < N; i++){
171 MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
174 MPI_Barrier (MPI_COMM_WORLD);
177 for (i = 0; i < N; i++){
178 MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
181 MPI_Barrier (MPI_COMM_WORLD);
184 for (i = 0; i < N; i++){
185 MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
187 for (i = 0; i < N; i++){
188 MPI_Wait (&req[i], &sta[i]);
191 MPI_Barrier (MPI_COMM_WORLD);
194 for (i = 0; i < N; i++){
195 MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
197 for (i = 0; i < N; i++){
199 MPI_Waitany (N, req, &completed, sta);
202 MPI_Barrier (MPI_COMM_WORLD);
205 for (i = 0; i < N; i++){
206 MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
209 MPI_Barrier (MPI_COMM_WORLD);
212 for (i = 0; i < N; i++){
213 MPI_Irecv(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
215 MPI_Waitall (N, req, sta);
217 MPI_Barrier (MPI_COMM_WORLD);
220 for (i = 0; i < N; i++){
221 MPI_Irecv(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
223 MPI_Waitall (N, req, sta);
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]);
229 MPI_Waitall (N, req, sta);
230 // for (i = 0; i < N; i++){
231 // MPI_Wait (&req[i], &sta[i]);
234 MPI_Barrier (MPI_COMM_WORLD);
237 for (i = 0; i < N; i++){
238 MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
240 for (i = 0; i < N; i++){
242 MPI_Test (&req[i], &flag, &sta[i]);
244 for (i = 0; i < N; i++){
245 MPI_Wait (&req[i], &sta[i]);
249 /////////////////////////////////////////
250 ////////////////// RANK 2
251 ///////////////////////////////////
252 }else if (rank == 2){
253 // MPI_Request request;
254 // MPI_Status status;
260 MPI_Barrier (MPI_COMM_WORLD);
262 MPI_Barrier (MPI_COMM_WORLD);
264 MPI_Barrier (MPI_COMM_WORLD);
266 MPI_Barrier (MPI_COMM_WORLD);
268 MPI_Barrier (MPI_COMM_WORLD);
270 MPI_Barrier (MPI_COMM_WORLD);
272 MPI_Barrier (MPI_COMM_WORLD);
274 MPI_Barrier (MPI_COMM_WORLD);
276 for (i = 0; i < N; i++){
277 MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
279 for (i = 0; i < N; i++){
281 MPI_Waitany (N, req, &completed, sta);
283 MPI_Barrier (MPI_COMM_WORLD);
285 for (i = 0; i < N; i++){
286 MPI_Send(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
289 MPI_Barrier (MPI_COMM_WORLD);
292 MPI_Barrier (MPI_COMM_WORLD);