This source file includes following definitions.
- mca_common_ompio_decode_datatype
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include "ompi_config.h"
16 #include "ddt_lib.h"
17 #include "opal/datatype/opal_convertor.h"
18 #include "opal/datatype/opal_datatype_internal.h"
19 #include "opal/runtime/opal.h"
20
21 #include <time.h>
22 #include <stdlib.h>
23 #ifdef HAVE_SYS_TIME_H
24 #include <sys/time.h>
25 #endif
26 #include <stdio.h>
27
28
29 static int
30 mca_common_ompio_decode_datatype ( ompi_datatype_t *datatype,
31 int count,
32 struct iovec **iov,
33 uint32_t *iovec_count,
34 int increment)
35 {
36
37
38
39 opal_convertor_t *convertor;
40 size_t remaining_length = 0;
41 uint32_t i;
42 uint32_t temp_count;
43 struct iovec *temp_iov=NULL;
44 size_t temp_data;
45
46
47 convertor = opal_convertor_create( opal_local_arch, 0 );
48
49 if (OMPI_SUCCESS != opal_convertor_prepare_for_send (convertor,
50 &(datatype->super),
51 count,
52 NULL)) {
53 opal_output (1, "Cannot attach the datatype to a convertor\n");
54 return OMPI_ERROR;
55 }
56
57 if ( 0 == datatype->super.size ) {
58 *iovec_count = 0;
59 *iov = NULL;
60 return OMPI_SUCCESS;
61 }
62
63 remaining_length = count * datatype->super.size;
64
65 temp_count = increment;
66 temp_iov = (struct iovec*)malloc(temp_count * sizeof(struct iovec));
67 if (NULL == temp_iov) {
68 opal_output (1, "OUT OF MEMORY\n");
69 return OMPI_ERR_OUT_OF_RESOURCE;
70 }
71
72 while (0 == opal_convertor_raw(convertor,
73 temp_iov,
74 &temp_count,
75 &temp_data)) {
76 *iovec_count = *iovec_count + temp_count;
77 *iov = (struct iovec *) realloc (*iov, *iovec_count * sizeof(struct iovec));
78 if (NULL == *iov) {
79 opal_output(1, "OUT OF MEMORY\n");
80 free(temp_iov);
81 return OMPI_ERR_OUT_OF_RESOURCE;
82 }
83 for (i=0 ; i<temp_count ; i++) {
84 (*iov)[i+(*iovec_count-temp_count)].iov_base = temp_iov[i].iov_base;
85 (*iov)[i+(*iovec_count-temp_count)].iov_len = temp_iov[i].iov_len;
86 }
87
88 remaining_length -= temp_data;
89 temp_count = increment;
90 }
91 *iovec_count = *iovec_count + temp_count;
92 if ( temp_count > 0 ) {
93 *iov = (struct iovec *) realloc (*iov, *iovec_count * sizeof(struct iovec));
94 if (NULL == *iov) {
95 opal_output(1, "OUT OF MEMORY\n");
96 free(temp_iov);
97 return OMPI_ERR_OUT_OF_RESOURCE;
98 }
99 }
100 for (i=0 ; i<temp_count ; i++) {
101 (*iov)[i+(*iovec_count-temp_count)].iov_base = temp_iov[i].iov_base;
102 (*iov)[i+(*iovec_count-temp_count)].iov_len = temp_iov[i].iov_len;
103 }
104
105 remaining_length -= temp_data;
106
107 if (remaining_length != 0) {
108 printf( "Not all raw description was been extracted (%lu bytes missing)\n",
109 (unsigned long) remaining_length );
110 }
111
112 free (temp_iov);
113
114 return OMPI_SUCCESS;
115 }
116
117 int main (int argc, char *argv[]) {
118 dt_elem_desc_t descs[185] = {
119 { .loop = { { 16, 0}, 2, 4, -1, 16} },
120 { .elem = { { 310, 9 }, 1, 12, 1, 4} },
121 { .end_loop = { {16, 1}, 2, -1, 12, 4} },
122 { .elem = { { 310, 9 }, 1, 1352, 1, 64} },
123 { .loop = { { 16, 0}, 2, 3, -1, 16} },
124 { .elem = { { 310, 9 }, 1, 8, 1, 1408} },
125 { .end_loop = { {16, 1}, 2, -1, 8, 1424} },
126 { .loop = { { 16, 0}, 2, 4, -1, 16} },
127 { .elem = { { 310, 9 }, 1, 12, 1, 10932} },
128 { .end_loop = { {16, 1}, 2, -1, 12, 10932} },
129 { .elem = { { 310, 9 }, 1, 640, 1, 10992} },
130 { .elem = { { 310, 9 }, 1, 712, 1, 14248} },
131 { .loop = { { 16, 0}, 2, 3, -1, 16} },
132 { .elem = { { 310, 9 }, 1, 8, 1, 14952} },
133 { .end_loop = { {16, 1}, 2, -1, 8, 14968} },
134 { .loop = { { 16, 0}, 2, 4, -1, 16} },
135 { .elem = { { 310, 9 }, 1, 12, 1, 21860} },
136 { .end_loop = { {16, 1}, 2, -1, 12, 21860} },
137 { .elem = { { 310, 9 }, 1, 1352, 1, 21920} },
138 { .loop = { { 16, 0}, 2, 3, -1, 16} },
139 { .elem = { { 310, 9 }, 1, 8, 1, 23264} },
140 { .end_loop = { {16, 1}, 2, -1, 8, 23280} },
141 { .loop = { { 16, 0}, 2, 4, -1, 16} },
142 { .elem = { { 310, 9 }, 1, 12, 1, 30172} },
143 { .end_loop = { {16, 1}, 2, -1, 12, 30172} },
144 { .elem = { { 310, 9 }, 1, 192, 1, 30232} },
145 { .elem = { { 310, 9 }, 1, 1160, 1, 33040} },
146 { .loop = { { 16, 0}, 2, 3, -1, 16} },
147 { .elem = { { 310, 9 }, 1, 8, 1, 34192} },
148 { .end_loop = { {16, 1}, 2, -1, 8, 34208} },
149 { .loop = { { 16, 0}, 2, 4, -1, 16} },
150 { .elem = { { 310, 9 }, 1, 12, 1, 41100} },
151 { .end_loop = { {16, 1}, 2, -1, 12, 41100} },
152 { .elem = { { 310, 9 }, 1, 1352, 1, 41160} },
153 { .loop = { { 16, 0}, 2, 3, -1, 16} },
154 { .elem = { { 310, 9 }, 1, 8, 1, 42504} },
155 { .end_loop = { {16, 1}, 2, -1, 8, 42520} },
156 { .loop = { { 16, 0}, 2, 4, -1, 16} },
157 { .elem = { { 310, 9 }, 1, 12, 1, 52028} },
158 { .end_loop = { {16, 1}, 2, -1, 12, 52028} },
159 { .elem = { { 310, 9 }, 1, 1352, 1, 52088} },
160 { .loop = { { 16, 0}, 2, 3, -1, 16} },
161 { .elem = { { 310, 9 }, 1, 8, 1, 53432} },
162 { .end_loop = { {16, 1}, 2, -1, 8, 53448} },
163 { .loop = { { 16, 0}, 2, 4, -1, 16} },
164 { .elem = { { 310, 9 }, 1, 12, 1, 60340} },
165 { .end_loop = { {16, 1}, 2, -1, 12, 60340} },
166 { .elem = { { 310, 9 }, 1, 1344, 1, 60400} },
167 { .loop = { { 16, 0}, 2, 4, -1, 16} },
168 { .elem = { { 310, 9 }, 1, 8, 1, 64360} },
169 { .end_loop = { {16, 1}, 2, -1, 8, 64360} },
170 { .loop = { { 16, 0}, 2, 4, -1, 16} },
171 { .elem = { { 310, 9 }, 1, 12, 1, 71268} },
172 { .end_loop = { {16, 1}, 2, -1, 12, 71268} },
173 { .elem = { { 310, 9 }, 1, 1352, 1, 71328} },
174 { .loop = { { 16, 0}, 2, 3, -1, 16} },
175 { .elem = { { 310, 9 }, 1, 8, 1, 72672} },
176 { .end_loop = { {16, 1}, 2, -1, 8, 72688} },
177 { .loop = { { 16, 0}, 2, 4, -1, 16} },
178 { .elem = { { 310, 9 }, 1, 12, 1, 79580} },
179 { .end_loop = { {16, 1}, 2, -1, 12, 79580} },
180 { .elem = { { 310, 9 }, 1, 896, 1, 79640} },
181 { .elem = { { 310, 9 }, 1, 456, 1, 83152} },
182 { .loop = { { 16, 0}, 2, 3, -1, 16} },
183 { .elem = { { 310, 9 }, 1, 8, 1, 83600} },
184 { .end_loop = { {16, 1}, 2, -1, 8, 83616} },
185 { .loop = { { 16, 0}, 2, 4, -1, 16} },
186 { .elem = { { 310, 9 }, 1, 12, 1, 90508} },
187 { .end_loop = { {16, 1}, 2, -1, 12, 90508} },
188 { .elem = { { 310, 9 }, 1, 1352, 1, 90568} },
189 { .loop = { { 16, 0}, 2, 3, -1, 16} },
190 { .elem = { { 310, 9 }, 1, 8, 1, 91912} },
191 { .end_loop = { {16, 1}, 2, -1, 8, 91928} },
192 { .loop = { { 16, 0}, 2, 4, -1, 16} },
193 { .elem = { { 310, 9 }, 1, 12, 1, 98820} },
194 { .end_loop = { {16, 1}, 2, -1, 12, 98820} },
195 { .elem = { { 310, 9 }, 1, 448, 1, 98880} },
196 { .elem = { { 310, 9 }, 1, 904, 1, 101944} },
197 { .loop = { { 16, 0}, 2, 3, -1, 16} },
198 { .elem = { { 310, 9 }, 1, 8, 1, 102840} },
199 { .end_loop = { {16, 1}, 2, -1, 8, 102856} },
200 { .loop = { { 16, 0}, 2, 4, -1, 16} },
201 { .elem = { { 310, 9 }, 1, 12, 1, 109748} },
202 { .end_loop = { {16, 1}, 2, -1, 12, 109748} },
203 { .elem = { { 310, 9 }, 1, 1352, 1, 109808} },
204 { .loop = { { 16, 0}, 2, 3, -1, 16} },
205 { .elem = { { 310, 9 }, 1, 8, 1, 111152} },
206 { .end_loop = { {16, 1}, 2, -1, 8, 111168} },
207 { .loop = { { 16, 0}, 2, 4, -1, 16} },
208 { .elem = { { 310, 9 }, 1, 12, 1, 118060} },
209 { .end_loop = { {16, 1}, 2, -1, 12, 118060} },
210 { .elem = { { 310, 9 }, 1, 1352, 1, 120736} },
211 { .loop = { { 16, 0}, 2, 3, -1, 16} },
212 { .elem = { { 310, 9 }, 1, 8, 1, 122080} },
213 { .end_loop = { {16, 1}, 2, -1, 8, 122096} },
214 { .loop = { { 16, 0}, 2, 4, -1, 16} },
215 { .elem = { { 310, 9 }, 1, 12, 1, 128988} },
216 { .end_loop = { {16, 1}, 2, -1, 12, 128988} },
217 { .elem = { { 310, 9 }, 1, 1352, 1, 129048} },
218 { .loop = { { 16, 0}, 2, 3, -1, 16} },
219 { .elem = { { 310, 9 }, 1, 8, 1, 130392} },
220 { .end_loop = { {16, 1}, 2, -1, 8, 130408} },
221 { .loop = { { 16, 0}, 2, 4, -1, 16} },
222 { .elem = { { 310, 9 }, 1, 12, 1, 139916} },
223 { .end_loop = { {16, 1}, 2, -1, 12, 139916} },
224 { .elem = { { 310, 9 }, 1, 1352, 1, 139976} },
225 { .loop = { { 16, 0}, 2, 3, -1, 16} },
226 { .elem = { { 310, 9 }, 1, 8, 1, 141320} },
227 { .end_loop = { {16, 1}, 2, -1, 8, 141336} },
228 { .loop = { { 16, 0}, 2, 4, -1, 16} },
229 { .elem = { { 310, 9 }, 1, 12, 1, 148228} },
230 { .end_loop = { {16, 1}, 2, -1, 12, 148228} },
231 { .elem = { { 310, 9 }, 1, 1152, 1, 148288} },
232 { .elem = { { 310, 9 }, 1, 200, 1, 152056} },
233 { .loop = { { 16, 0}, 2, 3, -1, 16} },
234 { .elem = { { 310, 9 }, 1, 8, 1, 152248} },
235 { .end_loop = { {16, 1}, 2, -1, 8, 152264} },
236 { .loop = { { 16, 0}, 2, 4, -1, 16} },
237 { .elem = { { 310, 9 }, 1, 12, 1, 159156} },
238 { .end_loop = { {16, 1}, 2, -1, 12, 159156} },
239 { .elem = { { 310, 9 }, 1, 1352, 1, 159216} },
240 { .loop = { { 16, 0}, 2, 3, -1, 16} },
241 { .elem = { { 310, 9 }, 1, 8, 1, 160560} },
242 { .end_loop = { {16, 1}, 2, -1, 8, 160576} },
243 { .loop = { { 16, 0}, 2, 4, -1, 16} },
244 { .elem = { { 310, 9 }, 1, 12, 1, 167468} },
245 { .end_loop = { {16, 1}, 2, -1, 12, 167468} },
246 { .elem = { { 310, 9 }, 1, 704, 1, 167528} },
247 { .elem = { { 310, 9 }, 1, 648, 1, 170848} },
248 { .loop = { { 16, 0}, 2, 3, -1, 16} },
249 { .elem = { { 310, 9 }, 1, 8, 1, 171488} },
250 { .end_loop = { {16, 1}, 2, -1, 8, 171504} },
251 { .loop = { { 16, 0}, 2, 4, -1, 16} },
252 { .elem = { { 310, 9 }, 1, 12, 1, 178396} },
253 { .end_loop = { {16, 1}, 2, -1, 12, 178396} },
254 { .elem = { { 310, 9 }, 1, 1352, 1, 178456} },
255 { .loop = { { 16, 0}, 2, 3, -1, 16} },
256 { .elem = { { 310, 9 }, 1, 8, 1, 179800} },
257 { .end_loop = { {16, 1}, 2, -1, 8, 179816} },
258 { .loop = { { 16, 0}, 2, 4, -1, 16} },
259 { .elem = { { 310, 9 }, 1, 12, 1, 186708} },
260 { .end_loop = { {16, 1}, 2, -1, 12, 186708} },
261 { .elem = { { 310, 9 }, 1, 256, 1, 186768} },
262 { .elem = { { 310, 9 }, 1, 1096, 1, 189640} },
263 { .loop = { { 16, 0}, 2, 3, -1, 16} },
264 { .elem = { { 310, 9 }, 1, 8, 1, 190728} },
265 { .end_loop = { {16, 1}, 2, -1, 8, 190744} },
266 { .loop = { { 16, 0}, 2, 4, -1, 16} },
267 { .elem = { { 310, 9 }, 1, 12, 1, 197636} },
268 { .end_loop = { {16, 1}, 2, -1, 12, 197636} },
269 { .elem = { { 310, 9 }, 1, 1352, 1, 197696} },
270 { .loop = { { 16, 0}, 2, 3, -1, 16} },
271 { .elem = { { 310, 9 }, 1, 8, 1, 199040} },
272 { .end_loop = { {16, 1}, 2, -1, 8, 199056} },
273 { .loop = { { 16, 0}, 2, 4, -1, 16} },
274 { .elem = { { 310, 9 }, 1, 12, 1, 208564} },
275 { .end_loop = { {16, 1}, 2, -1, 12, 208564} },
276 { .elem = { { 310, 9 }, 1, 1352, 1, 208624} },
277 { .loop = { { 16, 0}, 2, 3, -1, 16} },
278 { .elem = { { 310, 9 }, 1, 8, 1, 209968} },
279 { .end_loop = { {16, 1}, 2, -1, 8, 209984} },
280 { .elem = { { 310, 9 }, 1, 12, 1, 216876} },
281 { .elem = { { 310, 9 }, 1, 16, 1, 216936} },
282 { .elem = { { 310, 9 }, 1, 16, 1, 217000} },
283 { .elem = { { 310, 9 }, 1, 16, 1, 217064} },
284 { .elem = { { 310, 9 }, 1, 16, 1, 217128} },
285 { .elem = { { 310, 9 }, 1, 16, 1, 217192} },
286 { .elem = { { 310, 9 }, 1, 16, 1, 217256} },
287 { .elem = { { 310, 9 }, 1, 16, 1, 217320} },
288 { .elem = { { 310, 9 }, 1, 16, 1, 217384} },
289 { .elem = { { 310, 9 }, 1, 16, 1, 217448} },
290 { .elem = { { 310, 9 }, 1, 16, 1, 217512} },
291 { .elem = { { 310, 9 }, 1, 16, 1, 217576} },
292 { .elem = { { 310, 9 }, 1, 16, 1, 217640} },
293 { .elem = { { 310, 9 }, 1, 16, 1, 217704} },
294 { .elem = { { 310, 9 }, 1, 16, 1, 217768} },
295 { .elem = { { 310, 9 }, 1, 16, 1, 217832} },
296 { .elem = { { 310, 9 }, 1, 16, 1, 217896} },
297 { .elem = { { 310, 9 }, 1, 16, 1, 217960} },
298 { .elem = { { 310, 9 }, 1, 16, 1, 218024} },
299 { .elem = { { 310, 9 }, 1, 16, 1, 218088} },
300 { .elem = { { 310, 9 }, 1, 16, 1, 218152} },
301 { .elem = { { 310, 9 }, 1, 16, 1, 218216} },
302 { .elem = { { 310, 9 }, 1, 8, 1, 218280} },
303 { .end_loop = { {0, 1}, 184, -1, 31684, 4} },
304 };
305 opal_init_util(NULL, NULL);
306 ompi_datatype_init();
307
308 ompi_datatype_t * datatype = OBJ_NEW(ompi_datatype_t);
309
310 datatype->super.flags = 3332;
311 datatype->super.id = 0;
312 datatype->super.bdt_used = 512;
313 datatype->super.size = 31684;
314 datatype->super.true_lb = 4;
315 datatype->super.true_ub = 218288;
316 datatype->super.lb = 0;
317 datatype->super.ub = 218344;
318 datatype->super.nbElems = 31684;
319 datatype->super.align = 1;
320 datatype->super.loops = 1146;
321 datatype->super.desc.length = 3351;
322 datatype->super.desc.used = 184;
323 datatype->super.desc.desc = descs;
324 datatype->super.opt_desc.length = 3351;
325 datatype->super.opt_desc.used = 184;
326 datatype->super.opt_desc.desc = descs;
327
328
329 uint32_t iovec_count_300 = 0;
330 struct iovec * iov_300 = NULL;
331 mca_common_ompio_decode_datatype ( datatype, 1, &iov_300, &iovec_count_300, 300);
332
333
334
335 uint32_t iovec_count_10 = 0;
336 struct iovec * iov_10 = NULL;
337 mca_common_ompio_decode_datatype ( datatype, 1, &iov_10, &iovec_count_10, 10);
338
339
340
341 uint32_t iovec_count_1 = 0;
342 struct iovec * iov_1 = NULL;
343 mca_common_ompio_decode_datatype ( datatype, 1, &iov_1, &iovec_count_1, 1);
344
345
346 assert(iovec_count_300 == iovec_count_10);
347 assert(iovec_count_300 == iovec_count_1);
348
349
350 for (uint32_t i = 0; i < iovec_count_300; i++) {
351 assert(iov_300[i].iov_base == iov_10[i].iov_base);
352 assert(iov_300[i].iov_len == iov_10[i].iov_len);
353 assert(iov_300[i].iov_base == iov_1[i].iov_base);
354 assert(iov_300[i].iov_len == iov_1[i].iov_len);
355 }
356
357 return 0;
358 }
359