1 /*
2 * Copyright (C) by Argonne National Laboratory
3 * See COPYRIGHT in top-level directory
4 */
5
6 #include "mpi.h"
7 #include <stdio.h>
8 #include "mpitest.h"
9
main(int argc,char ** argv)10 int main(int argc, char **argv)
11 {
12 int errs = 0;
13 int rank, size, wrank, wsize, dest, a, b;
14 MPI_Comm newcomm;
15 MPI_Status status;
16
17 MTest_Init(&argc, &argv);
18
19 /* Can we run comm dup at all? */
20 MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
21
22 /* Check basic properties */
23 MPI_Comm_size(MPI_COMM_WORLD, &wsize);
24 MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
25 MPI_Comm_size(newcomm, &size);
26 MPI_Comm_rank(newcomm, &rank);
27
28 if (size != wsize || rank != wrank) {
29 errs++;
30 fprintf(stderr, "Size (%d) or rank (%d) wrong\n", size, rank);
31 fflush(stderr);
32 }
33
34 /* Can we communicate with this new communicator? */
35 dest = MPI_PROC_NULL;
36 if (rank == 0) {
37 dest = size - 1;
38 a = rank;
39 b = -1;
40 MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, newcomm, &status);
41 if (b != dest) {
42 errs++;
43 fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
44 fflush(stderr);
45 }
46 if (status.MPI_SOURCE != dest) {
47 errs++;
48 fprintf(stderr, "Source not set correctly in status on %d\n", rank);
49 fflush(stderr);
50 }
51 } else if (rank == size - 1) {
52 dest = 0;
53 a = rank;
54 b = -1;
55 MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, newcomm, &status);
56 if (b != dest) {
57 errs++;
58 fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
59 fflush(stderr);
60 }
61 if (status.MPI_SOURCE != dest) {
62 errs++;
63 fprintf(stderr, "Source not set correctly in status on %d\n", rank);
64 fflush(stderr);
65 }
66 }
67
68 MPI_Comm_free(&newcomm);
69
70 MTest_Finalize(errs);
71
72
73 return MTestReturnValue(errs);
74 }
75