1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*
3  *
4  *  (C) 2003 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 /* MPI-3 is not yet standardized -- allow MPI-3 routines to be switched off.
12  */
13 
14 #if !defined(USE_STRICT_MPI) && defined(MPICH2)
15 #  define TEST_MPI3_ROUTINES 1
16 #endif
17 
18 #define ELEM_SIZE 8
19 
main(int argc,char * argv[])20 int main( int argc, char *argv[] )
21 {
22     int     rank;
23     int     errors = 0, all_errors = 0;
24     int    *flavor, *model, flag;
25     void   *buf;
26     MPI_Win window;
27 
28     MPI_Init(&argc, &argv);
29     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
30 
31     /** Create using MPI_Win_create() **/
32 
33 #ifdef TEST_MPI3_ROUTINES
34 
35     if (rank > 0)
36       MPI_Alloc_mem(rank*ELEM_SIZE, MPI_INFO_NULL, &buf);
37     else
38       buf = NULL;
39 
40     MPI_Win_create(buf, rank*ELEM_SIZE, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &window);
41     MPI_Win_get_attr(window, MPIX_WIN_CREATE_FLAVOR, &flavor, &flag);
42 
43     if (!flag) {
44       printf("%d: MPI_Win_create - Error, no flavor\n", rank);
45       errors++;
46     } else if (*flavor != MPIX_WIN_FLAVOR_CREATE) {
47       printf("%d: MPI_Win_create - Error, bad flavor (%d)\n", rank, *flavor);
48       errors++;
49     }
50 
51     MPI_Win_get_attr(window, MPIX_WIN_MODEL, &model, &flag);
52 
53     if (!flag) {
54       printf("%d: MPI_Win_create - Error, no model\n", rank);
55       errors++;
56     } else if ( ! (*model == MPIX_WIN_SEPARATE || *model == MPIX_WIN_UNIFIED) ) {
57       printf("%d: MPI_Win_create - Error, bad model (%d)\n", rank, *model);
58       errors++;
59     }
60 
61     MPI_Win_free(&window);
62 
63     if (buf)
64       MPI_Free_mem(buf);
65 
66     /** Create using MPI_Win_allocate() **/
67 
68     MPIX_Win_allocate(rank*ELEM_SIZE, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &buf, &window);
69 
70     if (rank > 0 && buf == NULL) {
71       printf("%d: MPI_Win_allocate - Error, bad base pointer\n", rank);
72       errors++;
73     }
74 
75     MPI_Win_get_attr(window, MPIX_WIN_CREATE_FLAVOR, &flavor, &flag);
76 
77     if (!flag) {
78       printf("%d: MPI_Win_allocate - Error, no flavor\n", rank);
79       errors++;
80     } else if (*flavor != MPIX_WIN_FLAVOR_ALLOCATE) {
81       printf("%d: MPI_Win_allocate - Error, bad flavor (%d)\n", rank, *flavor);
82       errors++;
83     }
84 
85     MPI_Win_get_attr(window, MPIX_WIN_MODEL, &model, &flag);
86 
87     if (!flag) {
88       printf("%d: MPI_Win_allocate - Error, no model\n", rank);
89       errors++;
90     } else if (*model != MPIX_WIN_SEPARATE && *model != MPIX_WIN_UNIFIED) {
91       printf("%d: MPI_Win_allocate - Error, bad model (%d)\n", rank, *model);
92       errors++;
93     }
94 
95     MPI_Win_free(&window);
96 
97     /** Create using MPI_Win_create_dynamic() **/
98 
99     MPIX_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &window);
100 
101     MPI_Win_get_attr(window, MPIX_WIN_CREATE_FLAVOR, &flavor, &flag);
102 
103     if (!flag) {
104       printf("%d: MPI_Win_create_dynamic - Error, no flavor\n", rank);
105       errors++;
106     } else if (*flavor != MPIX_WIN_FLAVOR_DYNAMIC) {
107       printf("%d: MPI_Win_create_dynamic - Error, bad flavor (%d)\n", rank, *flavor);
108       errors++;
109     }
110 
111     MPI_Win_get_attr(window, MPIX_WIN_MODEL, &model, &flag);
112 
113     if (!flag) {
114       printf("%d: MPI_Win_create_dynamic - Error, no model\n", rank);
115       errors++;
116     } else if (*model != MPIX_WIN_SEPARATE && *model != MPIX_WIN_UNIFIED) {
117       printf("%d: MPI_Win_create_dynamic - Error, bad model (%d)\n", rank, *model);
118       errors++;
119     }
120 
121     MPI_Win_free(&window);
122 
123 #endif /* TEST_MPI3_ROUTINES */
124 
125     MPI_Reduce(&errors, &all_errors, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
126 
127     if (rank == 0 && all_errors == 0)
128         printf(" No Errors\n");
129 
130     MPI_Finalize();
131 
132     return 0;
133 }
134