23 #include <sys/types.h> 29 #include "sion_debug.h" 30 #include "sion_internal.h" 32 #include "sion_filedesc.h" 34 #include "sion_flags.h" 36 #include "sion_generic_internal.h" 37 #include "sion_generic_apidesc.h" 38 #include "sion_generic_mapped.h" 42 int sion_generic_create_api(
char *name ) {
43 int apiid = SION_ID_UNDEF;
46 sion_apidesc=_sion_generic_alloc_apidesc();
48 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_generic_create_api: problems to alloc apidesc, aborting ...\n"));
50 _sion_generic_init_apidesc(sion_apidesc);
53 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_generic_create_api: name for API not given, aborting ...\n"));
56 sion_apidesc->name=strdup(name);
58 apiid = _sion_newvcd(sion_apidesc,SION_APIDESCRIPTOR);
59 sion_apidesc->aid=apiid;
60 sion_apidesc->level=SION_GENERIC_API_LEVEL_NONE;
62 DPRINTFP((2,
"_sion_generic_create_api", _SION_DEFAULT_RANK,
"API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
67 int sion_generic_free_api(
int aid ) {
69 int rc = SION_SUCCESS;
71 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
72 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_free_api: invalid sion_apidesc %d", aid));
75 rc=_sion_generic_free_apidesc(sion_apidesc);
80 int sion_generic_register_create_local_commgroup_cb(
int aid,
int create_lcg_cb(
void **,
void *,
int,
int,
int,
int,
int,
int)) {
82 int rc = SION_SUCCESS;
84 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
85 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_create_local_commgroup_cb: invalid sion_apidesc %d", aid));
88 if(sion_apidesc->create_lcg_cb!=NULL) {
89 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_create_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
91 sion_apidesc->create_lcg_cb=create_lcg_cb;
93 _sion_generic_update_api_level(sion_apidesc);
95 DPRINTFP((2,
"sion_generic_register_create_local_commgroup_cb", _SION_DEFAULT_RANK,
"create_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
100 int sion_generic_register_free_local_commgroup_cb(
int aid,
int free_lcg_cb(
void *)) {
102 int rc = SION_SUCCESS;
104 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
105 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_free_local_commgroup_cb: invalid sion_apidesc %d", aid));
108 if(sion_apidesc->free_lcg_cb!=NULL) {
109 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"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", sion_apidesc->name, aid));
121 int sion_generic_register_barrier_cb(
int aid,
int barrier_cb(
void *)) {
123 int rc = SION_SUCCESS;
125 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
126 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_barrier_cb: invalid sion_apidesc %d", aid));
129 if(sion_apidesc->barrier_cb!=NULL) {
130 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_barrier_cb: barrier_cb already registered for apiid=%d", aid));
132 sion_apidesc->barrier_cb=barrier_cb;
134 _sion_generic_update_api_level(sion_apidesc);
136 DPRINTFP((2,
"sion_generic_register_barrier_cb", _SION_DEFAULT_RANK,
"barrier_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
141 int sion_generic_register_bcastr_cb(
int aid,
int bcastr_cb(
void *,
void *,
int,
int,
int)) {
143 int rc = SION_SUCCESS;
145 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
146 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_bcastr_cb: invalid sion_apidesc %d", aid));
149 if(sion_apidesc->bcastr_cb!=NULL) {
150 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_bcastr_cb: bcastr_cb already registered for apiid=%d", aid));
152 sion_apidesc->bcastr_cb=bcastr_cb;
154 _sion_generic_update_api_level(sion_apidesc);
156 DPRINTFP((2,
"sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK,
"bcastr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
161 int sion_generic_register_gatherr_cb(
int aid,
int gatherr_cb(
void *,
void *,
void *,
int,
int,
int)) {
163 int rc = SION_SUCCESS;
165 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
166 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gatherr_cb: invalid sion_apidesc %d", aid));
169 if(sion_apidesc->gatherr_cb!=NULL) {
170 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gatherr_cb: gatherr_cb already registered for apiid=%d", aid));
172 sion_apidesc->gatherr_cb=gatherr_cb;
174 _sion_generic_update_api_level(sion_apidesc);
176 DPRINTFP((2,
"sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK,
"gatherr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
181 int sion_generic_register_gathervr_cb(
int aid,
int gathervr_cb(
void *,
void *,
void *,
int,
int *,
int,
int)) {
183 int rc = SION_SUCCESS;
185 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
186 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gathervr_cb: invalid sion_apidesc %d", aid));
189 if(sion_apidesc->gathervr_cb!=NULL) {
190 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gathervr_cb: gathervr_cb already registered for apiid=%d", aid));
192 sion_apidesc->gathervr_cb=gathervr_cb;
194 _sion_generic_update_api_level(sion_apidesc);
196 DPRINTFP((2,
"sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK,
"gathervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
201 int sion_generic_register_scatterr_cb(
int aid,
int scatterr_cb(
void *,
void *,
void *,
int,
int,
int)) {
203 int rc = SION_SUCCESS;
205 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
206 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scatterr_cb: invalid sion_apidesc %d", aid));
209 if(sion_apidesc->scatterr_cb!=NULL) {
210 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scatterr_cb: scatterr_cb already registered for apiid=%d", aid));
212 sion_apidesc->scatterr_cb=scatterr_cb;
214 _sion_generic_update_api_level(sion_apidesc);
216 DPRINTFP((2,
"sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK,
"scatterr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
221 int sion_generic_register_scattervr_cb(
int aid,
int scattervr_cb(
void *,
void *,
void *,
int,
int *,
int,
int)) {
223 int rc = SION_SUCCESS;
225 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
226 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
229 if(sion_apidesc->scattervr_cb!=NULL) {
230 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: scattervr_cb already registered for apiid=%d", aid));
232 sion_apidesc->scattervr_cb=scattervr_cb;
234 _sion_generic_update_api_level(sion_apidesc);
236 DPRINTFP((2,
"sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK,
"scattervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
241 int sion_generic_register_gather_and_execute_cb(
int aid,
int gather_execute_cb(
const void *, sion_int64*,
int, sion_int64,
242 void *,
int,
int,
int,
int,
243 int process_cb(
const void *,sion_int64 *,
int))) {
245 int rc = SION_SUCCESS;
247 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
248 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gather_and_execute_cb: invalid sion_apidesc %d", aid));
251 if(sion_apidesc->gather_execute_cb!=NULL) {
252 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gather_and_execute_cb: scattervr_cb already registered for apiid=%d", aid));
254 sion_apidesc->gather_execute_cb=gather_execute_cb;
256 _sion_generic_update_api_level(sion_apidesc);
258 DPRINTFP((2,
"sion_generic_register_gather_and_execute_cb", _SION_DEFAULT_RANK,
"gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
263 int sion_generic_register_execute_and_scatter_cb(
int aid,
int execute_scatter_cb(
void *, sion_int64*,
int, sion_int64,
264 void *,
int,
int,
int,
int,
265 int process_cb(
void *,sion_int64 *,
int))) {
267 int rc = SION_SUCCESS;
269 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
270 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_execute_and_scatter_cb: invalid sion_apidesc %d", aid));
273 if(sion_apidesc->execute_scatter_cb!=NULL) {
274 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_execute_and_scatter_cb: scattervr_cb already registered for apiid=%d", aid));
276 sion_apidesc->execute_scatter_cb=execute_scatter_cb;
278 DPRINTFP((2,
"sion_generic_register_execute_and_scatter_cb", _SION_DEFAULT_RANK,
"gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
283 int sion_generic_register_get_multi_filename_cb(
int aid,
char *get_multi_filename_cb(
const char *,
int)) {
287 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
288 return(_sion_errorprint(-1,_SION_ERROR_RETURN,
"sion_generic_register_get_multi_filename_cb: invalid sion_apidesc %d", aid));
291 if(sion_apidesc->get_multi_filename_cb!=NULL) {
292 return(_sion_errorprint(-1,_SION_ERROR_RETURN,
"sion_generic_register_get_multi_filename_cb: get_multi_filename_cb already registered for apiid=%d", aid));
294 sion_apidesc->get_multi_filename_cb=get_multi_filename_cb;
296 _sion_generic_update_api_level(sion_apidesc);
298 DPRINTFP((2,
"sion_generic_register_get_multi_filename_cb", -1,
"get_multi_filename_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
303 int sion_generic_register_get_capability_cb(
int aid,
int get_capability_cb(
void *)) {
305 int rc = SION_SUCCESS;
307 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
308 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_get_capability_cb: invalid sion_apidesc %d", aid));
311 if(sion_apidesc->get_capability_cb!=NULL) {
312 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_get_capability_cb: get_capability_cb already registered for apiid=%d", aid));
314 sion_apidesc->get_capability_cb=get_capability_cb;
316 _sion_generic_update_api_level(sion_apidesc);
318 DPRINTFP((2,
"sion_generic_register_get_capability_cb", _SION_DEFAULT_RANK,
"get_capability_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
349 const char* file_mode,
350 sion_int64* chunksize,
351 sion_int32* fsblksize,
363 int rc, sid = SION_ID_UNDEF;
364 sion_int32 lfsblksize;
365 sion_int64 lchunksize;
367 char *nfname=NULL,*lprefix=NULL;
373 DPRINTFTS(grank,
"enter sion_generic_paropen");
374 DPRINTFP((1,
"sion_generic_paropen", grank,
"enter generic parallel open of FILE %s (global: %d of %d, local: %d of %d, file: %d of %d )\n",
375 fname, grank, gsize, *lrank, *lsize, *filenumber, *numfiles));
377 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
378 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
381 if ( (sion_apidesc->level!=SION_GENERIC_API_LEVEL_STD) &&
382 (sion_apidesc->level!=SION_GENERIC_API_LEVEL_FULL) ) {
383 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: API %s not correctly initalized, aborting",sion_apidesc->name));
387 if ( (grank < 0 ) || (grank >= gsize) ) {
388 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: global rank %d not valid (0..%d)",grank,gsize));
393 if(strstr(fname,
".def")!=NULL) {
398 lfsblksize=*fsblksize;
399 lchunksize=*chunksize;
403 DPRINTFP((1,
"sion_generic_paropen", grank,
"setting fsblksize = %d for file %s\n", lfsblksize, fname));
406 sion_gendata=_sion_generic_alloc_gendata();
408 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: problems to alloc gendata, aborting ...\n"));
410 _sion_generic_init_gendata(sion_gendata);
412 sion_gendata->aid=aid;
413 sion_gendata->apidesc=sion_apidesc;
414 sion_gendata->comm_data_global=gcommgroup;
415 sion_gendata->comm_data_local=NULL;
416 sion_gendata->grank=grank;
417 sion_gendata->gsize=gsize;
420 if ( ! flags_store ) {
421 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: could not parse file mode in %s, aborting ...\n", file_mode));
424 if (flags_store->mask&_SION_FMODE_WRITE) {
428 _sion_flags_destroy_store(flags_store);
429 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No lrank variable given"));
432 _sion_flags_destroy_store(flags_store);
433 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No lsize variable given"));
435 if ( (*lrank < 0 ) || (*lrank >= *lsize) ) {
436 _sion_flags_destroy_store(flags_store);
437 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: local rank %d not valid (0..%d)",*lrank,*lsize));
439 sion_gendata->lrank=*lrank;
440 sion_gendata->lsize=*lsize;
442 if (filenumber == NULL) {
443 _sion_flags_destroy_store(flags_store);
444 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No filenumber variable given"));
446 if (numfiles == NULL) {
447 _sion_flags_destroy_store(flags_store);
448 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No numfiles variable given"));
450 if ( (*filenumber < 0 ) || (*filenumber >= *numfiles) ) {
451 _sion_flags_destroy_store(flags_store);
452 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: file number %d not valid (0..%d)",*filenumber,*numfiles));
454 sion_gendata->filenumber=*filenumber;
455 sion_gendata->numfiles=*numfiles;
457 lprefix = calloc(SION_FILENAME_LENGTH,1);
458 if (lprefix == NULL) {
459 _sion_flags_destroy_store(flags_store);
460 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (
unsigned long) SION_FILENAME_LENGTH));
463 strcpy(lprefix, fname);
465 }
else if (flags_store->mask&_SION_FMODE_READ) {
469 rc = _sion_generic_get_and_distribute_info_from_file(sion_gendata, fname);
470 *numfiles=sion_gendata->numfiles;
471 *filenumber=sion_gendata->filenumber;
473 if(rc != SION_SUCCESS) {
474 _sion_flags_destroy_store(flags_store);
475 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file"));
479 _sion_flags_destroy_store(flags_store);
480 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: unknown file mode"));
484 rc=sion_apidesc->create_lcg_cb(&sion_gendata->comm_data_local,sion_gendata->comm_data_global,
485 sion_gendata->grank,sion_gendata->gsize,
486 sion_gendata->lrank,sion_gendata->lsize,
487 sion_gendata->filenumber,sion_gendata->numfiles);
489 _sion_flags_destroy_store(flags_store);
490 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_generic: error in create_local_commgroup callback function"));
494 nfname=(sion_apidesc->get_multi_filename_cb?sion_apidesc->get_multi_filename_cb:_sion_get_multi_filename)(fname,sion_gendata->filenumber);
496 sid = _sion_newvcd(NULL,SION_FILEDESCRIPTOR);
498 DPRINTFP((1,
"sion_generic_paropen", grank,
"call parallel open of %d files (current name %s) in %s mode\n", sion_gendata->numfiles, nfname, file_mode));
499 help_globalrank=sion_gendata->grank;
500 _sion_paropen_generic_one_file(sid, nfname, flags_store, lprefix, &sion_gendata->numfiles, &sion_gendata->filenumber, &lchunksize, &lfsblksize,
501 sion_gendata->lrank, sion_gendata->lsize, &help_globalrank,
503 DPRINTFP((1,
"sion_generic_paropen", sion_gendata->grank,
"leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", sion_gendata->numfiles,
504 file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
506 _sion_flags_destroy_store(flags_store);
509 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
510 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: invalid sion_filedesc %d", sid));
514 sion_filedesc->
dataptr=sion_gendata;
519 if(nfname) free(nfname);
523 *fsblksize = lfsblksize;
524 *chunksize = lchunksize;
528 DPRINTFP((64,
"sion_generic_paropen", grank,
"lprefix=%s (%x)\n", lprefix,lprefix));
529 if(lprefix) free(lprefix);
531 DPRINTFP((1,
"sion_generic_paropen", grank,
"leave parallel open of file %s sid=%d\n", fname, sid));
532 DPRINTFTS(-1,
"leave sion_generic_paropen");
538 int sion_generic_parclose(
int sid) {
539 int grank, gsize, lrank, mapping_size, t, rc;
540 sion_int32 lpos[2],*mapping=NULL, *receivemap=NULL, iamreceiver, receiver;
546 DPRINTFTS(-1,
"enter sion_generic_parclose");
548 if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
549 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parclose: invalid sion_filedesc %d", sid));
551 sion_gendata=sion_filedesc->
dataptr;
552 sion_apidesc=sion_gendata->apidesc;
554 grank=sion_gendata->grank;
555 gsize=sion_gendata->gsize;
556 lrank=sion_filedesc->
rank;
558 DPRINTFP((1,
"sion_generic_parclose", grank,
"enter parallel close of sid %d\n", sid));
559 DPRINTFP((1,
"sion_generic_parclose", grank,
"closing %d file(s)\n", sion_filedesc->
nfiles));
561 if ((sion_filedesc->
mode == SION_FILEMODE_WRITE) && (sion_filedesc->
nfiles > 1)) {
565 if((sion_filedesc->
filenumber==0) && (lrank==0)) {
568 mapping = (sion_int32 *) malloc(mapping_size * 2 *
sizeof(sion_int32));
569 if (mapping == NULL) {
570 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parclose: Cannot allocate memory for mapping"));
579 receivemap = (sion_int32 *) malloc(gsize *
sizeof(sion_int32));
580 if (receivemap == NULL) {
581 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parclose: Cannot allocate memory for receivemap"));
585 if((sion_filedesc->
filenumber==0) && (lrank==0)) iamreceiver=grank;
587 sion_apidesc->gatherr_cb(&iamreceiver, receivemap, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
589 for(t=0;t<gsize;t++) {
590 if(receivemap[t]>=0) {
591 receiver=receivemap[t];
595 DPRINTFP((1,
"sion_generic_parclose", grank,
"receiver of mapping grank=%d\n", receiver));
597 sion_apidesc->bcastr_cb(&receiver, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
602 sion_apidesc->gatherr_cb(&lpos, mapping, sion_gendata->comm_data_global, _SION_INT32, 2, receiver);
609 rc = _sion_parclose_generic( sid, sion_filedesc->
rank, sion_filedesc->
ntasks, mapping_size, mapping, sion_gendata );
610 if (sion_apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
611 sion_apidesc->free_lcg_cb(sion_gendata->comm_data_local);
613 _SION_SAFE_FREE(mapping, NULL);
618 sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
620 if(receivemap!=NULL) free(receivemap);
622 _SION_SAFE_FREE(sion_gendata, NULL);
624 DPRINTFP((1,
"sion_generic_parclose", grank,
"leave parallel close of sid %d\n", sid));
625 DPRINTFTS(-1,
"leave sion_generic_parclose");
631 int sion_generic_paropen_mapped(
int aid,
633 const char *file_mode,
640 sion_int64 **chunksizes,
641 int **mapping_filenrs,
642 int **mapping_lranks,
643 sion_int32 *fsblksize,
646 int rc, sid = SION_ID_UNDEF;
653 DPRINTFTS(grank,
"enter sion_generic_paropen_mapped");
654 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
"enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n",
655 fname, grank, gsize, *nlocaltasks));
657 if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
658 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
661 if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) || (!sion_apidesc->bcastr_cb) ||
662 (!sion_apidesc->gatherr_cb) || (!sion_apidesc->gathervr_cb) || (!sion_apidesc->scatterr_cb) || (!sion_apidesc->scattervr_cb) ) {
663 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: API %s not correctly initalized, aborting",sion_apidesc->name));
667 if ( (grank < 0 ) || (grank >= gsize) ) {
668 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: global rank %d not valid (0..%d)",grank,gsize));
672 sion_gendata=_sion_generic_alloc_gendata();
674 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n"));
676 _sion_generic_init_gendata(sion_gendata);
678 sion_gendata->aid=aid;
679 sion_gendata->apidesc=sion_apidesc;
680 sion_gendata->comm_data_global=gcommgroup;
681 sion_gendata->grank=grank;
682 sion_gendata->gsize=gsize;
683 sion_gendata->lrank=-1;
684 sion_gendata->lsize=-1;
685 sion_gendata->filenumber=-1;
686 sion_gendata->numfiles=-1;
687 sion_gendata->comm_data_local=NULL;
690 if ( ! flags_store ) {
691 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: could not parse file mode in %s, aborting ...\n", file_mode));
694 if (flags_store->mask&_SION_FMODE_WRITE) {
699 lprefix = calloc(SION_FILENAME_LENGTH,1);
700 if (lprefix == NULL) {
701 _sion_flags_destroy_store(flags_store);
702 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (
unsigned long) SION_FILENAME_LENGTH));
704 strcpy(lprefix, fname);
706 }
else if (flags_store->mask&_SION_FMODE_READ) {
711 _sion_flags_destroy_store(flags_store);
712 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: unknown file mode"));
715 sid = _sion_newvcd(NULL,SION_FILEDESCRIPTOR);
717 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
"enter parallel mapped open in %s mode\n", file_mode));
718 rc=_sion_paropen_mapped_generic(sid, fname, flags_store->mask, lprefix,
719 numFiles, nlocaltasks, globalranks, chunksizes, mapping_filenrs, mapping_lranks,
721 fileptr, sion_gendata);
722 sion_gendata->numfiles=*numFiles;
723 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,
724 file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
726 _sion_flags_destroy_store(flags_store);
729 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
730 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid));
734 sion_filedesc->
dataptr=sion_gendata;
738 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
"lprefix=%s (%x)\n", lprefix,lprefix));
739 if(lprefix) free(lprefix);
741 DPRINTFP((1,
"sion_generic_paropen_mapped", grank,
"leave parallel open of file %s sid=%d\n", fname, sid));
742 DPRINTFTS(-1,
"leave sion_generic_paropen_mapped");
748 int sion_generic_parclose_mapped(
int sid)
750 int grank, gsize, rc;
754 DPRINTFTS(-1,
"enter sion_generic_parclose_mapped");
755 if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
756 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parclose_mapped: invalid sion_filedesc %d", sid));
758 sion_gendata=sion_filedesc->
dataptr;
760 grank=sion_gendata->grank;
761 gsize=sion_gendata->gsize;
763 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"enter parallel close of sid %d\n", sid));
765 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"closing %d file(s)\n", sion_filedesc->
nfiles));
767 rc = _sion_parclose_mapped_generic(sid, grank, gsize,sion_gendata);
771 _sion_generic_free_gendata(sion_gendata);
773 DPRINTFP((1,
"sion_generic_parclose_mapped", grank,
"leave parallel close of sid %d\n", sid));
774 DPRINTFTS(-1,
"leave sion_generic_parclose_mapped");
780 int _sion_generic_get_and_distribute_info_from_file(
_sion_generic_gendata *sion_gendata,
const char *fname)
782 int sid, ntasks, nfiles, t;
783 int rc = SION_SUCCESS;
785 sion_int32 fsblksize;
792 sion_apidesc=sion_gendata->apidesc;
794 if(sion_gendata->grank == 0) {
796 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"before open\n"));
797 sid=_sion_open_read(fname,_SION_FMODE_READ|_SION_FMODE_ANSI,_SION_READ_MASTER_ONLY_OF_MULTI_FILES,
798 &ntasks,&nfiles,NULL,&fsblksize,NULL,&fileptr);
801 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"after open\n"));
803 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"sion file %d files\n", sion_gendata->numfiles));
805 sion_gendata->numfiles=-1;
810 sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
812 if((sion_gendata->grank == 0) && (sion_gendata->numfiles>1)) {
813 if(mapping_size!=sion_gendata->gsize) {
814 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_generic_get_and_distribute_info_from_file: Incorrect sum of ntasks of files %d <> %d\n", mapping_size, sion_gendata->gsize));
818 if(sion_gendata->numfiles<0) {
819 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_generic_get_and_distribute_info_from_file: could not get numfiles from sion file\n"));
822 if(sion_gendata->numfiles>1) {
823 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"before scatter\n"));
824 if(sion_gendata->grank==0) {
825 for(t=0;t<mapping_size;t++) {
826 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
" %d -> (%d,%d)\n",t,mapping[t*2],mapping[t*2+1]));
830 sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
831 sion_gendata->filenumber=lpos[0];
832 sion_gendata->lrank =lpos[1];
833 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"after scatter filenum+lrank (%d,%d)\n",sion_gendata->filenumber,sion_gendata->lrank));
835 if(sion_gendata->grank==0) {
836 tasksinfile = (
int *) malloc(sion_gendata->numfiles *
sizeof(
int));
837 if (tasksinfile == NULL) {
838 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_generic_get_and_distribute_info_from_file: Cannot allocate memory for tasksinfile counter vector"));
840 for(t=0;t<sion_gendata->numfiles;t++) tasksinfile[t]=0;
841 for(t=0;t<mapping_size;t++) tasksinfile[ mapping[t*2] ]++;
842 for(t=0;t<mapping_size;t++) mapping[t*2+1]=tasksinfile[ mapping[t*2] ];
844 sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
845 sion_gendata->lsize =lpos[1];
846 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"after scatter lsize (%d, %d of %d)\n",sion_gendata->filenumber, sion_gendata->lrank, sion_gendata->lsize));
848 if(sion_gendata->grank==0) {
849 if(tasksinfile) free(tasksinfile);
854 sion_gendata->filenumber=0;
855 sion_gendata->lrank = sion_gendata->grank;
856 sion_gendata->lsize = sion_gendata->gsize;
857 DPRINTFP((1,
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
"only one file -> filenumber=%d lRank=%d\n",sion_gendata->filenumber,sion_gendata->lrank));
860 if(sion_gendata->grank == 0) {
862 if (sid>=0) _sion_close_sid(sid);
868 int sion_generic_parreinit(
int sid, sion_int64 chunksize ) {
869 int grank, gsize, rc;
873 if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
874 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parreinit: invalid sion_filedesc %d", sid));
876 sion_gendata=sion_filedesc->
dataptr;
878 grank=sion_gendata->grank;
879 gsize=sion_gendata->gsize;
881 DPRINTFP((1,
"sion_generic_parreinit", grank,
"enter parallel reinit of sid %d\n", sid));
883 rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
885 DPRINTFP((1,
"sion_generic_parreinit", grank,
"leave parallel reinit of sid %d\n", sid));
Sion File Descriptor Structure.
int sion_generic_paropen(int aid, const char *fname, const char *file_mode, sion_int64 *chunksize, sion_int32 *fsblksize, void *gcommgroup, int grank, int gsize, int *filenumber, int *numfiles, const int *lrank, const int *lsize, FILE **fileptr, char **newfname)
Open a sion file a generic interface.
_sion_flags_store * _sion_parse_flags(const char *flags)
Parse flags and return a flags store with key value pairs.
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.