1 /* Copyright (c) 2009-2019. 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"
12 #define DATATOSENT 100000
14 int main(int argc, char *argv[])
19 MPI_Init(&argc, &argv);
20 MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
21 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
24 * A: 0(isend -> wait) with 1(recv)
25 * B: 0(send) with 1(irecv -> wait)
26 * C: 0(N * isend -> N * wait) with 1(N * recv)
27 * D: 0(N * isend -> N * waitany) with 1(N * recv)
28 * E: 0(N*send) with 1(N*irecv, N*wait)
29 * F: 0(N*send) with 1(N*irecv, N*waitany)
30 * G: 0(N* isend -> waitall) with 1(N*recv)
31 * H: 0(N*send) with 1(N*irecv, waitall)
32 * I: 0(2*N*send, 2*N*Irecv, Waitall) with
33 * 1(N*irecv, waitall, N*isend, N*waitany) with
34 * 2(N*irecv, N*waitany, N*isend, waitall)
35 * J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
40 /////////////////////////////////////////
41 ////////////////// RANK 0
42 ///////////////////////////////////
46 MPI_Request req[2 * N];
47 MPI_Status sta[2 * N];
48 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
51 TRACE_smpi_set_category("A");
52 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
53 MPI_Wait(&request, &status);
54 MPI_Barrier(MPI_COMM_WORLD);
57 TRACE_smpi_set_category("B");
58 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
59 MPI_Barrier(MPI_COMM_WORLD);
62 TRACE_smpi_set_category("C");
63 for (int i = 0; i < N; i++) {
64 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
66 for (int i = 0; i < N; i++) {
67 MPI_Wait(&req[i], &sta[i]);
69 MPI_Barrier(MPI_COMM_WORLD);
71 TRACE_smpi_set_category("D");
72 for (int i = 0; i < N; i++) {
73 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
75 for (int i = 0; i < N; i++) {
77 MPI_Waitany(N, req, &completed, sta);
79 MPI_Barrier(MPI_COMM_WORLD);
81 TRACE_smpi_set_category("E");
82 for (int i = 0; i < N; i++) {
83 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
85 MPI_Barrier(MPI_COMM_WORLD);
87 TRACE_smpi_set_category("F");
88 for (int i = 0; i < N; i++) {
89 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
91 MPI_Barrier(MPI_COMM_WORLD);
93 TRACE_smpi_set_category("G");
94 for (int i = 0; i < N; i++) {
95 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
97 MPI_Waitall(N, req, sta);
98 MPI_Barrier(MPI_COMM_WORLD);
100 TRACE_smpi_set_category("H");
101 for (int i = 0; i < N; i++) {
102 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
104 MPI_Barrier(MPI_COMM_WORLD);
106 TRACE_smpi_set_category("I");
107 for (int i = 0; i < 2 * N; i++) {
109 MPI_Send(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD);
111 MPI_Send(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD);
114 MPI_Barrier(MPI_COMM_WORLD);
115 for (int i = 0; i < 2 * N; i++) {
117 MPI_Irecv(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
119 MPI_Irecv(r, DATATOSENT, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
122 MPI_Waitall(2 * N, req, sta);
123 MPI_Barrier(MPI_COMM_WORLD);
125 TRACE_smpi_set_category("J");
126 for (int i = 0; i < N; i++) {
127 MPI_Isend(r, DATATOSENT, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
129 for (int i = 0; i < N; i++) {
131 MPI_Test(&req[i], &flag, &sta[i]);
133 for (int i = 0; i < N; i++) {
134 MPI_Wait(&req[i], &sta[i]);
137 /////////////////////////////////////////
138 ////////////////// RANK 1
139 ///////////////////////////////////
140 } else if (rank == 1) {
145 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
147 TRACE_smpi_set_category("A");
148 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
149 MPI_Barrier(MPI_COMM_WORLD);
151 TRACE_smpi_set_category("B");
152 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
153 MPI_Wait(&request, &status);
154 MPI_Barrier(MPI_COMM_WORLD);
156 TRACE_smpi_set_category("C");
157 for (int i = 0; i < N; i++) {
158 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
160 MPI_Barrier(MPI_COMM_WORLD);
162 TRACE_smpi_set_category("D");
163 for (int i = 0; i < N; i++) {
164 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
166 MPI_Barrier(MPI_COMM_WORLD);
168 TRACE_smpi_set_category("E");
169 for (int i = 0; i < N; i++) {
170 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
172 for (int i = 0; i < N; i++) {
173 MPI_Wait(&req[i], &sta[i]);
175 MPI_Barrier(MPI_COMM_WORLD);
177 TRACE_smpi_set_category("F");
178 for (int i = 0; i < N; i++) {
179 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
181 for (int i = 0; i < N; i++) {
183 MPI_Waitany(N, req, &completed, sta);
185 MPI_Barrier(MPI_COMM_WORLD);
187 TRACE_smpi_set_category("G");
188 for (int i = 0; i < N; i++) {
189 MPI_Recv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
191 MPI_Barrier(MPI_COMM_WORLD);
193 TRACE_smpi_set_category("H");
194 for (int i = 0; i < N; i++) {
195 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
197 MPI_Waitall(N, req, sta);
198 MPI_Barrier(MPI_COMM_WORLD);
200 TRACE_smpi_set_category("I");
201 for (int i = 0; i < N; i++) {
202 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
204 MPI_Waitall(N, req, sta);
206 MPI_Barrier(MPI_COMM_WORLD);
207 for (int i = 0; i < N; i++) {
208 MPI_Isend(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
210 MPI_Waitall(N, req, sta);
211 MPI_Barrier(MPI_COMM_WORLD);
213 TRACE_smpi_set_category("J");
214 for (int i = 0; i < N; i++) {
215 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
217 for (int i = 0; i < N; i++) {
219 MPI_Test(&req[i], &flag, &sta[i]);
221 for (int i = 0; i < N; i++) {
222 MPI_Wait(&req[i], &sta[i]);
225 /////////////////////////////////////////
226 ////////////////// RANK 2
227 ///////////////////////////////////
228 } else if (rank == 2) {
231 int *r = (int *) malloc(sizeof(int) * DATATOSENT);
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 MPI_Barrier(MPI_COMM_WORLD);
240 MPI_Barrier(MPI_COMM_WORLD);
241 TRACE_smpi_set_category("I");
242 for (int i = 0; i < N; i++) {
243 MPI_Irecv(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
245 for (int i = 0; i < N; i++) {
247 MPI_Waitany(N, req, &completed, sta);
249 MPI_Barrier(MPI_COMM_WORLD);
251 for (int i = 0; i < N; i++) {
252 MPI_Send(r, DATATOSENT, MPI_INT, 0, tag, MPI_COMM_WORLD);
254 MPI_Barrier(MPI_COMM_WORLD);
257 MPI_Barrier(MPI_COMM_WORLD);