Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix build and dist, add missing folder
[simgrid.git] / teshsuite / smpi / mpich3-test / datatype / hindexed_block_contents.c
diff --git a/teshsuite/smpi/mpich3-test/datatype/hindexed_block_contents.c b/teshsuite/smpi/mpich3-test/datatype/hindexed_block_contents.c
new file mode 100644 (file)
index 0000000..e316c70
--- /dev/null
@@ -0,0 +1,78 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *  (C) 2012 by Argonne National Laboratory.
+ *      See COPYRIGHT in top-level directory.
+ */
+
+/* test based on a bug report from Lisandro Dalcin:
+ * http://lists.mcs.anl.gov/pipermail/mpich-dev/2012-October/000978.html */
+
+#include <mpi.h>
+#include <stdlib.h>
+#include <stdio.h>
+/* USE_STRICT_MPI may be defined in mpitestconf.h */
+#include "mpitestconf.h"
+
+/* assert-like macro that bumps the err count and emits a message */
+#define check(x_)                                                                 \
+    do {                                                                          \
+        if (!(x_)) {                                                              \
+            ++errs;                                                               \
+            if (errs < 10) {                                                      \
+                fprintf(stderr, "check failed: (%s), line %d\n", #x_, __LINE__); \
+            }                                                                     \
+        }                                                                         \
+    } while (0)
+
+int main(int argc, char **argv)
+{
+    int errs = 0;
+    int rank;
+    MPI_Datatype t;
+    int count = 4;
+    int blocklength = 2;
+    MPI_Aint displacements[] = {0, 8, 16, 24};
+
+    MPI_Init(&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+    if (!rank) {
+        MPI_Type_create_hindexed_block(count, blocklength,
+                                        displacements, MPI_INT,
+                                        &t);
+        MPI_Type_commit(&t);
+        {
+            int ni, na, nd, combiner;
+            int i[1024];
+            MPI_Aint a[1024];
+            MPI_Datatype d[1024];
+            int k;
+            MPI_Type_get_envelope(t, &ni, &na, &nd, &combiner);
+            MPI_Type_get_contents(t, ni, na, nd, i, a, d);
+
+            check(ni == 2);
+            check(i[0] == 4);
+            check(i[1] == 2);
+
+            check(na == 4);
+            for (k=0; k < na; k++)
+                check(a[k] == (k * 8));
+
+            check(nd == 1);
+            check(d[0] == MPI_INT);
+        }
+
+        MPI_Type_free(&t);
+    }
+
+    if (rank == 0) {
+        if (errs) {
+            printf("found %d errors\n", errs);
+        }
+        else {
+            printf(" No errors\n");
+        }
+    }
+    MPI_Finalize();
+    return 0;
+}