1 /* Copyright (c) 2009-2010, 2012-2014. 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 "simgrid/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]);
163 /////////////////////////////////////////
164 ////////////////// RANK 1
165 ///////////////////////////////////
166 } else if (rank == 1) {
171 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
174 TRACE_smpi_set_category("A");
175 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
177 MPI_Barrier(MPI_COMM_WORLD);
180 TRACE_smpi_set_category("B");
181 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
182 MPI_Wait(&request, &status);
184 MPI_Barrier(MPI_COMM_WORLD);
187 TRACE_smpi_set_category("C");
188 for (i = 0; i < N; i++) {
189 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
192 MPI_Barrier(MPI_COMM_WORLD);
195 TRACE_smpi_set_category("D");
196 for (i = 0; i < N; i++) {
197 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
200 MPI_Barrier(MPI_COMM_WORLD);
203 TRACE_smpi_set_category("E");
204 for (i = 0; i < N; i++) {
205 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
207 for (i = 0; i < N; i++) {
208 MPI_Wait(&req[i], &sta[i]);
211 MPI_Barrier(MPI_COMM_WORLD);
214 TRACE_smpi_set_category("F");
215 for (i = 0; i < N; i++) {
216 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
218 for (i = 0; i < N; i++) {
220 MPI_Waitany(N, req, &completed, sta);
223 MPI_Barrier(MPI_COMM_WORLD);
226 TRACE_smpi_set_category("G");
227 for (i = 0; i < N; i++) {
228 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
231 MPI_Barrier(MPI_COMM_WORLD);
234 TRACE_smpi_set_category("H");
235 for (i = 0; i < N; i++) {
236 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
238 MPI_Waitall(N, req, sta);
240 MPI_Barrier(MPI_COMM_WORLD);
243 TRACE_smpi_set_category("I");
244 for (i = 0; i < N; i++) {
245 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
247 MPI_Waitall(N, req, sta);
249 MPI_Barrier(MPI_COMM_WORLD);
250 for (i = 0; i < N; i++) {
251 MPI_Isend(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
253 MPI_Waitall(N, req, sta);
254 // for (i = 0; i < N; i++){
255 // MPI_Wait (&req[i], &sta[i]);
258 MPI_Barrier(MPI_COMM_WORLD);
261 TRACE_smpi_set_category("J");
262 for (i = 0; i < N; i++) {
263 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
265 for (i = 0; i < N; i++) {
267 MPI_Test(&req[i], &flag, &sta[i]);
269 for (i = 0; i < N; i++) {
270 MPI_Wait(&req[i], &sta[i]);
274 /////////////////////////////////////////
275 ////////////////// RANK 2
276 ///////////////////////////////////
277 } else if (rank == 2) {
278 // MPI_Request request;
279 // MPI_Status status;
282 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
286 MPI_Barrier(MPI_COMM_WORLD);
289 MPI_Barrier(MPI_COMM_WORLD);
292 MPI_Barrier(MPI_COMM_WORLD);
295 MPI_Barrier(MPI_COMM_WORLD);
298 MPI_Barrier(MPI_COMM_WORLD);
301 MPI_Barrier(MPI_COMM_WORLD);
304 MPI_Barrier(MPI_COMM_WORLD);
307 MPI_Barrier(MPI_COMM_WORLD);
309 TRACE_smpi_set_category("I");
310 for (i = 0; i < N; i++) {
311 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
313 for (i = 0; i < N; i++) {
315 MPI_Waitany(N, req, &completed, sta);
317 MPI_Barrier(MPI_COMM_WORLD);
319 for (i = 0; i < N; i++) {
320 MPI_Send(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD);
323 MPI_Barrier(MPI_COMM_WORLD);
328 MPI_Barrier(MPI_COMM_WORLD);