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 100000
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 ///////////////////////////////////
54 MPI_Request req[2 * N];
55 MPI_Status sta[2 * N];
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,
141 MPI_Irecv(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD,
145 MPI_Waitall(2 * N, req, sta);
147 MPI_Barrier(MPI_COMM_WORLD);
150 TRACE_smpi_set_category("J");
151 for (i = 0; i < N; i++) {
152 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
154 for (i = 0; i < N; i++) {
156 MPI_Test(&req[i], &flag, &sta[i]);
158 for (i = 0; i < N; i++) {
159 MPI_Wait(&req[i], &sta[i]);
162 /////////////////////////////////////////
163 ////////////////// RANK 1
164 ///////////////////////////////////
165 } else if (rank == 1) {
170 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
173 TRACE_smpi_set_category("A");
174 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
176 MPI_Barrier(MPI_COMM_WORLD);
179 TRACE_smpi_set_category("B");
180 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
181 MPI_Wait(&request, &status);
183 MPI_Barrier(MPI_COMM_WORLD);
186 TRACE_smpi_set_category("C");
187 for (i = 0; i < N; i++) {
188 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
191 MPI_Barrier(MPI_COMM_WORLD);
194 TRACE_smpi_set_category("D");
195 for (i = 0; i < N; i++) {
196 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
199 MPI_Barrier(MPI_COMM_WORLD);
202 TRACE_smpi_set_category("E");
203 for (i = 0; i < N; i++) {
204 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
206 for (i = 0; i < N; i++) {
207 MPI_Wait(&req[i], &sta[i]);
210 MPI_Barrier(MPI_COMM_WORLD);
213 TRACE_smpi_set_category("F");
214 for (i = 0; i < N; i++) {
215 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
217 for (i = 0; i < N; i++) {
219 MPI_Waitany(N, req, &completed, sta);
222 MPI_Barrier(MPI_COMM_WORLD);
225 TRACE_smpi_set_category("G");
226 for (i = 0; i < N; i++) {
227 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
230 MPI_Barrier(MPI_COMM_WORLD);
233 TRACE_smpi_set_category("H");
234 for (i = 0; i < N; i++) {
235 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
237 MPI_Waitall(N, req, sta);
239 MPI_Barrier(MPI_COMM_WORLD);
242 TRACE_smpi_set_category("I");
243 for (i = 0; i < N; i++) {
244 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
246 MPI_Waitall(N, req, sta);
248 MPI_Barrier(MPI_COMM_WORLD);
249 for (i = 0; i < N; i++) {
250 MPI_Isend(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
252 MPI_Waitall(N, req, sta);
253 // for (i = 0; i < N; i++){
254 // MPI_Wait (&req[i], &sta[i]);
257 MPI_Barrier(MPI_COMM_WORLD);
260 TRACE_smpi_set_category("J");
261 for (i = 0; i < N; i++) {
262 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
264 for (i = 0; i < N; i++) {
266 MPI_Test(&req[i], &flag, &sta[i]);
268 for (i = 0; i < N; i++) {
269 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);
284 MPI_Barrier(MPI_COMM_WORLD);
287 MPI_Barrier(MPI_COMM_WORLD);
290 MPI_Barrier(MPI_COMM_WORLD);
293 MPI_Barrier(MPI_COMM_WORLD);
296 MPI_Barrier(MPI_COMM_WORLD);
299 MPI_Barrier(MPI_COMM_WORLD);
302 MPI_Barrier(MPI_COMM_WORLD);
305 MPI_Barrier(MPI_COMM_WORLD);
307 TRACE_smpi_set_category("I");
308 for (i = 0; i < N; i++) {
309 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
311 for (i = 0; i < N; i++) {
313 MPI_Waitany(N, req, &completed, sta);
315 MPI_Barrier(MPI_COMM_WORLD);
317 for (i = 0; i < N; i++) {
318 MPI_Send(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD);
321 MPI_Barrier(MPI_COMM_WORLD);
325 MPI_Barrier(MPI_COMM_WORLD);