Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
[simgrid.git] / teshsuite / smpi / mpich3-test / comm / dup_with_info.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *
4  *  (C) 2012 by Argonne National Laboratory.
5  *      See COPYRIGHT in top-level directory.
6  */
7 #include "mpi.h"
8 #include <stdio.h>
9 #include "mpitest.h"
10 int run_tests(MPI_Comm comm);
11 int run_tests(MPI_Comm comm)
12 {
13     int rank, size, wrank, wsize, dest, a, b, errs = 0;
14     MPI_Status status;
15
16     /* Check basic properties */
17     MPI_Comm_size(MPI_COMM_WORLD, &wsize);
18     MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
19     MPI_Comm_size(comm, &size);
20     MPI_Comm_rank(comm, &rank);
21
22     if (size != wsize || rank != wrank) {
23         errs++;
24         fprintf(stderr, "Size (%d) or rank (%d) wrong\n", size, rank);
25         fflush(stderr);
26     }
27
28     MPI_Barrier(comm);
29
30     /* Can we communicate with this new communicator? */
31     if (rank == 0) {
32         dest = size - 1;
33         a = rank;
34         b = -1;
35         MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, comm, &status);
36         if (b != dest) {
37             errs++;
38             fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
39             fflush(stderr);
40         }
41         if (status.MPI_SOURCE != dest) {
42             errs++;
43             fprintf(stderr, "Source not set correctly in status on %d\n", rank);
44             fflush(stderr);
45         }
46     }
47     else if (rank == size - 1) {
48         dest = 0;
49         a = rank;
50         b = -1;
51         MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, comm, &status);
52         if (b != dest) {
53             errs++;
54             fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
55             fflush(stderr);
56         }
57         if (status.MPI_SOURCE != dest) {
58             errs++;
59             fprintf(stderr, "Source not set correctly in status on %d\n", rank);
60             fflush(stderr);
61         }
62     }
63
64     MPI_Barrier(comm);
65
66     return errs;
67 }
68
69 int main(int argc, char **argv)
70 {
71     int total_errs = 0;
72     MPI_Comm newcomm;
73     MPI_Info info;
74
75     MTest_Init(&argc, &argv);
76
77     /* Dup with no info */
78     MPI_Comm_dup_with_info(MPI_COMM_WORLD, MPI_INFO_NULL, &newcomm);
79     total_errs += run_tests(newcomm);
80     MPI_Comm_free(&newcomm);
81
82     /* Dup with info keys */
83     MPI_Info_create(&info);
84     MPI_Info_set(info, (char *) "host", (char *) "myhost.myorg.org");
85     MPI_Info_set(info, (char *) "file", (char *) "runfile.txt");
86     MPI_Info_set(info, (char *) "soft", (char *) "2:1000:4,3:1000:7");
87     MPI_Comm_dup_with_info(MPI_COMM_WORLD, info, &newcomm);
88     total_errs += run_tests(newcomm);
89     MPI_Info_free(&info);
90     MPI_Comm_free(&newcomm);
91
92     /* Dup with deleted info keys */
93     MPI_Info_create(&info);
94     MPI_Info_set(info, (char *) "host", (char *) "myhost.myorg.org");
95     MPI_Info_set(info, (char *) "file", (char *) "runfile.txt");
96     MPI_Info_set(info, (char *) "soft", (char *) "2:1000:4,3:1000:7");
97     MPI_Comm_dup_with_info(MPI_COMM_WORLD, info, &newcomm);
98     MPI_Info_free(&info);
99     total_errs += run_tests(newcomm);
100     MPI_Comm_free(&newcomm);
101
102     MTest_Finalize(total_errs);
103
104     MPI_Finalize();
105
106     return 0;
107 }