1 /*
2 * Copyright (C) by Argonne National Laboratory
3 * See COPYRIGHT in top-level directory
4 */
5
6 /* Regression test for MPICH trac ticket #972, originally written by
7 * Rob Latham <robl@mcs.anl.gov> as a simplification of a type
8 * encountered by the HDF5 library.
9 *
10 * Should be run with 1 process. */
11
12 #include <stdio.h>
13 #include "mpi.h"
14 #include "mpitest.h"
15
16 /* uncomment to use debugging routine in MPICH
17 extern int MPIR_Datatype_debug(MPI_Datatype type, int depth);
18 */
19
20 int makeHDF5type0(MPI_Datatype * type);
makeHDF5type0(MPI_Datatype * type)21 int makeHDF5type0(MPI_Datatype * type)
22 {
23 MPI_Datatype ctg, vect, structype, vec2, structype2, vec3, structype3, vec4, structype4, vec5;
24
25 int b;
26 MPI_Aint d;
27 MPI_Datatype tmp_type;
28
29 MPI_Type_contiguous(4, MPI_BYTE, &ctg);
30
31 MPI_Type_vector(1, 5, 1, ctg, &vect);
32
33 MPI_Type_create_resized(vect, 0, 40, &structype);
34
35 MPI_Type_vector(1, 5, 1, structype, &vec2);
36
37 b = 1;
38 d = 2000;
39 MPI_Type_create_struct(1, &b, &d, &vec2, &tmp_type);
40 MPI_Type_create_resized(tmp_type, 0, 400, &structype2);
41 MPI_Type_free(&tmp_type);
42
43 MPI_Type_vector(1, 5, 1, structype2, &vec3);
44
45 MPI_Type_create_resized(vec3, 0, 4000, &structype3);
46
47 MPI_Type_vector(1, 5, 1, structype3, &vec4);
48
49 MPI_Type_create_resized(vec4, 0, 40000, &structype4);
50
51 MPI_Type_vector(1, 1, 1, structype4, &vec5);
52
53 b = 1;
54 d = 160000;
55 MPI_Type_create_struct(1, &b, &d, &vec5, &tmp_type);
56 MPI_Type_create_resized(tmp_type, 0, 200000, type);
57 MPI_Type_free(&tmp_type);
58
59 MPI_Type_free(&ctg);
60 MPI_Type_free(&vect);
61 MPI_Type_free(&structype);
62 MPI_Type_free(&vec2);
63 MPI_Type_free(&structype2);
64 MPI_Type_free(&vec3);
65 MPI_Type_free(&structype3);
66 MPI_Type_free(&vec4);
67 MPI_Type_free(&structype4);
68 MPI_Type_free(&vec5);
69 MPI_Type_commit(type);
70
71 return 0;
72 }
73
74 int makeHDF5type1(MPI_Datatype * type);
makeHDF5type1(MPI_Datatype * type)75 int makeHDF5type1(MPI_Datatype * type)
76 {
77 MPI_Datatype ctg, vect, structype, vec2, structype2, vec3, structype3, vec4, structype4, vec5;
78
79 int b;
80 MPI_Aint d;
81 MPI_Datatype tmp_type;
82
83 MPI_Type_contiguous(4, MPI_BYTE, &ctg);
84
85 MPI_Type_vector(1, 5, 1, ctg, &vect);
86
87 b = 1;
88 d = 20;
89 MPI_Type_create_struct(1, &b, &d, &vect, &tmp_type);
90 MPI_Type_create_resized(tmp_type, 0, 40, &structype);
91 MPI_Type_free(&tmp_type);
92
93 MPI_Type_vector(1, 5, 1, structype, &vec2);
94
95 MPI_Type_create_resized(vec2, 0, 400, &structype2);
96
97 MPI_Type_vector(1, 5, 1, structype2, &vec3);
98
99 MPI_Type_create_resized(vec3, 0, 4000, &structype3);
100
101 MPI_Type_vector(1, 5, 1, structype3, &vec4);
102
103 MPI_Type_create_resized(vec4, 0, 40000, &structype4);
104
105 MPI_Type_vector(1, 1, 1, structype4, &vec5);
106
107 b = 1;
108 d = 160000;
109 MPI_Type_create_struct(1, &b, &d, &vec5, &tmp_type);
110 MPI_Type_create_resized(tmp_type, 0, 200000, type);
111 MPI_Type_free(&tmp_type);
112
113 MPI_Type_free(&ctg);
114 MPI_Type_free(&vect);
115 MPI_Type_free(&structype);
116 MPI_Type_free(&vec2);
117 MPI_Type_free(&structype2);
118 MPI_Type_free(&vec3);
119 MPI_Type_free(&structype3);
120 MPI_Type_free(&vec4);
121 MPI_Type_free(&structype4);
122 MPI_Type_free(&vec5);
123 MPI_Type_commit(type);
124
125 return 0;
126 }
127
128 int makeHDF5type(MPI_Datatype * type);
makeHDF5type(MPI_Datatype * type)129 int makeHDF5type(MPI_Datatype * type)
130 {
131 int i;
132
133 #define NTYPES 2
134
135 int blocklens[NTYPES];
136 MPI_Aint disps[NTYPES];
137
138 MPI_Datatype types[NTYPES];
139 makeHDF5type0(&(types[0]));
140 makeHDF5type1(&(types[1]));
141
142 for (i = 0; i < NTYPES; i++) {
143 blocklens[i] = 1;
144 disps[i] = 0;
145 }
146
147 MPI_Type_create_struct(NTYPES, blocklens, disps, types, type);
148 MPI_Type_commit(type);
149
150 for (i = 0; i < NTYPES; i++) {
151 MPI_Type_free(&(types[i]));
152 }
153 return 0;
154 }
155
main(int argc,char ** argv)156 int main(int argc, char **argv)
157 {
158 MPI_Datatype hdf5type;
159
160 MTest_Init(&argc, &argv);
161 makeHDF5type(&hdf5type);
162
163 /*MPIR_Datatype_debug(hdf5type, 32); */
164
165 MPI_Type_free(&hdf5type);
166 MTest_Finalize(0);
167
168 return 0;
169 }
170