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 #define DATATOSENT 100000000
12 int main(int argc, char *argv[])
14 int rank, numprocs, i;
16 MPI_Init(&argc,&argv);
17 MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
18 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
21 //A: 0(isend -> wait) with 1(recv)
23 //B: 0(send) with 1(irecv -> wait)
25 //C: 0(N * isend -> N * wait) with 1(N * recv)
27 //D: 0(N * isend -> N * waitany) with 1(N * recv)
29 //E: 0(N*send) with 1(N*irecv, N*wait)
31 //F: 0(N*send) with 1(N*irecv, N*waitany)
33 //G: 0(N* isend -> waitall) with 1(N*recv)
35 //H: 0(N*send) with 1(N*irecv, waitall)
37 //I: 0(2*N*send, 2*N*Irecv, Waitall) with
38 // 1(N*irecv, waitall, N*isend, N*waitany) with
39 // 2(N*irecv, N*waitany, N*isend, waitall)
41 //J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
47 /////////////////////////////////////////
48 ////////////////// RANK 0
49 ///////////////////////////////////
55 int *r = (int*)malloc(sizeof(int)*DATATOSENT);
57 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
58 MPI_Wait (&request, &status);
60 MPI_Barrier (MPI_COMM_WORLD);
63 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
65 MPI_Barrier (MPI_COMM_WORLD);
68 for (i = 0; i < N; i++){
69 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
71 for (i = 0; i < N; i++){
72 MPI_Wait (&req[i], &sta[i]);
75 MPI_Barrier (MPI_COMM_WORLD);
78 for (i = 0; i < N; i++){
79 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
81 for (i = 0; i < N; i++){
83 MPI_Waitany (N, req, &completed, sta);
86 MPI_Barrier (MPI_COMM_WORLD);
89 for (i = 0; i < N; i++){
90 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
93 MPI_Barrier (MPI_COMM_WORLD);
96 for (i = 0; i < N; i++){
97 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
100 MPI_Barrier (MPI_COMM_WORLD);
103 for (i = 0; i < N; i++){
104 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
106 MPI_Waitall (N, req, sta);
108 MPI_Barrier (MPI_COMM_WORLD);
111 for (i = 0; i < N; i++){
112 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
115 MPI_Barrier (MPI_COMM_WORLD);
118 for (i = 0; i < 2*N; i++){
120 MPI_Send(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD);
122 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
125 MPI_Barrier (MPI_COMM_WORLD);
126 for (i = 0; i < 2*N; i++){
128 MPI_Irecv(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
130 MPI_Irecv(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
133 MPI_Waitall (2*N, req, sta);
135 MPI_Barrier (MPI_COMM_WORLD);
138 for (i = 0; i < N; i++){
139 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
141 for (i = 0; i < N; i++){
143 MPI_Test (&req[i], &flag, &sta[i]);
145 for (i = 0; i < N; i++){
146 MPI_Wait (&req[i], &sta[i]);
150 /////////////////////////////////////////
151 ////////////////// RANK 1
152 ///////////////////////////////////
153 }else if (rank == 1){
158 int *r = (int*)malloc(sizeof(int)*DATATOSENT);
161 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
163 MPI_Barrier (MPI_COMM_WORLD);
166 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
167 MPI_Wait (&request, &status);
169 MPI_Barrier (MPI_COMM_WORLD);
172 for (i = 0; i < N; i++){
173 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
176 MPI_Barrier (MPI_COMM_WORLD);
179 for (i = 0; i < N; i++){
180 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
183 MPI_Barrier (MPI_COMM_WORLD);
186 for (i = 0; i < N; i++){
187 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
189 for (i = 0; i < N; i++){
190 MPI_Wait (&req[i], &sta[i]);
193 MPI_Barrier (MPI_COMM_WORLD);
196 for (i = 0; i < N; i++){
197 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
199 for (i = 0; i < N; i++){
201 MPI_Waitany (N, req, &completed, sta);
204 MPI_Barrier (MPI_COMM_WORLD);
207 for (i = 0; i < N; i++){
208 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
211 MPI_Barrier (MPI_COMM_WORLD);
214 for (i = 0; i < N; i++){
215 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
217 MPI_Waitall (N, req, sta);
219 MPI_Barrier (MPI_COMM_WORLD);
222 for (i = 0; i < N; i++){
223 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
225 MPI_Waitall (N, req, sta);
227 MPI_Barrier (MPI_COMM_WORLD);
228 for (i = 0; i < N; i++){
229 MPI_Isend(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
231 MPI_Waitall (N, req, sta);
232 // for (i = 0; i < N; i++){
233 // MPI_Wait (&req[i], &sta[i]);
236 MPI_Barrier (MPI_COMM_WORLD);
239 for (i = 0; i < N; i++){
240 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
242 for (i = 0; i < N; i++){
244 MPI_Test (&req[i], &flag, &sta[i]);
246 for (i = 0; i < N; i++){
247 MPI_Wait (&req[i], &sta[i]);
251 /////////////////////////////////////////
252 ////////////////// RANK 2
253 ///////////////////////////////////
254 }else if (rank == 2){
255 // MPI_Request request;
256 // MPI_Status status;
259 int *r = (int*)malloc(sizeof(int)*DATATOSENT);
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 MPI_Barrier (MPI_COMM_WORLD);
278 for (i = 0; i < N; i++){
279 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
281 for (i = 0; i < N; i++){
283 MPI_Waitany (N, req, &completed, sta);
285 MPI_Barrier (MPI_COMM_WORLD);
287 for (i = 0; i < N; i++){
288 MPI_Send(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD);
291 MPI_Barrier (MPI_COMM_WORLD);
294 MPI_Barrier (MPI_COMM_WORLD);