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. */
9 #include "instr/instr.h"
11 #define DATATOSENT 100000000
13 int main(int argc, char *argv[])
15 int rank, numprocs, i;
17 MPI_Init(&argc,&argv);
18 MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
19 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
22 //A: 0(isend -> wait) with 1(recv)
24 //B: 0(send) with 1(irecv -> wait)
26 //C: 0(N * isend -> N * wait) with 1(N * recv)
28 //D: 0(N * isend -> N * waitany) with 1(N * recv)
30 //E: 0(N*send) with 1(N*irecv, N*wait)
32 //F: 0(N*send) with 1(N*irecv, N*waitany)
34 //G: 0(N* isend -> waitall) with 1(N*recv)
36 //H: 0(N*send) with 1(N*irecv, waitall)
38 //I: 0(2*N*send, 2*N*Irecv, Waitall) with
39 // 1(N*irecv, waitall, N*isend, N*waitany) with
40 // 2(N*irecv, N*waitany, N*isend, waitall)
42 //J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
48 /////////////////////////////////////////
49 ////////////////// RANK 0
50 ///////////////////////////////////
56 int *r = (int*)malloc(sizeof(int)*DATATOSENT);
58 TRACE_smpi_set_category ("A");
59 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
60 MPI_Wait (&request, &status);
62 MPI_Barrier (MPI_COMM_WORLD);
65 TRACE_smpi_set_category ("B");
66 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
68 MPI_Barrier (MPI_COMM_WORLD);
71 TRACE_smpi_set_category ("C");
72 for (i = 0; i < N; i++){
73 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
75 for (i = 0; i < N; i++){
76 MPI_Wait (&req[i], &sta[i]);
79 MPI_Barrier (MPI_COMM_WORLD);
82 TRACE_smpi_set_category ("D");
83 for (i = 0; i < N; i++){
84 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
86 for (i = 0; i < N; i++){
88 MPI_Waitany (N, req, &completed, sta);
91 MPI_Barrier (MPI_COMM_WORLD);
94 TRACE_smpi_set_category ("E");
95 for (i = 0; i < N; i++){
96 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
99 MPI_Barrier (MPI_COMM_WORLD);
102 TRACE_smpi_set_category ("F");
103 for (i = 0; i < N; i++){
104 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
107 MPI_Barrier (MPI_COMM_WORLD);
110 TRACE_smpi_set_category ("G");
111 for (i = 0; i < N; i++){
112 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
114 MPI_Waitall (N, req, sta);
116 MPI_Barrier (MPI_COMM_WORLD);
119 TRACE_smpi_set_category ("H");
120 for (i = 0; i < N; i++){
121 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
124 MPI_Barrier (MPI_COMM_WORLD);
127 TRACE_smpi_set_category ("I");
128 for (i = 0; i < 2*N; i++){
130 MPI_Send(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD);
132 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
135 MPI_Barrier (MPI_COMM_WORLD);
136 for (i = 0; i < 2*N; i++){
138 MPI_Irecv(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
140 MPI_Irecv(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
143 MPI_Waitall (2*N, req, sta);
145 MPI_Barrier (MPI_COMM_WORLD);
148 TRACE_smpi_set_category ("J");
149 for (i = 0; i < N; i++){
150 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
152 for (i = 0; i < N; i++){
154 MPI_Test (&req[i], &flag, &sta[i]);
156 for (i = 0; i < N; i++){
157 MPI_Wait (&req[i], &sta[i]);
161 /////////////////////////////////////////
162 ////////////////// RANK 1
163 ///////////////////////////////////
164 }else if (rank == 1){
169 int *r = (int*)malloc(sizeof(int)*DATATOSENT);
172 TRACE_smpi_set_category ("A");
173 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
175 MPI_Barrier (MPI_COMM_WORLD);
178 TRACE_smpi_set_category ("B");
179 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
180 MPI_Wait (&request, &status);
182 MPI_Barrier (MPI_COMM_WORLD);
185 TRACE_smpi_set_category ("C");
186 for (i = 0; i < N; i++){
187 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
190 MPI_Barrier (MPI_COMM_WORLD);
193 TRACE_smpi_set_category ("D");
194 for (i = 0; i < N; i++){
195 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
198 MPI_Barrier (MPI_COMM_WORLD);
201 TRACE_smpi_set_category ("E");
202 for (i = 0; i < N; i++){
203 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
205 for (i = 0; i < N; i++){
206 MPI_Wait (&req[i], &sta[i]);
209 MPI_Barrier (MPI_COMM_WORLD);
212 TRACE_smpi_set_category ("F");
213 for (i = 0; i < N; i++){
214 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
216 for (i = 0; i < N; i++){
218 MPI_Waitany (N, req, &completed, sta);
221 MPI_Barrier (MPI_COMM_WORLD);
224 TRACE_smpi_set_category ("G");
225 for (i = 0; i < N; i++){
226 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
229 MPI_Barrier (MPI_COMM_WORLD);
232 TRACE_smpi_set_category ("H");
233 for (i = 0; i < N; i++){
234 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
236 MPI_Waitall (N, req, sta);
238 MPI_Barrier (MPI_COMM_WORLD);
241 TRACE_smpi_set_category ("I");
242 for (i = 0; i < N; i++){
243 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
245 MPI_Waitall (N, req, sta);
247 MPI_Barrier (MPI_COMM_WORLD);
248 for (i = 0; i < N; i++){
249 MPI_Isend(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
251 MPI_Waitall (N, req, sta);
252 // for (i = 0; i < N; i++){
253 // MPI_Wait (&req[i], &sta[i]);
256 MPI_Barrier (MPI_COMM_WORLD);
259 TRACE_smpi_set_category ("J");
260 for (i = 0; i < N; i++){
261 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
263 for (i = 0; i < N; i++){
265 MPI_Test (&req[i], &flag, &sta[i]);
267 for (i = 0; i < N; i++){
268 MPI_Wait (&req[i], &sta[i]);
272 /////////////////////////////////////////
273 ////////////////// RANK 2
274 ///////////////////////////////////
275 }else if (rank == 2){
276 // MPI_Request request;
277 // MPI_Status status;
280 int *r = (int*)malloc(sizeof(int)*DATATOSENT);
283 MPI_Barrier (MPI_COMM_WORLD);
285 MPI_Barrier (MPI_COMM_WORLD);
287 MPI_Barrier (MPI_COMM_WORLD);
289 MPI_Barrier (MPI_COMM_WORLD);
291 MPI_Barrier (MPI_COMM_WORLD);
293 MPI_Barrier (MPI_COMM_WORLD);
295 MPI_Barrier (MPI_COMM_WORLD);
297 MPI_Barrier (MPI_COMM_WORLD);
299 TRACE_smpi_set_category ("I");
300 for (i = 0; i < N; i++){
301 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
303 for (i = 0; i < N; i++){
305 MPI_Waitany (N, req, &completed, sta);
307 MPI_Barrier (MPI_COMM_WORLD);
309 for (i = 0; i < N; i++){
310 MPI_Send(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD);
313 MPI_Barrier (MPI_COMM_WORLD);
316 MPI_Barrier (MPI_COMM_WORLD);