Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
functioning MPI_Comm_get_name, MPI_Comm_set_name
[simgrid.git] / teshsuite / smpi / mpich3-test / comm / comm_idup_isend.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2015 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include "mpi.h"
11 #include "mpitest.h"
12
13 #define ITERS 4
14
15 int main(int argc, char **argv)
16 {
17     int errs = 0;
18     int i, j;
19     int rank, size, rsize;
20     int in[ITERS], out[ITERS], sol[ITERS], cnt;
21     int isLeft;
22     MPI_Comm newcomm[ITERS], testcomm;
23     MPI_Request *sreq;
24
25     MTest_Init(&argc, &argv);
26     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
27     MPI_Comm_size(MPI_COMM_WORLD, &size);
28     if (size < 2) {
29         printf("this test requires at least 2 processes\n");
30         MPI_Abort(MPI_COMM_WORLD, 1);
31     }
32
33     sreq = (MPI_Request *) malloc(sizeof(MPI_Request) * (size + 1) * ITERS);
34
35     while (MTestGetIntracommGeneral(&testcomm, 1, 1)) {
36         if (testcomm == MPI_COMM_NULL)
37             continue;
38
39         MPI_Comm_rank(testcomm, &rank);
40         MPI_Comm_size(testcomm, &size);
41         cnt = 0;
42         for (j = 0; j < ITERS; j++) {
43             if (rank == 0) {
44                 out[j] = 815;
45                 in[j] = 815;
46                 sol[j] = 815;
47                 for (i = 1; i < size; i++)
48                     MPI_Isend(&out[j], 1, MPI_INT, i, 0, testcomm, &sreq[cnt++]);
49                 MPI_Comm_idup(testcomm, &newcomm[j], &sreq[cnt++]);
50             }
51             else {
52                 out[j] = 0;
53                 in[j] = 0;
54                 sol[j] = 815;
55                 MPI_Comm_idup(testcomm, &newcomm[j], &sreq[cnt++]);
56                 MPI_Irecv(&in[j], 1, MPI_INT, 0, 0, testcomm, &sreq[cnt++]);
57             }
58         }
59         MPI_Waitall(cnt, sreq, MPI_STATUS_IGNORE);
60
61         for (j = 0; j < ITERS; j++) {
62             if (sol[j] != in[j])
63                 errs++;
64             errs += MTestTestComm(newcomm[j]);
65             MPI_Comm_free(&newcomm[j]);
66         }
67         MTestFreeComm(&testcomm);
68     }
69     while (MTestGetIntercomm(&testcomm, &isLeft, 1)) {
70         if (testcomm == MPI_COMM_NULL)
71             continue;
72
73         MPI_Comm_rank(testcomm, &rank);
74         MPI_Comm_size(testcomm, &size);
75         MPI_Comm_remote_size(testcomm, &rsize);
76         cnt = 0;
77         for (j = 0; j < ITERS; j++) {
78             if (rank == 0) {
79                 out[j] = 815;
80                 in[j] = 815;
81                 sol[j] = 815;
82                 for (i = 1; i < rsize; i++)
83                     MPI_Isend(&out[j], 1, MPI_INT, i, 0, testcomm, &sreq[cnt++]);
84                 MPI_Comm_idup(testcomm, &newcomm[j], &sreq[cnt++]);
85             }
86             else {
87                 out[j] = 0;
88                 in[j] = 0;
89                 sol[j] = 815;
90                 MPI_Comm_idup(testcomm, &newcomm[j], &sreq[cnt++]);
91                 MPI_Irecv(&in[j], 1, MPI_INT, 0, 0, testcomm, &sreq[cnt++]);
92             }
93         }
94         MPI_Waitall(cnt, sreq, MPI_STATUS_IGNORE);
95
96         for (j = 0; j < ITERS; j++) {
97             if (sol[j] != in[j])
98                 errs++;
99             errs += MTestTestComm(newcomm[j]);
100             MPI_Comm_free(&newcomm[j]);
101         }
102         MTestFreeComm(&testcomm);
103     }
104
105     free(sreq);
106     MTest_Finalize(errs);
107     MPI_Finalize();
108     return 0;
109 }