1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
3 * (C) 2015 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
15 int main(int argc, char **argv)
19 MPI_Comm test_comm, new_comm[ITERS];
20 int in[ITERS], out[ITERS], sol;
21 int rank, size, rsize, rrank;
22 MPI_Request sreq[ITERS * 2];
25 MTest_Init(&argc, &argv);
26 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
27 MPI_Comm_size(MPI_COMM_WORLD, &size);
30 printf("this test requires at least 2 processes\n");
31 MPI_Abort(MPI_COMM_WORLD, 1);
34 while (MTestGetIntracommGeneral(&test_comm, 1, 1)) {
35 if (test_comm == MPI_COMM_NULL)
37 MPI_Comm_size(test_comm, &size);
38 MPI_Comm_rank(test_comm, &rank);
41 for (i = 0; i < ITERS; i++) {
42 MPI_Ibarrier(test_comm, &sreq[i]);
43 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
45 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
47 for (i = 0; i < ITERS; i++) {
48 errs += MTestTestComm(new_comm[i]);
49 MPI_Comm_free(&new_comm[i]);
52 for (i = 0; i < ITERS; i++) {
57 MPI_Ibcast(&in[i], 1, MPI_INT, 0, test_comm, &sreq[i]);
58 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
61 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
63 for (i = 0; i < ITERS; i++) {
66 errs += MTestTestComm(new_comm[i]);
67 MPI_Comm_free(&new_comm[i]);
70 for (i = 0; i < ITERS; i++) {
72 MPI_Iallreduce(&in[i], &out[i], 1, MPI_INT, MPI_SUM, test_comm, &sreq[i]);
73 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
76 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
78 for (i = 0; i < ITERS; i++) {
81 errs += MTestTestComm(new_comm[i]);
82 MPI_Comm_free(&new_comm[i]);
85 for (i = 0; i < ITERS; i++) {
86 MPI_Iscan(&rank, &out[i], 1, MPI_INT, MPI_SUM, test_comm, &sreq[i]);
87 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
89 sol = rank * (rank + 1) / 2;
90 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
92 for (i = 0; i < ITERS; i++) {
95 errs += MTestTestComm(new_comm[i]);
96 MPI_Comm_free(&new_comm[i]);
99 for (i = 0; i < ITERS; i++) {
104 MPI_Ibcast(&in[i], 1, MPI_INT, 0, test_comm, &sreq[i]);
105 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
107 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
109 for (i = 0; i < ITERS; i++) {
112 errs += MTestTestComm(new_comm[i]);
113 MPI_Comm_free(&new_comm[i]);
115 MTestFreeComm(&test_comm);
117 /* Now the test for inter-communicators */
118 while (MTestGetIntercomm(&test_comm, &isleft, 1)) {
119 if (test_comm == MPI_COMM_NULL)
122 MPI_Comm_size(test_comm, &size);
123 MPI_Comm_rank(test_comm, &rank);
125 MPI_Comm_remote_size(test_comm, &rsize);
127 for (i = 0; i < ITERS; i++) {
128 MPI_Ibarrier(test_comm, &sreq[i]);
129 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
131 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
132 for (i = 0; i < ITERS; i++) {
133 errs += MTestTestComm(new_comm[i]);
134 MPI_Comm_free(&new_comm[i]);
137 for (i = 0; i < ITERS; i++) {
144 root = MPI_PROC_NULL;
145 in[i] = 815; /* not needed, just to make correctness checking easier */
150 in[i] = 213; /* garbage value */
152 MPI_Ibcast(&in[i], 1, MPI_INT, root, test_comm, &sreq[i]);
153 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
156 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
158 for (i = 0; i < ITERS; i++) {
161 errs += MTestTestComm(new_comm[i]);
162 MPI_Comm_free(&new_comm[i]);
165 for (i = 0; i < ITERS; i++) {
167 MPI_Iallreduce(&in[i], &out[i], 1, MPI_INT, MPI_SUM, test_comm, &sreq[i]);
168 MPI_Comm_idup(test_comm, &new_comm[i], &sreq[i + ITERS]);
171 MPI_Waitall(ITERS * 2, sreq, MPI_STATUS_IGNORE);
173 for (i = 0; i < ITERS; i++) {
176 errs += MTestTestComm(new_comm[i]);
177 MPI_Comm_free(&new_comm[i]);
179 MTestFreeComm(&test_comm);
181 MTest_Finalize(errs);