1 /* Copyright (c) 2009-2010, 2012-2015. 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)
23 * B: 0(send) with 1(irecv -> wait)
24 * C: 0(N * isend -> N * wait) with 1(N * recv)
25 * D: 0(N * isend -> N * waitany) with 1(N * recv)
26 * E: 0(N*send) with 1(N*irecv, N*wait)
27 * F: 0(N*send) with 1(N*irecv, N*waitany)
28 * G: 0(N* isend -> waitall) with 1(N*recv)
29 * H: 0(N*send) with 1(N*irecv, waitall)
30 * I: 0(2*N*send, 2*N*Irecv, Waitall) with
31 * 1(N*irecv, waitall, N*isend, N*waitany) with
32 * 2(N*irecv, N*waitany, N*isend, waitall)
33 * J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
38 /////////////////////////////////////////
39 ////////////////// RANK 0
40 ///////////////////////////////////
44 MPI_Request req[2 * N];
45 MPI_Status sta[2 * N];
46 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
49 TRACE_smpi_set_category("A");
50 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
51 MPI_Wait(&request, &status);
52 MPI_Barrier(MPI_COMM_WORLD);
55 TRACE_smpi_set_category("B");
56 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
57 MPI_Barrier(MPI_COMM_WORLD);
60 TRACE_smpi_set_category("C");
61 for (i = 0; i < N; i++) {
62 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
64 for (i = 0; i < N; i++) {
65 MPI_Wait(&req[i], &sta[i]);
67 MPI_Barrier(MPI_COMM_WORLD);
69 TRACE_smpi_set_category("D");
70 for (i = 0; i < N; i++) {
71 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
73 for (i = 0; i < N; i++) {
75 MPI_Waitany(N, req, &completed, sta);
77 MPI_Barrier(MPI_COMM_WORLD);
79 TRACE_smpi_set_category("E");
80 for (i = 0; i < N; i++) {
81 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
83 MPI_Barrier(MPI_COMM_WORLD);
85 TRACE_smpi_set_category("F");
86 for (i = 0; i < N; i++) {
87 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
89 MPI_Barrier(MPI_COMM_WORLD);
91 TRACE_smpi_set_category("G");
92 for (i = 0; i < N; i++) {
93 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
95 MPI_Waitall(N, req, sta);
96 MPI_Barrier(MPI_COMM_WORLD);
98 TRACE_smpi_set_category("H");
99 for (i = 0; i < N; i++) {
100 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
102 MPI_Barrier(MPI_COMM_WORLD);
104 TRACE_smpi_set_category("I");
105 for (i = 0; i < 2 * N; i++) {
107 MPI_Send(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD);
109 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
112 MPI_Barrier(MPI_COMM_WORLD);
113 for (i = 0; i < 2 * N; i++) {
115 MPI_Irecv(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
117 MPI_Irecv(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
120 MPI_Waitall(2 * N, req, sta);
121 MPI_Barrier(MPI_COMM_WORLD);
123 TRACE_smpi_set_category("J");
124 for (i = 0; i < N; i++) {
125 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
127 for (i = 0; i < N; i++) {
129 MPI_Test(&req[i], &flag, &sta[i]);
131 for (i = 0; i < N; i++) {
132 MPI_Wait(&req[i], &sta[i]);
135 /////////////////////////////////////////
136 ////////////////// RANK 1
137 ///////////////////////////////////
138 } else if (rank == 1) {
143 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
145 TRACE_smpi_set_category("A");
146 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
147 MPI_Barrier(MPI_COMM_WORLD);
149 TRACE_smpi_set_category("B");
150 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
151 MPI_Wait(&request, &status);
152 MPI_Barrier(MPI_COMM_WORLD);
154 TRACE_smpi_set_category("C");
155 for (i = 0; i < N; i++) {
156 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
158 MPI_Barrier(MPI_COMM_WORLD);
160 TRACE_smpi_set_category("D");
161 for (i = 0; i < N; i++) {
162 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
164 MPI_Barrier(MPI_COMM_WORLD);
166 TRACE_smpi_set_category("E");
167 for (i = 0; i < N; i++) {
168 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
170 for (i = 0; i < N; i++) {
171 MPI_Wait(&req[i], &sta[i]);
173 MPI_Barrier(MPI_COMM_WORLD);
175 TRACE_smpi_set_category("F");
176 for (i = 0; i < N; i++) {
177 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
179 for (i = 0; i < N; i++) {
181 MPI_Waitany(N, req, &completed, sta);
183 MPI_Barrier(MPI_COMM_WORLD);
185 TRACE_smpi_set_category("G");
186 for (i = 0; i < N; i++) {
187 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
189 MPI_Barrier(MPI_COMM_WORLD);
191 TRACE_smpi_set_category("H");
192 for (i = 0; i < N; i++) {
193 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
195 MPI_Waitall(N, req, sta);
196 MPI_Barrier(MPI_COMM_WORLD);
198 TRACE_smpi_set_category("I");
199 for (i = 0; i < N; i++) {
200 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
202 MPI_Waitall(N, req, sta);
204 MPI_Barrier(MPI_COMM_WORLD);
205 for (i = 0; i < N; i++) {
206 MPI_Isend(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
208 MPI_Waitall(N, req, sta);
209 MPI_Barrier(MPI_COMM_WORLD);
211 TRACE_smpi_set_category("J");
212 for (i = 0; i < N; i++) {
213 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
215 for (i = 0; i < N; i++) {
217 MPI_Test(&req[i], &flag, &sta[i]);
219 for (i = 0; i < N; i++) {
220 MPI_Wait(&req[i], &sta[i]);
223 /////////////////////////////////////////
224 ////////////////// RANK 2
225 ///////////////////////////////////
226 } else if (rank == 2) {
229 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
231 MPI_Barrier(MPI_COMM_WORLD);
232 MPI_Barrier(MPI_COMM_WORLD);
233 MPI_Barrier(MPI_COMM_WORLD);
234 MPI_Barrier(MPI_COMM_WORLD);
235 MPI_Barrier(MPI_COMM_WORLD);
236 MPI_Barrier(MPI_COMM_WORLD);
237 MPI_Barrier(MPI_COMM_WORLD);
238 MPI_Barrier(MPI_COMM_WORLD);
239 TRACE_smpi_set_category("I");
240 for (i = 0; i < N; i++) {
241 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
243 for (i = 0; i < N; i++) {
245 MPI_Waitany(N, req, &completed, sta);
247 MPI_Barrier(MPI_COMM_WORLD);
249 for (i = 0; i < N; i++) {
250 MPI_Send(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD);
252 MPI_Barrier(MPI_COMM_WORLD);
255 MPI_Barrier(MPI_COMM_WORLD);