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");
405 int gsize,
int *nlocaltasks,
int **globalranks, int64_t **chunksizes,
int **mapping_filenrs,
int **mapping_lranks,
406 int32_t *fsblksize, FILE **fileptr)
409 _sion_flags_store *flags_store = _sion_parse_flags(file_mode);
411 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
412 "sion_generic_paropen_mapped: could not parse file mode in %s, aborting ...\n", file_mode);
414 sid = _sion_generic_paropen_mapped(aid, fname, flags_store, numFiles, gcommgroup, grank, gsize, nlocaltasks, globalranks,
415 chunksizes, mapping_filenrs, mapping_lranks, fsblksize, fileptr);
416 _sion_flags_destroy_store(&flags_store);
420 int _sion_generic_paropen_mapped(
int aid,
char *fname,
const _sion_flags_store *flags_store,
int *numFiles,
void *gcommgroup,
421 int grank,
int gsize,
int *nlocaltasks,
int **globalranks, int64_t **chunksizes,
int **mapping_filenrs,
int **mapping_lranks,
422 int32_t *fsblksize, FILE **fileptr)
424 int rc, sid = SION_ID_UNDEF;
425 _sion_filedesc *sion_filedesc;
426 _sion_generic_apidesc *sion_apidesc;
427 _sion_generic_gendata *sion_gendata;
429 DPRINTFTS(grank,
"enter sion_generic_paropen_mapped");
430 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
431 "enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n", fname, grank, gsize, *nlocaltasks));
433 if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
434 return _sion_errorprint(
435 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
438 if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) || (!sion_apidesc->bcastr_cb)
439 || (!sion_apidesc->gatherr_cb) || (!sion_apidesc->gathervr_cb) || (!sion_apidesc->scatterr_cb)
440 || (!sion_apidesc->scattervr_cb)) {
441 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
442 "sion_generic_paropen_mapped: API %s not correctly initalized, aborting", sion_apidesc->name);
446 if ((grank < 0) || (grank >= gsize)) {
447 return _sion_errorprint(
448 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen_mapped: global rank %d not valid (0..%d)", grank, gsize);
452 sion_gendata = _sion_generic_alloc_gendata();
454 return _sion_errorprint(
455 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
457 _sion_generic_init_gendata(sion_gendata);
459 sion_gendata->aid = aid;
460 sion_gendata->apidesc = sion_apidesc;
461 sion_gendata->comm_data_global = gcommgroup;
462 sion_gendata->grank = grank;
463 sion_gendata->gsize = gsize;
464 sion_gendata->lrank = -1;
465 sion_gendata->lsize = -1;
466 sion_gendata->filenumber = -1;
467 sion_gendata->numfiles = -1;
468 sion_gendata->comm_data_local = NULL;
470 if (!(flags_store->mask & (_SION_FMODE_WRITE | _SION_FMODE_READ))) {
471 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen_mapped: unknown file mode");
474 sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
478 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
"enter parallel mapped open\n"));
479 rc = _sion_paropen_mapped_generic(sid, fname, flags_store->mask, numFiles, nlocaltasks, globalranks, chunksizes,
480 mapping_filenrs, mapping_lranks, fsblksize, grank, gsize, _SION_INTERNAL_FLAG_NORMAL, fileptr, sion_gendata);
481 sion_gendata->numfiles = *numFiles;
486 (1,
"sion_generic_paropen_mapped", sion_gendata->grank,
"leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
487 sion_gendata->numfiles, sion_gendata->lsize, sid, sion_gendata->grank));
490 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
491 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid);
495 sion_filedesc->dataptr = sion_gendata;
499 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
"leave parallel open of file %s sid=%d\n", fname, sid));
500 DPRINTFTS(-1,
"leave sion_generic_paropen_mapped");
505 int sion_generic_parclose_mapped(
int sid)
507 int grank, gsize, rc;
508 _sion_filedesc *sion_filedesc;
509 _sion_generic_gendata *sion_gendata;
511 DPRINTFTS(-1,
"enter sion_generic_parclose_mapped");
512 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
513 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_parclose_mapped: invalid sion_filedesc %d", sid);
515 sion_gendata = sion_filedesc->dataptr;
517 grank = sion_gendata->grank;
518 gsize = sion_gendata->gsize;
520 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"enter parallel close of sid %d\n", sid));
522 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"closing %d file(s)\n", sion_filedesc->nfiles));
524 rc = _sion_parclose_mapped_generic(sid, grank, gsize, sion_gendata);
528 _sion_generic_free_gendata(sion_gendata);
530 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"leave parallel close of sid %d\n", sid));
531 DPRINTFTS(-1,
"leave sion_generic_parclose_mapped");
536 int _sion_generic_get_and_distribute_info_from_file(_sion_generic_gendata *sion_gendata,
const char *fname)
539 int rc = SION_SUCCESS;
541 int mapping_size = -1;
542 int32_t *mapping = NULL;
544 _sion_generic_apidesc *sion_apidesc;
546 sion_apidesc = sion_gendata->apidesc;
548 if (sion_gendata->grank == 0) {
550 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"before open\n"));
551 sid = _sion_open_read(fname, _SION_READ_MASTER_ONLY_OF_MULTI_FILES, &SION_OPTIONS_INIT);
553 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"after open\n"));
554 rc =
sion_get_mapping(sid, &mapping_size, &mapping, &sion_gendata->numfiles);
555 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"sion file %d files\n",
556 sion_gendata->numfiles));
558 sion_gendata->numfiles = -1;
563 sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global,
_SION_INT32, 1, 0);
565 if ((sion_gendata->grank == 0) && (sion_gendata->numfiles > 1)) {
566 if (mapping_size != sion_gendata->gsize) {
567 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
568 "_sion_generic_get_and_distribute_info_from_file: Incorrect sum of ntasks of files %d <> %d\n", mapping_size,
569 sion_gendata->gsize);
573 if (sion_gendata->numfiles < 0) {
574 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
575 "_sion_generic_get_and_distribute_info_from_file: could not get numfiles from sion file\n");
578 if (sion_gendata->numfiles > 1) {
579 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"before scatter\n"));
580 if (sion_gendata->grank == 0) {
581 for (t = 0; t < mapping_size; t++) {
582 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
" %d -> (%d,%d)\n", t,
583 mapping[t * 2], mapping[t * 2 + 1]));
587 sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global,
_SION_INT32, 2, 0);
588 sion_gendata->filenumber = lpos[0];
589 sion_gendata->lrank = lpos[1];
590 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"after scatter filenum+lrank (%d,%d)\n",
591 sion_gendata->filenumber, sion_gendata->lrank));
593 if (sion_gendata->grank == 0) {
594 tasksinfile = malloc(sion_gendata->numfiles *
sizeof(
int));
595 if (tasksinfile == NULL) {
596 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
597 "_sion_generic_get_and_distribute_info_from_file: Cannot allocate memory for tasksinfile counter vector");
599 for (t = 0; t < sion_gendata->numfiles; t++) {
602 for (t = 0; t < mapping_size; t++) {
603 tasksinfile[mapping[t * 2]]++;
605 for (t = 0; t < mapping_size; t++) {
606 mapping[t * 2 + 1] = tasksinfile[mapping[t * 2]];
609 sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global,
_SION_INT32, 2, 0);
610 sion_gendata->lsize = lpos[1];
611 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"after scatter lsize (%d, %d of %d)\n",
612 sion_gendata->filenumber, sion_gendata->lrank, sion_gendata->lsize));
614 if (sion_gendata->grank == 0) {
620 sion_gendata->filenumber = 0;
621 sion_gendata->lrank = sion_gendata->grank;
622 sion_gendata->lsize = sion_gendata->gsize;
623 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
624 "only one file -> filenumber=%d lRank=%d\n", sion_gendata->filenumber, sion_gendata->lrank));
627 if (sion_gendata->grank == 0) {
630 _sion_close_sid(sid);
637 int sion_generic_parreinit(
int sid, int64_t chunksize)
639 int grank, gsize, rc;
640 _sion_filedesc *sion_filedesc;
641 _sion_generic_gendata *sion_gendata;
643 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
644 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_parreinit: invalid sion_filedesc %d", sid);
646 sion_gendata = sion_filedesc->dataptr;
648 grank = sion_gendata->grank;
649 gsize = sion_gendata->gsize;
651 DPRINTFP((1,
"sion_generic_parreinit", grank,
"enter parallel reinit of sid %d\n", sid));
653 rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
655 DPRINTFP((1,
"sion_generic_parreinit", grank,
"leave parallel reinit of sid %d\n", sid));
664 *options = SION_GENERIC_OPTIONS_INIT;
676 options->chunksize = chunksize;
681 options->fsblksize = fsblksize;
686 options->keyval_mode = keyval_mode;
696 options->buddylevel = buddylevel;
701 options->collsize = -1;
706 options->collsize = size;
711 if (options->collsize == 0) {
712 options->collsize = -1;
714 options->collective_merge =
true;
719 options->lowlevel_api = lowlevel_api;
724 options->endianness = endianness;
732 DPRINTFTS(grank,
"enter sion_generic_paropen");
733 DPRINTFP((1,
"sion_generic_paropen", grank,
734 "enter generic parallel open of FILE %s (global: %d of %d, local: %d of %d, file: %d of %d )\n", fname, grank, gsize, lrank,
735 lsize, filenumber, numfiles));
737 _sion_generic_apidesc *apidesc;
738 if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(apidesc = _sion_vcdtovcon(aid))) {
739 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid apidesc %d", aid);
742 if ((apidesc->level != SION_GENERIC_API_LEVEL_STD) && (apidesc->level != SION_GENERIC_API_LEVEL_FULL)) {
743 return _sion_errorprint(
744 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: API %s not correctly initalized, aborting", apidesc->name);
748 if ((grank < 0) || (grank >= gsize)) {
749 return _sion_errorprint(
750 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: global rank %d not valid (0..%d)", grank, gsize);
755 if (strstr(fname,
".def") != NULL) {
756 options.fsblksize = 65536;
757 options.chunksize = 65536;
760 DPRINTFP((1,
"sion_generic_paropen", grank,
"setting fsblksize = %d for file %s\n", options.fsblksize, fname));
763 _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
765 return _sion_errorprint(
766 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: problems to alloc gendata, aborting ...\n");
768 _sion_generic_init_gendata(gendata);
771 gendata->apidesc = apidesc;
772 gendata->comm_data_global = gcommgroup;
773 gendata->comm_data_local = NULL;
774 gendata->grank = grank;
775 gendata->gsize = gsize;
778 if ((lrank < 0) || (lrank >= lsize)) {
779 return _sion_errorprint(
780 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: local rank %d not valid (0..%d)", lrank, lsize);
782 gendata->lrank = lrank;
783 gendata->lsize = lsize;
785 if ((filenumber < 0) || (filenumber >= numfiles)) {
786 return _sion_errorprint(
787 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: file number %d not valid (0..%d)", filenumber, numfiles);
789 gendata->filenumber = filenumber;
790 gendata->numfiles = numfiles;
795 DPRINTFP((1,
"sion_generic_paropen", grank,
"READ: buddylevel=%d\n", options.buddylevel));
798 if (!options.buddylevel) {
799 int rc = _sion_generic_get_and_distribute_info_from_file(gendata, fname);
800 if (rc != SION_SUCCESS) {
801 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
802 "sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file");
807 gendata->lrank = lrank;
808 gendata->lsize = lsize;
810 if ((filenumber < 0) || (filenumber >= numfiles)) {
811 return _sion_errorprint(
812 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: file number %d not valid (0..%d)", filenumber, numfiles);
814 gendata->filenumber = filenumber;
815 gendata->numfiles = numfiles;
819 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: unknown file mode");
823 int rc = apidesc->create_lcg_cb(&gendata->comm_data_local, gendata->comm_data_global, gendata->grank, gendata->gsize,
824 gendata->lrank, gendata->lsize, gendata->filenumber, gendata->numfiles);
826 return _sion_errorprint(
827 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_paropen_generic: error in create_local_commgroup callback function");
832 (apidesc->get_multi_filename_cb ? apidesc->get_multi_filename_cb : _sion_get_multi_filename)(fname, gendata->filenumber);
834 int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
836 if (!options.buddylevel) {
840 DPRINTFP((1,
"sion_generic_paropen", grank,
"call parallel open of %d files (current name %s)\n", gendata->numfiles, nfname));
841 rc = _sion_paropen_generic_one_file(sid, nfname, mode, gendata->numfiles, gendata->filenumber, gendata->lrank, gendata->lsize,
842 gendata->grank, _SION_INTERNAL_FLAG_NORMAL, gendata, NULL, &options);
846 DPRINTFP((1,
"sion_generic_paropen", gendata->grank,
"leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
847 gendata->numfiles, gendata->lsize, sid, gendata->grank));
854 (1,
"sion_generic_paropen", grank,
"call parallel buddy open of %d files (current name %s)\n", gendata->numfiles, nfname));
855 rc = _sion_paropen_generic_buddy(sid, fname, mode, gendata->numfiles, gendata->filenumber, gendata->lrank, gendata->lsize,
856 gendata->grank, gendata, &options);
861 (1,
"sion_generic_paropen", gendata->grank,
"leave parallel buddy open of %d files #tasks=%d sid=%d globalrank=%d rc=%d\n",
862 gendata->numfiles, gendata->lsize, sid, gendata->grank, rc));
866 _sion_filedesc *filedesc;
867 if ((rc < 0) || (sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
868 DPRINTFP((1,
"sion_generic_paropen", gendata->grank,
"invalid rc %d or filedesc %d", rc, sid));
869 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_generic_paropen: invalid rc %d or filedesc %d", rc, sid);
876 DPRINTFP((1,
"sion_generic_paropen", grank,
"leave parallel open of file %s sid=%d\n", fname, sid));
877 DPRINTFTS(-1,
"leave sion_generic_paropen");
sion_lowlevel_api
specifies a low-level API to use for file system access
int sion_get_mapping(int sid, int *mapping_size, int32_t **mapping, int *numfiles)
Returns pointers to the internal field mapping.
int sion_generic_register_scatterr_cb(int aid, sion_scatterr_cb cb)
register callback for communication
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.
void sion_generic_options_set_collective_size(sion_generic_options *options, int32_t size)
Enable collective I/O.
void sion_generic_options_delete(sion_generic_options *options)
Delete an instance of sion_generic_options
int sion_generic_register_scattervr_cb(int aid, sion_scattervr_cb cb)
register callback for communication
void sion_generic_options_set_collective(sion_generic_options *options)
Enable collective I/O.
#define _SION_INT32
a 32 bit signed integer
void sion_generic_options_set_buddy(sion_generic_options *options)
Enable buddy checkpointing mechanism.
void sion_generic_options_set_collective_merge(sion_generic_options *options)
Use collective merging.
void sion_generic_options_set_endianness(sion_generic_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
int sion_generic_register_free_local_commgroup_cb(int aid, sion_free_lcg_cb cb)
register callback to free local communication group
int sion_generic_create_api(char *name)
Create new api.
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.
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_chunksize(sion_generic_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
int sion_generic_register_barrier_cb(int aid, sion_barrier_cb cb)
register callback for communication
int sion_generic_free_api(int aid)
free new api
int sion_generic_register_gather_and_execute_cb(int aid, sion_gather_execute_cb cb)
register callback for communication
open the file for reading only
int sion_generic_register_gatherr_cb(int aid, sion_gatherr_cb cb)
register callback for communication
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
int sion_generic_parclose(int sid)
Close a SIONlib file.
sion_generic_options * sion_generic_options_new()
Allocates and initializes an instance of sion_generic_options
int sion_generic_register_gathervr_cb(int aid, sion_gathervr_cb cb)
register callback for communication
int sion_generic_register_bcastr_cb(int aid, sion_bcastr_cb cb)
register callback for communication
sion_endianness
declares the endianness of user data written to a file
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)
sion_open_mode
specifies for what type of access to open a file
void sion_generic_options_set_buddylevel(sion_generic_options *options, int32_t buddylevel)
Enable buddy checkpointing mechanism.
struct sion_generic_options sion_generic_options
Holds non-essential arguments for sion_generic_paropen().
int sion_generic_register_create_local_commgroup_cb(int aid, sion_create_lcg_cb cb)
register callback to create local communication group
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.
open the file for writing only
int sion_generic_register_execute_and_scatter_cb(int aid, sion_execute_scatter_cb cb)
register callback for communication