Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Upgrade coll mpich testlist to new mpich
[simgrid.git] / teshsuite / smpi / mpich3-test / coll / op_commutative.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *  (C) 2009 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7 #include "mpi.h"
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include "mpitest.h"
11
12 /*
13 static char MTEST_Descrip[] = "A simple test of MPI_Op_create/commute/free";
14 */
15
16 static int errs = 0;
17
18 /*
19 static void comm_user_op(void *invec, void *inoutvec, int *len, MPI_Datatype *datatype)
20 {
21     user_op(invec, inoutvec, len, datatype);
22 }
23 */
24
25 /*
26 static void noncomm_user_op(void *invec, void *inoutvec, int *len, MPI_Datatype *datatype)
27 {
28     user_op(invec, inoutvec, len, datatype);
29 }
30 */
31
32 static void user_op(void *invec, void *inoutvec, int *len, MPI_Datatype * datatype)
33 {
34     int i;
35     int *invec_int = (int *) invec;
36     int *inoutvec_int = (int *) inoutvec;
37
38     if (*datatype != MPI_INT) {
39         ++errs;
40         printf("invalid datatype passed to user_op");
41         return;
42     }
43
44     for (i = 0; i < *len; ++i) {
45         inoutvec_int[i] = invec_int[i] * 2 + inoutvec_int[i];
46     }
47 }
48
49
50 int main(int argc, char *argv[])
51 {
52     MPI_Op c_uop = MPI_OP_NULL;
53     MPI_Op nc_uop = MPI_OP_NULL;
54     int is_commutative = 0;
55
56     MTest_Init(&argc, &argv);
57
58     /* make sure that user-define ops work too */
59     MPI_Op_create(&user_op, 1 /*commute */ , &c_uop);
60     MPI_Op_create(&user_op, 0 /*!commute */ , &nc_uop);
61
62 #if MTEST_HAVE_MIN_MPI_VERSION(2,2)
63     /* this function was added in MPI-2.2 */
64
65 #define CHECK_COMMUTATIVE(op_)                      \
66     do {                                            \
67         MPI_Op_commutative((op_), &is_commutative); \
68         if (!is_commutative) { ++errs; }            \
69     } while (0)
70
71     /* Check all predefined reduction operations for commutivity.
72      * This list is from section 5.9.2 of the MPI-2.1 standard */
73     CHECK_COMMUTATIVE(MPI_MAX);
74     CHECK_COMMUTATIVE(MPI_MIN);
75     CHECK_COMMUTATIVE(MPI_SUM);
76     CHECK_COMMUTATIVE(MPI_PROD);
77     CHECK_COMMUTATIVE(MPI_LAND);
78     CHECK_COMMUTATIVE(MPI_BAND);
79     CHECK_COMMUTATIVE(MPI_LOR);
80     CHECK_COMMUTATIVE(MPI_BOR);
81     CHECK_COMMUTATIVE(MPI_LXOR);
82     CHECK_COMMUTATIVE(MPI_BXOR);
83     CHECK_COMMUTATIVE(MPI_MAXLOC);
84     CHECK_COMMUTATIVE(MPI_MINLOC);
85
86 #undef CHECK_COMMUTATIVE
87
88     MPI_Op_commutative(c_uop, &is_commutative);
89     if (!is_commutative) {
90         ++errs;
91     }
92
93     /* also check our non-commutative user defined operation */
94     MPI_Op_commutative(nc_uop, &is_commutative);
95     if (is_commutative) {
96         ++errs;
97     }
98 #endif
99
100     MPI_Op_free(&nc_uop);
101     MPI_Op_free(&c_uop);
102
103     MTest_Finalize(errs);
104     MPI_Finalize();
105     return 0;
106 }