+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ * (C) 2010 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+
+/* This is a very weak sanity test that all nonblocking collectives specified by
+ * MPI-3 are present in the library and take arguments as expected. This test
+ * does not check for progress, matching issues, or sensible output buffer
+ * values. */
+
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpitest.h"
+
+#define NUM_INTS (2)
+
+#define my_assert(cond_) \
+ do { \
+ if (!(cond_)) { \
+ fprintf(stderr, "assertion (%s) failed, aborting\n", #cond_); \
+ MPI_Abort(MPI_COMM_WORLD, 1); \
+ } \
+ } while (0)
+
+int main(int argc, char **argv)
+{
+ int errs = 0;
+ int i;
+ int rank, size;
+ int *sbuf = NULL;
+ int *rbuf = NULL;
+ int *scounts = NULL;
+ int *rcounts = NULL;
+ int *sdispls = NULL;
+ int *rdispls = NULL;
+ int *types = NULL;
+ MPI_Comm comm;
+ MPI_Request req;
+
+ /* intentionally not using MTest_Init/MTest_Finalize in order to make it
+ * easy to take this test and use it as an NBC sanity test outside of the
+ * MPICH test suite */
+ MPI_Init(&argc, &argv);
+
+ comm = MPI_COMM_WORLD;
+
+ MPI_Comm_size(comm, &size);
+ MPI_Comm_rank(comm, &rank);
+
+ MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
+
+ /* enough space for every process to contribute at least NUM_INTS ints to any
+ * collective operation */
+ sbuf = malloc(NUM_INTS*size*sizeof(int));
+ my_assert(sbuf);
+ rbuf = malloc(NUM_INTS*size*sizeof(int));
+ my_assert(rbuf);
+ scounts = malloc(size*sizeof(int));
+ my_assert(scounts);
+ rcounts = malloc(size*sizeof(int));
+ my_assert(rcounts);
+ sdispls = malloc(size*sizeof(int));
+ my_assert(sdispls);
+ rdispls = malloc(size*sizeof(int));
+ my_assert(rdispls);
+ types = malloc(size*sizeof(int));
+ my_assert(types);
+
+ for (i = 0; i < size; ++i) {
+ sbuf[2*i] = i;
+ sbuf[2*i+1] = i;
+ rbuf[2*i] = i;
+ rbuf[2*i+1] = i;
+ scounts[i] = NUM_INTS;
+ rcounts[i] = NUM_INTS;
+ sdispls[i] = i * NUM_INTS;
+ rdispls[i] = i * NUM_INTS;
+ types[i] = MPI_INT;
+ }
+
+ if (rank == 0 && MPI_SUCCESS ==
+ MPI_Igather(sbuf, NUM_INTS, MPI_INT, sbuf, NUM_INTS, MPI_INT, 0, comm, &req))
+ errs++;
+
+ if (rank == 0 && MPI_SUCCESS ==
+ MPI_Igatherv(sbuf, NUM_INTS, MPI_INT, sbuf, rcounts, rdispls, MPI_INT, 0, comm, &req))
+ errs++;
+
+ if (rank == 0 && MPI_SUCCESS ==
+ MPI_Iscatter(sbuf, NUM_INTS, MPI_INT, sbuf, NUM_INTS, MPI_INT, 0, comm, &req))
+ errs++;
+
+ if (rank == 0 && MPI_SUCCESS ==
+ MPI_Iscatterv(sbuf, scounts, sdispls, MPI_INT, sbuf, NUM_INTS, MPI_INT, 0, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Iallgather(&sbuf[rank], 1, MPI_INT, sbuf, 1, MPI_INT, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Iallgatherv(&sbuf[rank * rcounts[rank]], rcounts[rank], MPI_INT, sbuf, rcounts, rdispls, MPI_INT, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Ialltoall(sbuf, NUM_INTS, MPI_INT, sbuf, NUM_INTS, MPI_INT, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Ialltoallv(sbuf, scounts, sdispls, MPI_INT, sbuf, scounts, sdispls, MPI_INT, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Ialltoallw(sbuf, scounts, sdispls, types, sbuf, scounts, sdispls, types, comm, &req))
+ errs++;
+
+ if (rank == 0 && MPI_SUCCESS ==
+ MPI_Ireduce(sbuf, sbuf, NUM_INTS, MPI_INT, MPI_SUM, 0, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Iallreduce(sbuf, sbuf, NUM_INTS, MPI_INT, MPI_SUM, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Ireduce_scatter(sbuf, sbuf, rcounts, MPI_INT, MPI_SUM, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Ireduce_scatter_block(sbuf, sbuf, NUM_INTS, MPI_INT, MPI_SUM, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Iscan(sbuf, sbuf, NUM_INTS, MPI_INT, MPI_SUM, comm, &req))
+ errs++;
+
+ if (MPI_SUCCESS ==
+ MPI_Iexscan(sbuf, sbuf, NUM_INTS, MPI_INT, MPI_SUM, comm, &req))
+ errs++;
+
+ if (sbuf) free(sbuf);
+ if (rbuf) free(rbuf);
+ if (scounts) free(scounts);
+ if (rcounts) free(rcounts);
+ if (sdispls) free(sdispls);
+ if (rdispls) free(rdispls);
+
+ if (rank == 0) {
+ if (errs)
+ fprintf(stderr, "Found %d errors\n", errs);
+ else
+ printf(" No errors\n");
+ }
+ MPI_Finalize();
+ return 0;
+}
+