1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
4 * (C) 2001 by Argonne National Laboratory.
5 * See COPYRIGHT in top-level directory.
9 Exercise communicator routines for intercommunicators
11 This C version derived from attrt, which in turn was
12 derived from a Fortran test program from ...
20 int test_communicators(void);
21 int copy_fn(MPI_Comm, int, void *, void *, void *, int *);
22 int delete_fn(MPI_Comm, int, void *, void *);
24 #define FFLUSH fflush(stdout);
29 int main(int argc, char **argv)
32 MTest_Init(&argc, &argv);
34 errs = test_communicators();
41 int copy_fn(MPI_Comm oldcomm, int keyval, void *extra_state,
42 void *attribute_val_in, void *attribute_val_out, int *flag)
44 /* Note that if (sizeof(int) < sizeof(void *), just setting the int
45 * part of attribute_val_out may leave some dirty bits
47 *(MPI_Aint *) attribute_val_out = (MPI_Aint) attribute_val_in;
52 int delete_fn(MPI_Comm comm, int keyval, void *attribute_val, void *extra_state)
55 MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
56 if ((MPI_Aint) attribute_val != (MPI_Aint) world_rank) {
57 printf("incorrect attribute value %d\n", *(int *) attribute_val);
58 MPI_Abort(MPI_COMM_WORLD, 1005);
63 int test_communicators(void)
65 MPI_Comm dup_comm, comm;
67 int flag, world_rank, world_size, key_1, key_3;
72 MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
73 MPI_Comm_size(MPI_COMM_WORLD, &world_size);
75 if (world_rank == 0) {
76 printf("*** Communicators ***\n");
81 while (MTestGetIntercomm(&comm, &isLeft, 2)) {
82 MTestPrintfMsg(1, "start while loop, isLeft=%s\n", (isLeft ? "TRUE" : "FALSE"));
84 if (comm == MPI_COMM_NULL) {
85 MTestPrintfMsg(1, "got COMM_NULL, skipping\n");
90 * Check Comm_dup by adding attributes to comm & duplicating
94 MPI_Keyval_create(copy_fn, delete_fn, &key_1, &value);
95 MTestPrintfMsg(1, "Keyval_create key=%#x value=%d\n", key_1, value);
97 MPI_Keyval_create(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN, &key_3, &value);
98 MTestPrintfMsg(1, "Keyval_create key=%#x value=%d\n", key_3, value);
100 /* This may generate a compilation warning; it is, however, an
101 * easy way to cache a value instead of a pointer */
102 /* printf("key1 = %x key3 = %x\n", key_1, key_3); */
103 MPI_Attr_put(comm, key_1, (void *) (MPI_Aint) world_rank);
104 MPI_Attr_put(comm, key_3, (void *) 0);
106 MTestPrintfMsg(1, "Comm_dup\n");
107 MPI_Comm_dup(comm, &dup_comm);
109 /* Note that if sizeof(int) < sizeof(void *), we can't use
110 * (void **)&value to get the value we passed into Attr_put. To avoid
111 * problems (e.g., alignment errors), we recover the value into
112 * a (void *) and cast to int. Note that this may generate warning
113 * messages from the compiler. */
114 MPI_Attr_get(dup_comm, key_1, (void **) &vvalue, &flag);
115 value = (MPI_Aint) vvalue;
119 printf("dup_comm key_1 not found on %d\n", world_rank);
121 MPI_Abort(MPI_COMM_WORLD, 3004);
124 if (value != world_rank) {
126 printf("dup_comm key_1 value incorrect: %ld\n", (long) value);
128 MPI_Abort(MPI_COMM_WORLD, 3005);
131 MPI_Attr_get(dup_comm, key_3, (void **) &vvalue, &flag);
132 value = (MPI_Aint) vvalue;
135 printf("dup_comm key_3 found!\n");
137 MPI_Abort(MPI_COMM_WORLD, 3008);
139 MTestPrintfMsg(1, "Keyval_free key=%#x\n", key_1);
140 MPI_Keyval_free(&key_1);
141 MTestPrintfMsg(1, "Keyval_free key=%#x\n", key_3);
142 MPI_Keyval_free(&key_3);
144 * Free all communicators created
146 MTestPrintfMsg(1, "Comm_free comm\n");
147 MPI_Comm_free(&comm);
148 MTestPrintfMsg(1, "Comm_free dup_comm\n");
149 MPI_Comm_free(&dup_comm);