10 #define _XOPEN_SOURCE 700
17 #include "sion_common.h"
18 #include "sion_const.h"
19 #include "sion_debug.h"
20 #include "sion_error_handler.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"
33 int apiid = SION_ID_UNDEF;
34 _sion_generic_apidesc *sion_apidesc;
36 sion_apidesc = _sion_generic_alloc_apidesc();
38 return _sion_errorprint(
39 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"_sion_generic_create_api: problems to alloc apidesc, aborting ...\n");
41 _sion_generic_init_apidesc(sion_apidesc);
44 return _sion_errorprint(
45 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"_sion_generic_create_api: name for API not given, aborting ...\n");
48 sion_apidesc->name = strdup(name);
50 apiid = _sion_newvcd(sion_apidesc, SION_APIDESCRIPTOR);
51 sion_apidesc->aid = apiid;
52 sion_apidesc->level = SION_GENERIC_API_LEVEL_NONE;
54 DPRINTFP((2,
"_sion_generic_create_api", _SION_DEFAULT_RANK,
"API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
61 _sion_generic_apidesc *sion_apidesc;
62 int rc = SION_SUCCESS;
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);
68 rc = _sion_generic_free_apidesc(sion_apidesc);
75 _sion_generic_apidesc *sion_apidesc;
76 int rc = SION_SUCCESS;
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);
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);
87 sion_apidesc->create_lcg_cb = create_lcg_cb;
89 _sion_generic_update_api_level(sion_apidesc);
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));
99 _sion_generic_apidesc *sion_apidesc;
100 int rc = SION_SUCCESS;
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);
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);
111 sion_apidesc->free_lcg_cb = free_lcg_cb;
113 _sion_generic_update_api_level(sion_apidesc);
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));
123 _sion_generic_apidesc *sion_apidesc;
124 int rc = SION_SUCCESS;
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);
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);
135 sion_apidesc->barrier_cb = barrier_cb;
137 _sion_generic_update_api_level(sion_apidesc);
139 DPRINTFP((2,
"sion_generic_register_barrier_cb", _SION_DEFAULT_RANK,
"barrier_cb registered for apiid=%s (%d)\n",
140 sion_apidesc->name, aid));
147 _sion_generic_apidesc *sion_apidesc;
148 int rc = SION_SUCCESS;
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);
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);
159 sion_apidesc->bcastr_cb = bcastr_cb;
161 _sion_generic_update_api_level(sion_apidesc);
163 DPRINTFP((2,
"sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK,
"bcastr_cb registered for apiid=%s (%d)\n",
164 sion_apidesc->name, aid));
171 _sion_generic_apidesc *sion_apidesc;
172 int rc = SION_SUCCESS;
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);
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);
183 sion_apidesc->gatherr_cb = gatherr_cb;
185 _sion_generic_update_api_level(sion_apidesc);
187 DPRINTFP((2,
"sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK,
"gatherr_cb registered for apiid=%s (%d)\n",
188 sion_apidesc->name, aid));
195 _sion_generic_apidesc *sion_apidesc;
196 int rc = SION_SUCCESS;
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);
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);
207 sion_apidesc->gathervr_cb = gathervr_cb;
209 _sion_generic_update_api_level(sion_apidesc);
211 DPRINTFP((2,
"sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK,
"gathervr_cb registered for apiid=%s (%d)\n",
212 sion_apidesc->name, aid));
219 _sion_generic_apidesc *sion_apidesc;
220 int rc = SION_SUCCESS;
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);
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);
231 sion_apidesc->scatterr_cb = scatterr_cb;
233 _sion_generic_update_api_level(sion_apidesc);
235 DPRINTFP((2,
"sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK,
"scatterr_cb registered for apiid=%s (%d)\n",
236 sion_apidesc->name, aid));
243 _sion_generic_apidesc *sion_apidesc;
244 int rc = SION_SUCCESS;
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);
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);
255 sion_apidesc->scattervr_cb = scattervr_cb;
257 _sion_generic_update_api_level(sion_apidesc);
259 DPRINTFP((2,
"sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK,
"scattervr_cb registered for apiid=%s (%d)\n",
260 sion_apidesc->name, aid));
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 *)))
269 _sion_generic_apidesc *sion_apidesc;
270 int rc = SION_SUCCESS;
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);
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);
281 sion_apidesc->gather_execute_cb = gather_execute_cb;
283 _sion_generic_update_api_level(sion_apidesc);
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));
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 *)))
295 _sion_generic_apidesc *sion_apidesc;
296 int rc = SION_SUCCESS;
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);
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);
307 sion_apidesc->execute_scatter_cb = execute_scatter_cb;
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));
315 int sion_generic_register_get_multi_filename_cb(
int aid,
char *get_multi_filename_cb(
const char *,
int))
317 _sion_generic_apidesc *sion_apidesc;
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);
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);
328 sion_apidesc->get_multi_filename_cb = get_multi_filename_cb;
330 _sion_generic_update_api_level(sion_apidesc);
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));
338 int sion_generic_register_get_capability_cb(
int aid,
int get_capability_cb(
void *))
340 _sion_generic_apidesc *sion_apidesc;
341 int rc = SION_SUCCESS;
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);
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);
352 sion_apidesc->get_capability_cb = get_capability_cb;
354 _sion_generic_update_api_level(sion_apidesc);
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));
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;
370 DPRINTFTS(-1,
"enter sion_generic_parclose");
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);
375 sion_gendata = sion_filedesc->dataptr;
376 sion_apidesc = sion_gendata->apidesc;
378 ONLY_DEBUG(grank = sion_gendata->grank);
380 DPRINTFP((1,
"sion_generic_parclose", grank,
"enter parallel close of sid %d (%d file)\n", sid, sion_filedesc->nfiles));
382 if (!sion_filedesc->usebuddy) {
383 rc = _sion_parclose_generic(sid, sion_filedesc->rank, sion_filedesc->ntasks, _SION_INTERNAL_FLAG_NORMAL, sion_gendata, NULL);
385 rc = _sion_parclose_generic_buddy(sid, sion_filedesc->rank, sion_filedesc->ntasks, sion_gendata);
388 if (sion_apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
389 sion_apidesc->free_lcg_cb(sion_gendata->comm_data_local);
394 sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
398 DPRINTFP((1,
"sion_generic_parclose", grank,
"leave parallel close of sid %d\n", sid));
399 DPRINTFTS(-1,
"leave sion_generic_parclose");
408 *options = SION_GENERIC_MAPPED_OPTIONS_INIT;
420 options->chunksizes = chunksizes;
425 options->fsblksize = fsblksize;
430 options->keyval_mode = keyval_mode;
435 options->lowlevel_api = lowlevel_api;
440 options->endianness = endianness;
444 int gsize,
int *nlocaltasks,
int **globalranks, int64_t **chunksizes,
int **mapping_filenrs,
int **mapping_lranks,
445 int32_t *fsblksize, FILE **fileptr)
448 _sion_flags_store *flags_store = _sion_parse_flags(file_mode);
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);
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);
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)
463 int rc, sid = SION_ID_UNDEF;
464 _sion_filedesc *sion_filedesc;
465 _sion_generic_apidesc *sion_apidesc;
466 _sion_generic_gendata *sion_gendata;
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));
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);
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);
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);
491 sion_gendata = _sion_generic_alloc_gendata();
493 return _sion_errorprint(
494 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
496 _sion_generic_init_gendata(sion_gendata);
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;
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");
513 sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
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;
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));
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);
534 sion_filedesc->dataptr = sion_gendata;
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");
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,
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));
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);
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);
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);
573 _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
575 return _sion_errorprint(
576 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
578 _sion_generic_init_gendata(gendata);
581 gendata->apidesc = apidesc;
582 gendata->comm_data_global = gcommgroup;
583 gendata->grank = grank;
584 gendata->gsize = gsize;
587 gendata->filenumber = -1;
588 gendata->numfiles = numfiles;
589 gendata->comm_data_local = NULL;
591 int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
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);
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));
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);
611 filedesc->dataptr = gendata;
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");
621 int sion_generic_parclose_mapped(
int sid)
623 int grank, gsize, rc;
624 _sion_filedesc *sion_filedesc;
625 _sion_generic_gendata *sion_gendata;
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);
631 sion_gendata = sion_filedesc->dataptr;
633 grank = sion_gendata->grank;
634 gsize = sion_gendata->gsize;
636 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"enter parallel close of sid %d\n", sid));
638 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"closing %d file(s)\n", sion_filedesc->nfiles));
640 rc = _sion_parclose_mapped_generic(sid, grank, gsize, sion_gendata);
644 _sion_generic_free_gendata(sion_gendata);
646 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"leave parallel close of sid %d\n", sid));
647 DPRINTFTS(-1,
"leave sion_generic_parclose_mapped");
652 int _sion_generic_get_and_distribute_info_from_file(_sion_generic_gendata *sion_gendata,
const char *fname)
655 int rc = SION_SUCCESS;
657 int mapping_size = -1;
658 int32_t *mapping = NULL;
660 _sion_generic_apidesc *sion_apidesc;
662 sion_apidesc = sion_gendata->apidesc;
664 if (sion_gendata->grank == 0) {
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);
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));
674 sion_gendata->numfiles = -1;
679 sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global,
_SION_INT32, 1, 0);
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);
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");
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]));
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));
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");
715 for (t = 0; t < sion_gendata->numfiles; t++) {
718 for (t = 0; t < mapping_size; t++) {
719 tasksinfile[mapping[t * 2]]++;
721 for (t = 0; t < mapping_size; t++) {
722 mapping[t * 2 + 1] = tasksinfile[mapping[t * 2]];
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));
730 if (sion_gendata->grank == 0) {
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));
743 if (sion_gendata->grank == 0) {
746 _sion_close_sid(sid);
753 int sion_generic_parreinit(
int sid, int64_t chunksize)
755 int grank, gsize, rc;
756 _sion_filedesc *sion_filedesc;
757 _sion_generic_gendata *sion_gendata;
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);
762 sion_gendata = sion_filedesc->dataptr;
764 grank = sion_gendata->grank;
765 gsize = sion_gendata->gsize;
767 DPRINTFP((1,
"sion_generic_parreinit", grank,
"enter parallel reinit of sid %d\n", sid));
769 rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
771 DPRINTFP((1,
"sion_generic_parreinit", grank,
"leave parallel reinit of sid %d\n", sid));
780 *options = SION_GENERIC_OPTIONS_INIT;
792 options->chunksize = chunksize;
797 options->fsblksize = fsblksize;
802 options->keyval_mode = keyval_mode;
812 options->buddylevel = buddylevel;
817 options->collsize = -1;
822 options->collsize = size;
827 if (options->collsize == 0) {
828 options->collsize = -1;
830 options->collective_merge =
true;
835 options->lowlevel_api = lowlevel_api;
840 options->endianness = endianness;
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));
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);
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);
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);
871 if (strstr(fname,
".def") != NULL) {
872 options.fsblksize = 65536;
873 options.chunksize = 65536;
876 DPRINTFP((1,
"sion_generic_paropen", grank,
"setting fsblksize = %d for file %s\n", options.fsblksize, fname));
879 _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
881 return _sion_errorprint(
882 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: problems to alloc gendata, aborting ...\n");
884 _sion_generic_init_gendata(gendata);
887 gendata->apidesc = apidesc;
888 gendata->comm_data_global = gcommgroup;
889 gendata->comm_data_local = NULL;
890 gendata->grank = grank;
891 gendata->gsize = gsize;
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);
898 gendata->lrank = lrank;
899 gendata->lsize = lsize;
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);
905 gendata->filenumber = filenumber;
906 gendata->numfiles = numfiles;
911 DPRINTFP((1,
"sion_generic_paropen", grank,
"READ: buddylevel=%d\n", options.buddylevel));
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");
923 gendata->lrank = lrank;
924 gendata->lsize = lsize;
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);
930 gendata->filenumber = filenumber;
931 gendata->numfiles = numfiles;
935 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: unknown file mode");
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);
942 return _sion_errorprint(
943 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_paropen_generic: error in create_local_commgroup callback function");
948 (apidesc->get_multi_filename_cb ? apidesc->get_multi_filename_cb : _sion_get_multi_filename)(fname, gendata->filenumber);
950 int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
952 if (!options.buddylevel) {
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);
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));
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);
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));
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);
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");
int sion_get_mapping(int sid, int *mapping_size, int32_t **mapping, int *numfiles)
Returns pointers to the internal field mapping.
sion_open_mode
specifies for what type of access to open a file
sion_lowlevel_api
specifies a low-level API to use for file system access
sion_endianness
declares the endianness of user data written to a file
#define _SION_INT32
a 32 bit signed integer
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
@ SION_OPEN_WRITE
open the file for writing only
@ SION_OPEN_READ
open the file for reading only
void sion_generic_mapped_options_set_endianness(sion_generic_mapped_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
void sion_generic_options_set_collective(sion_generic_options *options)
Enable collective I/O.
void sion_generic_options_set_collective_size(sion_generic_options *options, int32_t size)
Enable collective I/O.
void sion_generic_options_set_fsblksize(sion_generic_options *options, int32_t fsblksize)
Set the file system block size to assume.
void sion_generic_options_set_buddy(sion_generic_options *options)
Enable buddy checkpointing mechanism.
sion_generic_mapped_options * sion_generic_mapped_options_new()
Allocates and initializes an instance of sion_generic_mapped_options
int sion_generic_free_api(int aid)
free new api
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.
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.
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.
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)
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.
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.
void sion_generic_options_set_chunksize(sion_generic_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
int sion_generic_create_api(char *name)
Create new api.
void sion_generic_options_set_buddylevel(sion_generic_options *options, int32_t buddylevel)
Enable buddy checkpointing mechanism.
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.
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().
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.
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.
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.
struct sion_generic_mapped_options sion_generic_mapped_options
Holds non-essential arguments for sion_generic_paropen_mapped().
void sion_generic_options_delete(sion_generic_options *options)
Delete an instance of sion_generic_options
void sion_generic_mapped_options_delete(sion_generic_mapped_options *options)
Delete an instance of sion_generic_mapped_options
int sion_generic_parclose(int sid)
Close a SIONlib file.
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
int sion_generic_register_free_local_commgroup_cb(int aid, sion_free_lcg_cb cb)
register callback to free local communication group