1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
4 * (C) 2009 by Argonne National Laboratory.
5 * See COPYRIGHT in top-level directory.
13 static char MTEST_Descrip[] = "A simple test of MPI_Op_create/commute/free";
19 static void comm_user_op(void *invec, void *inoutvec, int *len, MPI_Datatype *datatype)
21 user_op(invec, inoutvec, len, datatype);
26 static void noncomm_user_op(void *invec, void *inoutvec, int *len, MPI_Datatype *datatype)
28 user_op(invec, inoutvec, len, datatype);
32 static void user_op(void *invec, void *inoutvec, int *len, MPI_Datatype * datatype)
35 int *invec_int = (int *) invec;
36 int *inoutvec_int = (int *) inoutvec;
38 if (*datatype != MPI_INT) {
40 printf("invalid datatype passed to user_op");
44 for (i = 0; i < *len; ++i) {
45 inoutvec_int[i] = invec_int[i] * 2 + inoutvec_int[i];
50 int main(int argc, char *argv[])
52 MPI_Op c_uop = MPI_OP_NULL;
53 MPI_Op nc_uop = MPI_OP_NULL;
54 int is_commutative = 0;
56 MTest_Init(&argc, &argv);
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);
62 #if MTEST_HAVE_MIN_MPI_VERSION(2,2)
63 /* this function was added in MPI-2.2 */
65 #define CHECK_COMMUTATIVE(op_) \
67 MPI_Op_commutative((op_), &is_commutative); \
68 if (!is_commutative) { ++errs; } \
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);
86 #undef CHECK_COMMUTATIVE
88 MPI_Op_commutative(c_uop, &is_commutative);
89 if (!is_commutative) {
93 /* also check our non-commutative user defined operation */
94 MPI_Op_commutative(nc_uop, &is_commutative);
100 MPI_Op_free(&nc_uop);
103 MTest_Finalize(errs);