Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / teshsuite / smpi / mpich3-test / pt2pt / recv_any.c
1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3  * (C) 2016 by Argonne National Laboratory.
4  *     See COPYRIGHT in top-level directory.
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <mpi.h>
10
11 #define BUFSIZE 4
12 #define ITER 10
13
14 /* This program tests MPI_Recv or MPI_Irecv + MPI_Wait with MPI_ANY_SOURCE by
15  * checking both the value of receive buffer and status.MPI_SOURCE in every
16  * iteration.*/
17
18 #define ERR_REPORT_EXIT(str,...) do {                                \
19         fprintf(stderr, str, ## __VA_ARGS__);fflush(stderr);    \
20         MPI_Abort(MPI_COMM_WORLD, 1);                           \
21     } while (0);
22
23 int main(int argc, char *argv[])
24 {
25     int rank = 0, nprocs = 0;
26     int i = 0, x = 0, dst = 0, src = 0, tag = 0;
27     MPI_Status stat;
28 #ifdef TEST_NB
29     MPI_Request req;
30 #endif
31     int sbuf[BUFSIZE], rbuf[BUFSIZE];
32
33     MPI_Init(&argc, &argv);
34     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
35     MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
36
37     /* initialize buffers */
38     for (i = 0; i < BUFSIZE; i++) {
39         sbuf[i] = i + 1;
40         rbuf[i] = 0;
41     }
42
43     dst = 0;
44     src = 1;
45     for (x = 0; x < ITER; x++) {
46         tag = x;
47         if (rank == dst) {
48 #ifdef TEST_NB
49             MPI_Irecv(rbuf, sizeof(int) * BUFSIZE, MPI_CHAR, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD,
50                       &req);
51             MPI_Wait(&req, &stat);
52 #else
53             MPI_Recv(rbuf, sizeof(int) * BUFSIZE, MPI_CHAR,
54                      MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &stat);
55 #endif
56             if (stat.MPI_SOURCE != src) {
57                 ERR_REPORT_EXIT("[%d] Error: iter %d, stat.MPI_SOURCE=%d, expected %d\n",
58                                 rank, x, stat.MPI_SOURCE, src);
59             }
60
61             for (i = 0; i < BUFSIZE; i++) {
62                 if (rbuf[i] != i + 1) {
63                     ERR_REPORT_EXIT("[%d] Error: iter %d, got rbuf[%d]=%d, expected %d\n",
64                                     rank, x, i, rbuf[i], i + 1);
65                 }
66             }
67         }
68         else if (rank == src) {
69             MPI_Send(sbuf, sizeof(int) * BUFSIZE, MPI_CHAR, dst, tag, MPI_COMM_WORLD);
70         }
71     }
72
73     if (rank == 0) {
74         printf(" No errors\n");
75         fflush(stdout);
76     }
77
78     MPI_Finalize();
79     return 0;
80 }