SIONlib  2.0.0-rc.3
Scalable I/O library for parallel access to task-local files
sion_generic.c
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2021 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
10 #define _XOPEN_SOURCE 700
11 
12 #include <stdint.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 
17 #include "sion_common.h"
18 #include "sion_const.h"
19 #include "sion_debug.h"
20 #include "sion_error_handler.h"
21 #include "sion_fd.h"
22 #include "sion_filedesc.h"
23 #include "sion_flags.h"
24 #include "sion_generic.h"
25 #include "sion_generic_apidesc.h"
26 #include "sion_generic_buddy.h"
27 #include "sion_generic_internal.h"
28 #include "sion_generic_mapped.h"
29 #include "sion_internal.h"
30 
31 int sion_generic_create_api(char *name)
32 {
33  int apiid = SION_ID_UNDEF;
34  _sion_generic_apidesc *sion_apidesc;
35 
36  sion_apidesc = _sion_generic_alloc_apidesc();
37  if (!sion_apidesc) {
38  return _sion_errorprint(
39  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "_sion_generic_create_api: problems to alloc apidesc, aborting ...\n");
40  }
41  _sion_generic_init_apidesc(sion_apidesc);
42 
43  if (name == NULL) {
44  return _sion_errorprint(
45  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "_sion_generic_create_api: name for API not given, aborting ...\n");
46  }
47 
48  sion_apidesc->name = strdup(name);
49 
50  apiid = _sion_newvcd(sion_apidesc, SION_APIDESCRIPTOR);
51  sion_apidesc->aid = apiid;
52  sion_apidesc->level = SION_GENERIC_API_LEVEL_NONE;
53 
54  DPRINTFP((2, "_sion_generic_create_api", _SION_DEFAULT_RANK, "API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
55 
56  return apiid;
57 }
58 
60 {
61  _sion_generic_apidesc *sion_apidesc;
62  int rc = SION_SUCCESS;
63 
64  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
65  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_free_api: invalid sion_apidesc %d", aid);
66  }
67  _sion_freevcd(aid);
68  rc = _sion_generic_free_apidesc(sion_apidesc);
69 
70  return rc;
71 }
72 
73 int sion_generic_register_create_local_commgroup_cb(int aid, int create_lcg_cb(void **, void *, int, int, int, int, int, int))
74 {
75  _sion_generic_apidesc *sion_apidesc;
76  int rc = SION_SUCCESS;
77 
78  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
79  return _sion_errorprint(
80  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_create_local_commgroup_cb: invalid sion_apidesc %d", aid);
81  }
82 
83  if (sion_apidesc->create_lcg_cb != NULL) {
84  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
85  "sion_generic_register_create_local_commgroup_cb: update_cb already registered for apiid=%d", aid);
86  }
87  sion_apidesc->create_lcg_cb = create_lcg_cb;
88 
89  _sion_generic_update_api_level(sion_apidesc);
90 
91  DPRINTFP((2, "sion_generic_register_create_local_commgroup_cb", _SION_DEFAULT_RANK,
92  "create_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
93 
94  return rc;
95 }
96 
97 int sion_generic_register_free_local_commgroup_cb(int aid, int free_lcg_cb(void *))
98 {
99  _sion_generic_apidesc *sion_apidesc;
100  int rc = SION_SUCCESS;
101 
102  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
103  return _sion_errorprint(
104  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_free_local_commgroup_cb: invalid sion_apidesc %d", aid);
105  }
106 
107  if (sion_apidesc->free_lcg_cb != NULL) {
108  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
109  "sion_generic_register_free_local_commgroup_cb: update_cb already registered for apiid=%d", aid);
110  }
111  sion_apidesc->free_lcg_cb = free_lcg_cb;
112 
113  _sion_generic_update_api_level(sion_apidesc);
114 
115  DPRINTFP((2, "sion_generic_register_free_local_commgroup_cb", _SION_DEFAULT_RANK, "free_lcg_cb registered for apiid=%s (%d)\n",
116  sion_apidesc->name, aid));
117 
118  return rc;
119 }
120 
121 int sion_generic_register_barrier_cb(int aid, int barrier_cb(void *))
122 {
123  _sion_generic_apidesc *sion_apidesc;
124  int rc = SION_SUCCESS;
125 
126  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
127  return _sion_errorprint(
128  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_barrier_cb: invalid sion_apidesc %d", aid);
129  }
130 
131  if (sion_apidesc->barrier_cb != NULL) {
132  return _sion_errorprint(
133  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_barrier_cb: barrier_cb already registered for apiid=%d", aid);
134  }
135  sion_apidesc->barrier_cb = barrier_cb;
136 
137  _sion_generic_update_api_level(sion_apidesc);
138 
139  DPRINTFP((2, "sion_generic_register_barrier_cb", _SION_DEFAULT_RANK, "barrier_cb registered for apiid=%s (%d)\n",
140  sion_apidesc->name, aid));
141 
142  return rc;
143 }
144 
145 int sion_generic_register_bcastr_cb(int aid, int bcastr_cb(void *, void *, int, int, int))
146 {
147  _sion_generic_apidesc *sion_apidesc;
148  int rc = SION_SUCCESS;
149 
150  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
151  return _sion_errorprint(
152  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_bcastr_cb: invalid sion_apidesc %d", aid);
153  }
154 
155  if (sion_apidesc->bcastr_cb != NULL) {
156  return _sion_errorprint(
157  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_bcastr_cb: bcastr_cb already registered for apiid=%d", aid);
158  }
159  sion_apidesc->bcastr_cb = bcastr_cb;
160 
161  _sion_generic_update_api_level(sion_apidesc);
162 
163  DPRINTFP((2, "sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK, "bcastr_cb registered for apiid=%s (%d)\n",
164  sion_apidesc->name, aid));
165 
166  return rc;
167 }
168 
169 int sion_generic_register_gatherr_cb(int aid, int gatherr_cb(void *, void *, void *, int, int, int))
170 {
171  _sion_generic_apidesc *sion_apidesc;
172  int rc = SION_SUCCESS;
173 
174  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
175  return _sion_errorprint(
176  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_gatherr_cb: invalid sion_apidesc %d", aid);
177  }
178 
179  if (sion_apidesc->gatherr_cb != NULL) {
180  return _sion_errorprint(
181  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_gatherr_cb: gatherr_cb already registered for apiid=%d", aid);
182  }
183  sion_apidesc->gatherr_cb = gatherr_cb;
184 
185  _sion_generic_update_api_level(sion_apidesc);
186 
187  DPRINTFP((2, "sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK, "gatherr_cb registered for apiid=%s (%d)\n",
188  sion_apidesc->name, aid));
189 
190  return rc;
191 }
192 
193 int sion_generic_register_gathervr_cb(int aid, int gathervr_cb(void *, void *, void *, int, int *, int, int))
194 {
195  _sion_generic_apidesc *sion_apidesc;
196  int rc = SION_SUCCESS;
197 
198  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
199  return _sion_errorprint(
200  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_gathervr_cb: invalid sion_apidesc %d", aid);
201  }
202 
203  if (sion_apidesc->gathervr_cb != NULL) {
204  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
205  "sion_generic_register_gathervr_cb: gathervr_cb already registered for apiid=%d", aid);
206  }
207  sion_apidesc->gathervr_cb = gathervr_cb;
208 
209  _sion_generic_update_api_level(sion_apidesc);
210 
211  DPRINTFP((2, "sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK, "gathervr_cb registered for apiid=%s (%d)\n",
212  sion_apidesc->name, aid));
213 
214  return rc;
215 }
216 
217 int sion_generic_register_scatterr_cb(int aid, int scatterr_cb(void *, void *, void *, int, int, int))
218 {
219  _sion_generic_apidesc *sion_apidesc;
220  int rc = SION_SUCCESS;
221 
222  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
223  return _sion_errorprint(
224  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_scatterr_cb: invalid sion_apidesc %d", aid);
225  }
226 
227  if (sion_apidesc->scatterr_cb != NULL) {
228  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
229  "sion_generic_register_scatterr_cb: scatterr_cb already registered for apiid=%d", aid);
230  }
231  sion_apidesc->scatterr_cb = scatterr_cb;
232 
233  _sion_generic_update_api_level(sion_apidesc);
234 
235  DPRINTFP((2, "sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK, "scatterr_cb registered for apiid=%s (%d)\n",
236  sion_apidesc->name, aid));
237 
238  return rc;
239 }
240 
241 int sion_generic_register_scattervr_cb(int aid, int scattervr_cb(void *, void *, void *, int, int *, int, int))
242 {
243  _sion_generic_apidesc *sion_apidesc;
244  int rc = SION_SUCCESS;
245 
246  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
247  return _sion_errorprint(
248  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
249  }
250 
251  if (sion_apidesc->scattervr_cb != NULL) {
252  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
253  "sion_generic_register_scattervr_cb: scattervr_cb already registered for apiid=%d", aid);
254  }
255  sion_apidesc->scattervr_cb = scattervr_cb;
256 
257  _sion_generic_update_api_level(sion_apidesc);
258 
259  DPRINTFP((2, "sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK, "scattervr_cb registered for apiid=%s (%d)\n",
260  sion_apidesc->name, aid));
261 
262  return rc;
263 }
264 
266  int64_t gather_execute_cb(const void *, int64_t, void *, int, int, int, int, int64_t process_cb(const void *, int64_t *, int),
267  void *, bool spec_iterator_cb(void *, int64_t *)))
268 {
269  _sion_generic_apidesc *sion_apidesc;
270  int rc = SION_SUCCESS;
271 
272  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
273  return _sion_errorprint(
274  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_gather_and_execute_cb: invalid sion_apidesc %d", aid);
275  }
276 
277  if (sion_apidesc->gather_execute_cb != NULL) {
278  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
279  "sion_generic_register_gather_and_execute_cb: scattervr_cb already registered for apiid=%d", aid);
280  }
281  sion_apidesc->gather_execute_cb = gather_execute_cb;
282 
283  _sion_generic_update_api_level(sion_apidesc);
284 
285  DPRINTFP((2, "sion_generic_register_gather_and_execute_cb", _SION_DEFAULT_RANK,
286  "gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
287 
288  return rc;
289 }
290 
292  int64_t execute_scatter_cb(void *, int64_t, void *, int, int, int, int, int64_t process_cb(void *, int64_t *, int), void *,
293  bool spec_iterator_cb(void *, int64_t *)))
294 {
295  _sion_generic_apidesc *sion_apidesc;
296  int rc = SION_SUCCESS;
297 
298  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
299  return _sion_errorprint(
300  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_execute_and_scatter_cb: invalid sion_apidesc %d", aid);
301  }
302 
303  if (sion_apidesc->execute_scatter_cb != NULL) {
304  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
305  "sion_generic_register_execute_and_scatter_cb: scattervr_cb already registered for apiid=%d", aid);
306  }
307  sion_apidesc->execute_scatter_cb = execute_scatter_cb;
308 
309  DPRINTFP((2, "sion_generic_register_execute_and_scatter_cb", _SION_DEFAULT_RANK,
310  "gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
311 
312  return rc;
313 }
314 
315 int sion_generic_register_get_multi_filename_cb(int aid, char *get_multi_filename_cb(const char *, int))
316 {
317  _sion_generic_apidesc *sion_apidesc;
318  int rc = 0;
319 
320  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
321  return _sion_errorprint(-1, _SION_ERROR_RETURN, "sion_generic_register_get_multi_filename_cb: invalid sion_apidesc %d", aid);
322  }
323 
324  if (sion_apidesc->get_multi_filename_cb != NULL) {
325  return _sion_errorprint(-1, _SION_ERROR_RETURN,
326  "sion_generic_register_get_multi_filename_cb: get_multi_filename_cb already registered for apiid=%d", aid);
327  }
328  sion_apidesc->get_multi_filename_cb = get_multi_filename_cb;
329 
330  _sion_generic_update_api_level(sion_apidesc);
331 
332  DPRINTFP((2, "sion_generic_register_get_multi_filename_cb", -1, "get_multi_filename_cb registered for apiid=%s (%d)\n",
333  sion_apidesc->name, aid));
334 
335  return rc;
336 }
337 
338 int sion_generic_register_get_capability_cb(int aid, int get_capability_cb(void *))
339 {
340  _sion_generic_apidesc *sion_apidesc;
341  int rc = SION_SUCCESS;
342 
343  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
344  return _sion_errorprint(
345  SION_NOT_SUCCESS, _SION_ERROR_RETURN, "sion_generic_register_get_capability_cb: invalid sion_apidesc %d", aid);
346  }
347 
348  if (sion_apidesc->get_capability_cb != NULL) {
349  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
350  "sion_generic_register_get_capability_cb: get_capability_cb already registered for apiid=%d", aid);
351  }
352  sion_apidesc->get_capability_cb = get_capability_cb;
353 
354  _sion_generic_update_api_level(sion_apidesc);
355 
356  DPRINTFP((2, "sion_generic_register_get_capability_cb", _SION_DEFAULT_RANK, "get_capability_cb registered for apiid=%s (%d)\n",
357  sion_apidesc->name, aid));
358 
359  return rc;
360 }
361 
363 {
364  ONLY_DEBUG(int grank);
365  int rc = SION_SUCCESS;
366  _sion_filedesc *sion_filedesc;
367  _sion_generic_gendata *sion_gendata;
368  _sion_generic_apidesc *sion_apidesc;
369 
370  DPRINTFTS(-1, "enter sion_generic_parclose");
371 
372  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
373  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_parclose: invalid sion_filedesc %d", sid);
374  }
375  sion_gendata = sion_filedesc->dataptr;
376  sion_apidesc = sion_gendata->apidesc;
377 
378  ONLY_DEBUG(grank = sion_gendata->grank);
379 
380  DPRINTFP((1, "sion_generic_parclose", grank, "enter parallel close of sid %d (%d file)\n", sid, sion_filedesc->nfiles));
381 
382  if (!sion_filedesc->usebuddy) {
383  rc = _sion_parclose_generic(sid, sion_filedesc->rank, sion_filedesc->ntasks, _SION_INTERNAL_FLAG_NORMAL, sion_gendata, NULL);
384  } else {
385  rc = _sion_parclose_generic_buddy(sid, sion_filedesc->rank, sion_filedesc->ntasks, sion_gendata);
386  }
387 
388  if (sion_apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
389  sion_apidesc->free_lcg_cb(sion_gendata->comm_data_local);
390  }
391 
392  _sion_freevcd(sid);
393 
394  sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
395 
396  free(sion_gendata);
397 
398  DPRINTFP((1, "sion_generic_parclose", grank, "leave parallel close of sid %d\n", sid));
399  DPRINTFTS(-1, "leave sion_generic_parclose");
400 
401  return rc;
402 }
403 
405 {
406  sion_generic_mapped_options *options = malloc(sizeof(sion_generic_mapped_options));
407  if (options) {
408  *options = SION_GENERIC_MAPPED_OPTIONS_INIT;
409  }
410  return options;
411 }
412 
414 {
415  free(options);
416 }
417 
419 {
420  options->chunksizes = chunksizes;
421 }
422 
424 {
425  options->fsblksize = fsblksize;
426 }
427 
429 {
430  options->keyval_mode = keyval_mode;
431 }
432 
434 {
435  options->lowlevel_api = lowlevel_api;
436 }
437 
439 {
440  options->endianness = endianness;
441 }
442 
443 int sion_generic_paropen_mapped(int aid, char *fname, const char *file_mode, int *numFiles, void *gcommgroup, int grank,
444  int gsize, int *nlocaltasks, int **globalranks, int64_t **chunksizes, int **mapping_filenrs, int **mapping_lranks,
445  int32_t *fsblksize, FILE **fileptr)
446 {
447  int sid;
448  _sion_flags_store *flags_store = _sion_parse_flags(file_mode);
449  if (!flags_store) {
450  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
451  "sion_generic_paropen_mapped: could not parse file mode in %s, aborting ...\n", file_mode);
452  }
453  sid = _sion_generic_paropen_mapped(aid, fname, flags_store, numFiles, gcommgroup, grank, gsize, nlocaltasks, globalranks,
454  chunksizes, mapping_filenrs, mapping_lranks, fsblksize, fileptr);
455  _sion_flags_destroy_store(&flags_store);
456  return sid;
457 }
458 
459 int _sion_generic_paropen_mapped(int aid, char *fname, const _sion_flags_store *flags_store, int *numFiles, void *gcommgroup,
460  int grank, int gsize, int *nlocaltasks, int **globalranks, int64_t **chunksizes, int **mapping_filenrs, int **mapping_lranks,
461  int32_t *fsblksize, FILE **fileptr)
462 {
463  int rc, sid = SION_ID_UNDEF;
464  _sion_filedesc *sion_filedesc;
465  _sion_generic_apidesc *sion_apidesc;
466  _sion_generic_gendata *sion_gendata;
467 
468  DPRINTFTS(grank, "enter sion_generic_paropen_mapped");
469  DPRINTFP((1, "sion_generic_paropen_mapped", grank,
470  "enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n", fname, grank, gsize, *nlocaltasks));
471 
472  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
473  return _sion_errorprint(
474  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
475  }
476 
477  if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) || (!sion_apidesc->bcastr_cb)
478  || (!sion_apidesc->gatherr_cb) || (!sion_apidesc->gathervr_cb) || (!sion_apidesc->scatterr_cb)
479  || (!sion_apidesc->scattervr_cb)) {
480  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
481  "sion_generic_paropen_mapped: API %s not correctly initalized, aborting", sion_apidesc->name);
482  }
483 
484  /* check parameters */
485  if ((grank < 0) || (grank >= gsize)) {
486  return _sion_errorprint(
487  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: global rank %d not valid (0..%d)", grank, gsize);
488  }
489 
490  /* create data container */
491  sion_gendata = _sion_generic_alloc_gendata();
492  if (!sion_gendata) {
493  return _sion_errorprint(
494  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
495  }
496  _sion_generic_init_gendata(sion_gendata);
497 
498  sion_gendata->aid = aid;
499  sion_gendata->apidesc = sion_apidesc;
500  sion_gendata->comm_data_global = gcommgroup;
501  sion_gendata->grank = grank;
502  sion_gendata->gsize = gsize;
503  sion_gendata->lrank = -1;
504  sion_gendata->lsize = -1;
505  sion_gendata->filenumber = -1;
506  sion_gendata->numfiles = -1;
507  sion_gendata->comm_data_local = NULL;
508 
509  if (!(flags_store->mask & (_SION_FMODE_WRITE | _SION_FMODE_READ))) {
510  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: unknown file mode");
511  }
512 
513  sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
514 
515  // FIXME: re-enable debug output of file mode
516  // DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter parallel mapped open in %s mode\n", file_mode));
517  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter parallel mapped open\n"));
518  rc = _sion_paropen_mapped_generic(sid, fname, flags_store->mask, numFiles, nlocaltasks, globalranks, chunksizes,
519  mapping_filenrs, mapping_lranks, fsblksize, grank, gsize, _SION_INTERNAL_FLAG_NORMAL, fileptr, sion_gendata);
520  sion_gendata->numfiles = *numFiles;
521  // FIXME: re-enable debug output of file mode
522  // DPRINTFP((1, "sion_generic_paropen_mapped", sion_gendata->grank, "leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", sion_gendata->numfiles,
523  // file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
524  DPRINTFP(
525  (1, "sion_generic_paropen_mapped", sion_gendata->grank, "leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
526  sion_gendata->numfiles, sion_gendata->lsize, sid, sion_gendata->grank));
527 
528  /* test sid again and get internal data structure */
529  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
530  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: invalid sion_filedesc %d", sid);
531  }
532 
533  /* store additional data */
534  sion_filedesc->dataptr = sion_gendata;
535 
536  /* Bug? */
537 
538  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
539  DPRINTFTS(-1, "leave sion_generic_paropen_mapped");
540 
541  return rc;
542 }
543 
544 int sion_generic_paropen_mapped_with_options(int aid, const char *fname, sion_open_mode mode, int numfiles, void *gcommgroup,
545  int grank, int gsize, int ntasks, const int *globalranks, const int *filenumbers, const int *localranks,
546  const sion_generic_mapped_options *options_)
547 {
548  sion_generic_mapped_options options = (options_) ? *options_ : SION_GENERIC_MAPPED_OPTIONS_INIT;
549 
550  DPRINTFTS(grank, "enter sion_generic_paropen_mapped");
551  DPRINTFP((1, "sion_generic_paropen_mapped", grank,
552  "enter generic parallel mapped open of file %s (global: %d of %d, ntasks %d)\n", fname, grank, gsize, ntasks));
553 
554  _sion_generic_apidesc *apidesc;
555  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(apidesc = _sion_vcdtovcon(aid))) {
556  return _sion_errorprint(
557  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
558  }
559 
560  if ((!apidesc->create_lcg_cb) || (!apidesc->free_lcg_cb) || (!apidesc->barrier_cb) || (!apidesc->bcastr_cb)
561  || (!apidesc->gatherr_cb) || (!apidesc->gathervr_cb) || (!apidesc->scatterr_cb) || (!apidesc->scattervr_cb)) {
562  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
563  "sion_generic_paropen_mapped: API %s not correctly initalized, aborting", apidesc->name);
564  }
565 
566  /* check parameters */
567  if ((grank < 0) || (grank >= gsize)) {
568  return _sion_errorprint(
569  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: global rank %d not valid (0..%d)", grank, gsize);
570  }
571 
572  /* create data container */
573  _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
574  if (!gendata) {
575  return _sion_errorprint(
576  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
577  }
578  _sion_generic_init_gendata(gendata);
579 
580  gendata->aid = aid;
581  gendata->apidesc = apidesc;
582  gendata->comm_data_global = gcommgroup;
583  gendata->grank = grank;
584  gendata->gsize = gsize;
585  gendata->lrank = -1;
586  gendata->lsize = -1;
587  gendata->filenumber = -1;
588  gendata->numfiles = numfiles;
589  gendata->comm_data_local = NULL;
590 
591  int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
592 
593  // FIXME: re-enable debug output of file mode
594  // DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter parallel mapped open in %s mode\n", file_mode));
595  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter parallel mapped open\n"));
596  int rc = _sion_paropen_mapped_generic_with_options(
597  sid, fname, mode, &gendata->numfiles, ntasks, globalranks, filenumbers, localranks, grank, gsize, gendata, &options);
598  // FIXME: re-enable debug output of file mode
599  // DPRINTFP((1, "sion_generic_paropen_mapped", gendata->grank, "leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", gendata->numfiles,
600  // file_mode, gendata->lsize, sid, gendata->grank));
601  DPRINTFP((1, "sion_generic_paropen_mapped", gendata->grank, "leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
602  gendata->numfiles, gendata->lsize, sid, gendata->grank));
603 
604  /* test sid again and get internal data structure */
605  _sion_filedesc *filedesc;
606  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
607  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen_mapped: invalid sion_filedesc %d", sid);
608  }
609 
610  /* store additional data */
611  filedesc->dataptr = gendata;
612 
613  /* Bug? */
614 
615  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
616  DPRINTFTS(-1, "leave sion_generic_paropen_mapped");
617 
618  return rc;
619 }
620 
621 int sion_generic_parclose_mapped(int sid)
622 {
623  int grank, gsize, rc;
624  _sion_filedesc *sion_filedesc;
625  _sion_generic_gendata *sion_gendata;
626 
627  DPRINTFTS(-1, "enter sion_generic_parclose_mapped");
628  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
629  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_parclose_mapped: invalid sion_filedesc %d", sid);
630  }
631  sion_gendata = sion_filedesc->dataptr;
632 
633  grank = sion_gendata->grank;
634  gsize = sion_gendata->gsize;
635 
636  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "enter parallel close of sid %d\n", sid));
637 
638  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "closing %d file(s)\n", sion_filedesc->nfiles));
639 
640  rc = _sion_parclose_mapped_generic(sid, grank, gsize, sion_gendata);
641 
642  _sion_freevcd(sid);
643 
644  _sion_generic_free_gendata(sion_gendata);
645 
646  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "leave parallel close of sid %d\n", sid));
647  DPRINTFTS(-1, "leave sion_generic_parclose_mapped");
648 
649  return rc;
650 }
651 
652 int _sion_generic_get_and_distribute_info_from_file(_sion_generic_gendata *sion_gendata, const char *fname)
653 {
654  int sid = -1, t = 0;
655  int rc = SION_SUCCESS;
656  int *tasksinfile;
657  int mapping_size = -1;
658  int32_t *mapping = NULL;
659  int32_t lpos[2];
660  _sion_generic_apidesc *sion_apidesc;
661 
662  sion_apidesc = sion_gendata->apidesc;
663 
664  if (sion_gendata->grank == 0) {
665  /* open and get mapping of sion file */
666  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "before open\n"));
667  sid = _sion_open_read(fname, _SION_READ_MASTER_ONLY_OF_MULTI_FILES, &SION_OPTIONS_INIT);
668  if (sid >= 0) {
669  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after open\n"));
670  rc = sion_get_mapping(sid, &mapping_size, &mapping, &sion_gendata->numfiles);
671  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "sion file %d files\n",
672  sion_gendata->numfiles));
673  } else {
674  sion_gendata->numfiles = -1;
675  }
676  }
677 
678  /* each task has to know if more than file was used in sion file */
679  sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
680 
681  if ((sion_gendata->grank == 0) && (sion_gendata->numfiles > 1)) {
682  if (mapping_size != sion_gendata->gsize) {
683  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
684  "_sion_generic_get_and_distribute_info_from_file: Incorrect sum of ntasks of files %d <> %d\n", mapping_size,
685  sion_gendata->gsize);
686  }
687  }
688 
689  if (sion_gendata->numfiles < 0) {
690  return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
691  "_sion_generic_get_and_distribute_info_from_file: could not get numfiles from sion file\n");
692  }
693 
694  if (sion_gendata->numfiles > 1) {
695  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "before scatter\n"));
696  if (sion_gendata->grank == 0) {
697  for (t = 0; t < mapping_size; t++) {
698  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, " %d -> (%d,%d)\n", t,
699  mapping[t * 2], mapping[t * 2 + 1]));
700  }
701  }
702 
703  sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
704  sion_gendata->filenumber = lpos[0];
705  sion_gendata->lrank = lpos[1];
706  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after scatter filenum+lrank (%d,%d)\n",
707  sion_gendata->filenumber, sion_gendata->lrank));
708 
709  if (sion_gendata->grank == 0) {
710  tasksinfile = malloc(sion_gendata->numfiles * sizeof(int));
711  if (tasksinfile == NULL) {
712  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
713  "_sion_generic_get_and_distribute_info_from_file: Cannot allocate memory for tasksinfile counter vector");
714  }
715  for (t = 0; t < sion_gendata->numfiles; t++) {
716  tasksinfile[t] = 0; /* init counter */
717  }
718  for (t = 0; t < mapping_size; t++) {
719  tasksinfile[mapping[t * 2]]++; /* count tasks in file */
720  }
721  for (t = 0; t < mapping_size; t++) {
722  mapping[t * 2 + 1] = tasksinfile[mapping[t * 2]]; /* set 2nd value of mapping to lsize */
723  }
724  }
725  sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
726  sion_gendata->lsize = lpos[1];
727  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after scatter lsize (%d, %d of %d)\n",
728  sion_gendata->filenumber, sion_gendata->lrank, sion_gendata->lsize));
729 
730  if (sion_gendata->grank == 0) {
731  free(tasksinfile);
732  }
733  /* WARNING: mapping file of sion file is now destroyed and should not be used until close */
734 
735  } else {
736  sion_gendata->filenumber = 0;
737  sion_gendata->lrank = sion_gendata->grank;
738  sion_gendata->lsize = sion_gendata->gsize;
739  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
740  "only one file -> filenumber=%d lRank=%d\n", sion_gendata->filenumber, sion_gendata->lrank));
741  }
742 
743  if (sion_gendata->grank == 0) {
744  /* frees also mapping vector */
745  if (sid >= 0) {
746  _sion_close_sid(sid);
747  }
748  }
749 
750  return rc;
751 }
752 
753 int sion_generic_parreinit(int sid, int64_t chunksize)
754 {
755  int grank, gsize, rc;
756  _sion_filedesc *sion_filedesc;
757  _sion_generic_gendata *sion_gendata;
758 
759  if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
760  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_parreinit: invalid sion_filedesc %d", sid);
761  }
762  sion_gendata = sion_filedesc->dataptr;
763 
764  grank = sion_gendata->grank;
765  gsize = sion_gendata->gsize;
766 
767  DPRINTFP((1, "sion_generic_parreinit", grank, "enter parallel reinit of sid %d\n", sid));
768 
769  rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
770 
771  DPRINTFP((1, "sion_generic_parreinit", grank, "leave parallel reinit of sid %d\n", sid));
772 
773  return rc;
774 }
775 
777 {
778  sion_generic_options *options = malloc(sizeof(sion_generic_options));
779  if (options) {
780  *options = SION_GENERIC_OPTIONS_INIT;
781  }
782  return options;
783 }
784 
786 {
787  free(options);
788 }
789 
791 {
792  options->chunksize = chunksize;
793 }
794 
796 {
797  options->fsblksize = fsblksize;
798 }
799 
801 {
802  options->keyval_mode = keyval_mode;
803 }
804 
806 {
808 }
809 
811 {
812  options->buddylevel = buddylevel;
813 }
814 
816 {
817  options->collsize = -1;
818 }
819 
821 {
822  options->collsize = size;
823 }
824 
826 {
827  if (options->collsize == 0) {
828  options->collsize = -1;
829  }
830  options->collective_merge = true;
831 }
832 
834 {
835  options->lowlevel_api = lowlevel_api;
836 }
837 
839 {
840  options->endianness = endianness;
841 }
842 
843 int sion_generic_paropen(int aid, const char *fname, sion_open_mode mode, void *gcommgroup, int grank, int gsize, int filenumber,
844  int numfiles, int lrank, int lsize, const sion_generic_options *options_)
845 {
846  sion_generic_options options = (options_) ? *options_ : SION_GENERIC_OPTIONS_INIT;
847 
848  DPRINTFTS(grank, "enter sion_generic_paropen");
849  DPRINTFP((1, "sion_generic_paropen", grank,
850  "enter generic parallel open of FILE %s (global: %d of %d, local: %d of %d, file: %d of %d )\n", fname, grank, gsize, lrank,
851  lsize, filenumber, numfiles));
852 
853  _sion_generic_apidesc *apidesc;
854  if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(apidesc = _sion_vcdtovcon(aid))) {
855  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_register_scattervr_cb: invalid apidesc %d", aid);
856  }
857 
858  if ((apidesc->level != SION_GENERIC_API_LEVEL_STD) && (apidesc->level != SION_GENERIC_API_LEVEL_FULL)) {
859  return _sion_errorprint(
860  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: API %s not correctly initalized, aborting", apidesc->name);
861  }
862 
863  /* check parameters */
864  if ((grank < 0) || (grank >= gsize)) {
865  return _sion_errorprint(
866  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: global rank %d not valid (0..%d)", grank, gsize);
867  }
868 
869 #ifdef HACK_SCALASCA
870  /* hack for scalasca */
871  if (strstr(fname, ".def") != NULL) {
872  options.fsblksize = 65536;
873  options.chunksize = 65536;
874  }
875 #endif
876  DPRINTFP((1, "sion_generic_paropen", grank, "setting fsblksize = %d for file %s\n", options.fsblksize, fname));
877 
878  /* create data container */
879  _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
880  if (!gendata) {
881  return _sion_errorprint(
882  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: problems to alloc gendata, aborting ...\n");
883  }
884  _sion_generic_init_gendata(gendata);
885 
886  gendata->aid = aid;
887  gendata->apidesc = apidesc;
888  gendata->comm_data_global = gcommgroup;
889  gendata->comm_data_local = NULL;
890  gendata->grank = grank;
891  gendata->gsize = gsize;
892 
893  if (mode == SION_OPEN_WRITE) {
894  if ((lrank < 0) || (lrank >= lsize)) {
895  return _sion_errorprint(
896  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: local rank %d not valid (0..%d)", lrank, lsize);
897  }
898  gendata->lrank = lrank;
899  gendata->lsize = lsize;
900 
901  if ((filenumber < 0) || (filenumber >= numfiles)) {
902  return _sion_errorprint(
903  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: file number %d not valid (0..%d)", filenumber, numfiles);
904  }
905  gendata->filenumber = filenumber;
906  gendata->numfiles = numfiles;
907 
908  } else if (mode == SION_OPEN_READ) {
909  /* file mode READ */
910 
911  DPRINTFP((1, "sion_generic_paropen", grank, "READ: buddylevel=%d\n", options.buddylevel));
912 
913  /* get number of files and filenumber */
914  if (!options.buddylevel) {
915  int rc = _sion_generic_get_and_distribute_info_from_file(gendata, fname);
916  if (rc != SION_SUCCESS) {
917  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
918  "sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file");
919  }
920  } else {
921  /* buddy will determine file layout later, but need local commgroup to optimize file operations */
922 
923  gendata->lrank = lrank;
924  gendata->lsize = lsize;
925 
926  if ((filenumber < 0) || (filenumber >= numfiles)) {
927  return _sion_errorprint(
928  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: file number %d not valid (0..%d)", filenumber, numfiles);
929  }
930  gendata->filenumber = filenumber;
931  gendata->numfiles = numfiles;
932  }
933 
934  } else {
935  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: unknown file mode");
936  }
937 
938  /* generate local commgroup according to information from file (read) or parameter (write) */
939  int rc = apidesc->create_lcg_cb(&gendata->comm_data_local, gendata->comm_data_global, gendata->grank, gendata->gsize,
940  gendata->lrank, gendata->lsize, gendata->filenumber, gendata->numfiles);
941  if (rc) {
942  return _sion_errorprint(
943  SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_paropen_generic: error in create_local_commgroup callback function");
944  }
945 
946  /* set up parameters of call to generic open */
947  char *nfname =
948  (apidesc->get_multi_filename_cb ? apidesc->get_multi_filename_cb : _sion_get_multi_filename)(fname, gendata->filenumber);
949 
950  int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
951 
952  if (!options.buddylevel) {
953  /* STANDARD */
954  /* FIXME: add debug output for flags_store
955  DPRINTFP((1, "sion_generic_paropen", grank, "call parallel open of %d files (current name %s) in %s mode\n", gendata->numfiles, nfname, file_mode)); */
956  DPRINTFP((1, "sion_generic_paropen", grank, "call parallel open of %d files (current name %s)\n", gendata->numfiles, nfname));
957  rc = _sion_paropen_generic_one_file(sid, nfname, mode, gendata->numfiles, gendata->filenumber, gendata->lrank, gendata->lsize,
958  gendata->grank, _SION_INTERNAL_FLAG_NORMAL, gendata, NULL, &options);
959  /* FIXME: add debug output for flags_store
960  DPRINTFP((1, "sion_generic_paropen", gendata->grank, "leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", gendata->numfiles,
961  file_mode, gendata->lsize, sid, gendata->grank)); */
962  DPRINTFP((1, "sion_generic_paropen", gendata->grank, "leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
963  gendata->numfiles, gendata->lsize, sid, gendata->grank));
964 
965  } else {
966  /* branch BUDDY Checkpointing */
967  /* FIXME: add debug output for flags_store
968  DPRINTFP((1, "sion_generic_paropen", grank, "call parallel buddy open of %d files (current name %s) in %s mode\n", gendata->numfiles, nfname, file_mode)); */
969  DPRINTFP(
970  (1, "sion_generic_paropen", grank, "call parallel buddy open of %d files (current name %s)\n", gendata->numfiles, nfname));
971  rc = _sion_paropen_generic_buddy(sid, fname, mode, gendata->numfiles, gendata->filenumber, gendata->lrank, gendata->lsize,
972  gendata->grank, gendata, &options);
973  /* FIXME: add debug output for flags_store
974  DPRINTFP((1, "sion_generic_paropen", gendata->grank, "leave parallel buddy open of %d files in %s mode #tasks=%d sid=%d globalrank=%d rc=%d\n", gendata->numfiles,
975  file_mode, gendata->lsize, sid, gendata->grank, rc)); */
976  DPRINTFP(
977  (1, "sion_generic_paropen", gendata->grank, "leave parallel buddy open of %d files #tasks=%d sid=%d globalrank=%d rc=%d\n",
978  gendata->numfiles, gendata->lsize, sid, gendata->grank, rc));
979  }
980 
981  /* test sid and get internal data structure */
982  _sion_filedesc *filedesc;
983  if ((rc < 0) || (sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
984  DPRINTFP((1, "sion_generic_paropen", gendata->grank, "invalid rc %d or filedesc %d", rc, sid));
985  return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, "sion_generic_paropen: invalid rc %d or filedesc %d", rc, sid);
986  }
987 
988  free(nfname);
989 
990  /* Bug? */
991 
992  DPRINTFP((1, "sion_generic_paropen", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
993  DPRINTFTS(-1, "leave sion_generic_paropen");
994 
995  return sid;
996 }
int sion_get_mapping(int sid, int *mapping_size, int32_t **mapping, int *numfiles)
Returns pointers to the internal field mapping.
Definition: sion_common.c:109
sion_open_mode
specifies for what type of access to open a file
Definition: sion_enums.h:45
sion_lowlevel_api
specifies a low-level API to use for file system access
Definition: sion_enums.h:29
sion_endianness
declares the endianness of user data written to a file
Definition: sion_enums.h:81
#define _SION_INT32
a 32 bit signed integer
Definition: sion_const.h:86
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
Definition: sion_enums.h:53
@ SION_OPEN_WRITE
open the file for writing only
Definition: sion_enums.h:49
@ SION_OPEN_READ
open the file for reading only
Definition: sion_enums.h:47
void sion_generic_mapped_options_set_endianness(sion_generic_mapped_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
Definition: sion_generic.c:438
void sion_generic_options_set_collective(sion_generic_options *options)
Enable collective I/O.
Definition: sion_generic.c:815
void sion_generic_options_set_collective_size(sion_generic_options *options, int32_t size)
Enable collective I/O.
Definition: sion_generic.c:820
void sion_generic_options_set_fsblksize(sion_generic_options *options, int32_t fsblksize)
Set the file system block size to assume.
Definition: sion_generic.c:795
void sion_generic_options_set_buddy(sion_generic_options *options)
Enable buddy checkpointing mechanism.
Definition: sion_generic.c:805
sion_generic_mapped_options * sion_generic_mapped_options_new()
Allocates and initializes an instance of sion_generic_mapped_options
Definition: sion_generic.c:404
int sion_generic_free_api(int aid)
free new api
Definition: sion_generic.c:59
void sion_generic_mapped_options_set_lowlevel_api(sion_generic_mapped_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
Definition: sion_generic.c:433
int sion_generic_register_scattervr_cb(int aid, sion_scattervr_cb cb)
register callback for communication
void sion_generic_mapped_options_set_chunksizes(sion_generic_mapped_options *options, int64_t *chunksizes)
Set the chunk size of all logical files opened by a task.
Definition: sion_generic.c:418
int sion_generic_register_barrier_cb(int aid, sion_barrier_cb cb)
register callback for communication
void sion_generic_options_set_collective_merge(sion_generic_options *options)
Use collective merging.
Definition: sion_generic.c:825
int sion_generic_paropen_mapped(int aid, char *fname, const char *file_mode, int *numFiles, void *gcommgroup, int grank, int gsize, int *nlocaltasks, int **globalranks, int64_t **chunksizes, int **mapping_filenrs, int **mapping_lranks, int32_t *fsblksize, FILE **fileptr)
Definition: sion_generic.c:443
int sion_generic_paropen(int aid, const char *fname, sion_open_mode mode, void *gcommgroup, int grank, int gsize, int filenumber, int numfiles, int lrank, int lsize, const sion_generic_options *options_)
Open a SIONlib file through a generic interface.
Definition: sion_generic.c:843
int sion_generic_register_scatterr_cb(int aid, sion_scatterr_cb cb)
register callback for communication
void sion_generic_options_set_endianness(sion_generic_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
Definition: sion_generic.c:838
void sion_generic_options_set_chunksize(sion_generic_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
Definition: sion_generic.c:790
int sion_generic_create_api(char *name)
Create new api.
Definition: sion_generic.c:31
void sion_generic_options_set_buddylevel(sion_generic_options *options, int32_t buddylevel)
Enable buddy checkpointing mechanism.
Definition: sion_generic.c:810
int sion_generic_register_gathervr_cb(int aid, sion_gathervr_cb cb)
register callback for communication
void sion_generic_mapped_options_set_fsblksize(sion_generic_mapped_options *options, int32_t fsblksize)
Set the file system block size to assume.
Definition: sion_generic.c:423
int sion_generic_register_bcastr_cb(int aid, sion_bcastr_cb cb)
register callback for communication
struct sion_generic_options sion_generic_options
Holds non-essential arguments for sion_generic_paropen().
Definition: sion_generic.h:253
void sion_generic_options_set_lowlevel_api(sion_generic_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
Definition: sion_generic.c:833
void sion_generic_mapped_options_set_keyval_mode(sion_generic_mapped_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
Definition: sion_generic.c:428
int sion_generic_register_create_local_commgroup_cb(int aid, sion_create_lcg_cb cb)
register callback to create local communication group
int sion_generic_register_gatherr_cb(int aid, sion_gatherr_cb cb)
register callback for communication
int sion_generic_register_gather_and_execute_cb(int aid, sion_gather_execute_cb cb)
register callback for communication
void sion_generic_options_set_keyval_mode(sion_generic_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
Definition: sion_generic.c:800
struct sion_generic_mapped_options sion_generic_mapped_options
Holds non-essential arguments for sion_generic_paropen_mapped().
Definition: sion_generic.h:321
void sion_generic_options_delete(sion_generic_options *options)
Delete an instance of sion_generic_options
Definition: sion_generic.c:785
void sion_generic_mapped_options_delete(sion_generic_mapped_options *options)
Delete an instance of sion_generic_mapped_options
Definition: sion_generic.c:413
int sion_generic_parclose(int sid)
Close a SIONlib file.
Definition: sion_generic.c:362
int sion_generic_register_execute_and_scatter_cb(int aid, sion_execute_scatter_cb cb)
register callback for communication
sion_generic_options * sion_generic_options_new()
Allocates and initializes an instance of sion_generic_options
Definition: sion_generic.c:776
int sion_generic_register_free_local_commgroup_cb(int aid, sion_free_lcg_cb cb)
register callback to free local communication group