1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
3 * (C) 2016 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
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
18 #define ERR_REPORT_EXIT(str,...) do { \
19 fprintf(stderr, str, ## __VA_ARGS__);fflush(stderr); \
20 MPI_Abort(MPI_COMM_WORLD, 1); \
23 int main(int argc, char *argv[])
25 int rank = 0, nprocs = 0;
26 int i = 0, x = 0, dst = 0, src = 0, tag = 0;
31 int sbuf[BUFSIZE], rbuf[BUFSIZE];
33 MPI_Init(&argc, &argv);
34 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
35 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
37 /* initialize buffers */
38 for (i = 0; i < BUFSIZE; i++) {
45 for (x = 0; x < ITER; x++) {
49 MPI_Irecv(rbuf, sizeof(int) * BUFSIZE, MPI_CHAR, MPI_ANY_SOURCE, tag, MPI_COMM_WORLD,
51 MPI_Wait(&req, &stat);
53 MPI_Recv(rbuf, sizeof(int) * BUFSIZE, MPI_CHAR,
54 MPI_ANY_SOURCE, tag, MPI_COMM_WORLD, &stat);
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);
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);
68 else if (rank == src) {
69 MPI_Send(sbuf, sizeof(int) * BUFSIZE, MPI_CHAR, dst, tag, MPI_COMM_WORLD);
74 printf(" No errors\n");