Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[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
11 static 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     dest = MPI_PROC_NULL;
32     if (rank == 0) {
33         dest = size - 1;
34         a = rank;
35         b = -1;
36         MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, comm, &status);
37         if (b != dest) {
38             errs++;
39             fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
40             fflush(stderr);
41         }
42         if (status.MPI_SOURCE != dest) {
43             errs++;
44             fprintf(stderr, "Source not set correctly in status on %d\n", rank);
45             fflush(stderr);
46         }
47     }
48     else if (rank == size - 1) {
49         dest = 0;
50         a = rank;
51         b = -1;
52         MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, comm, &status);
53         if (b != dest) {
54             errs++;
55             fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
56             fflush(stderr);
57         }
58         if (status.MPI_SOURCE != dest) {
59             errs++;
60             fprintf(stderr, "Source not set correctly in status on %d\n", rank);
61             fflush(stderr);
62         }
63     }
64
65     MPI_Barrier(comm);
66
67     return errs;
68 }
69
70 int main(int argc, char **argv)
71 {
72     int total_errs = 0;
73     MPI_Comm newcomm;
74     MPI_Info info;
75
76     MTest_Init(&argc, &argv);
77
78     /* Dup with no info */
79     MPI_Comm_dup_with_info(MPI_COMM_WORLD, MPI_INFO_NULL, &newcomm);
80     total_errs += run_tests(newcomm);
81     MPI_Comm_free(&newcomm);
82
83     /* Dup with info keys */
84     MPI_Info_create(&info);
85     MPI_Info_set(info, (char *) "host", (char *) "myhost.myorg.org");
86     MPI_Info_set(info, (char *) "file", (char *) "runfile.txt");
87     MPI_Info_set(info, (char *) "soft", (char *) "2:1000:4,3:1000:7");
88     MPI_Comm_dup_with_info(MPI_COMM_WORLD, info, &newcomm);
89     total_errs += run_tests(newcomm);
90     MPI_Info_free(&info);
91     MPI_Comm_free(&newcomm);
92
93     /* Dup with deleted info keys */
94     MPI_Info_create(&info);
95     MPI_Info_set(info, (char *) "host", (char *) "myhost.myorg.org");
96     MPI_Info_set(info, (char *) "file", (char *) "runfile.txt");
97     MPI_Info_set(info, (char *) "soft", (char *) "2:1000:4,3:1000:7");
98     MPI_Comm_dup_with_info(MPI_COMM_WORLD, info, &newcomm);
99     MPI_Info_free(&info);
100     total_errs += run_tests(newcomm);
101     MPI_Comm_free(&newcomm);
102
103     MTest_Finalize(total_errs);
104
105     MPI_Finalize();
106
107     return 0;
108 }