15 #define _XOPEN_SOURCE 700
24 #include "sion_error_handler.h"
41 #define _SION_CONST_MAX_INT32 2147483647
69 sion_int64 file_mode_flags,
74 sion_int64 **chunksizes,
75 int **mapping_filenrs,
77 sion_int32 *fsblksize,
84 int filenr, root, task;
88 sion_int64 helpint64, apiflag, new_fsblocksize, lstartpointer;
90 sion_int32 *sion_count = NULL;
92 sion_int64 *sion_tmpintfield2 = NULL;
93 sion_int64 *sion_tmpintfield3 = NULL;
96 int *lfilecounter,*lfilemanager, ltask, tmpsize, blknum;
102 DPRINTFP((2,
"_sion_paropen_mapped_generic", rank,
"enter parallel open sid=%d\n", sid));
105 if (sion_filedesc_master == NULL) {
106 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate filedescriptor structure of size %lu (sion_filedesc_master), aborting ...\n",
107 (
unsigned long)
sizeof(sion_filedesc_master)));
111 sion_filedesc_master->
fname = strdup(fname);
115 if (file_mode_flags&_SION_FMODE_WRITE) {
118 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" starting open for write #tasks=%d\n", ntasks));
121 for(ltask=0;ltask<*nlocaltasks;ltask++) {
122 DPRINTFP((128,
"_sion_paropen_mapped_generic", rank,
"input: %2d: f=%d gtask=%2d ltask=%d --> %d\n", ltask,
123 (
int) (*mapping_filenrs)[ltask],
124 (
int) (*globalranks)[ltask],
125 (
int) (*mapping_lranks)[ltask],
126 (
int) (*chunksizes)[ltask]
134 sion_filedesc_master->
sid=sid;
135 sion_filedesc_master->
nfiles=*numFiles;
138 if (sion_filedesc_master->
multifiles == NULL) {
139 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate filedescriptor structure vector of size %lu (chunksizes), aborting ...\n",
149 lfilecounter = (
int *) malloc(*numFiles *
sizeof(
int));
150 if (lfilecounter == NULL) {
151 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (lfilecounter), aborting ...\n",
152 (
unsigned long) *numFiles *
sizeof(int)));
154 lfilemanager = (
int *) malloc(*numFiles *
sizeof(
int));
155 if (lfilemanager == NULL) {
157 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (lfilemanager), aborting ...\n",
158 (
unsigned long) *numFiles *
sizeof(
int)));
161 sion_count = (sion_int32 *) malloc(ntasks *
sizeof(sion_int32));
162 if (sion_count == NULL) {
165 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (sion_count), aborting ...\n",
166 (
unsigned long) ntasks *
sizeof(sion_int32)));
171 for(filenr=0;filenr<*numFiles;filenr++) lfilecounter[filenr]=lfilemanager[filenr]=0;
172 for(ltask=0;ltask<*nlocaltasks;ltask++) {
173 filenr=(*mapping_filenrs)[ltask];
174 if((filenr<0) || (filenr>=*numFiles)){
178 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: on task %d: wrong file number index (%d) in mapping for task %d, aborting ...\n",
181 lfilecounter[filenr]++;
182 if((*mapping_lranks)[ltask]==0) {
183 lfilemanager[filenr]=1;
190 _sion_keyval_check_env(sion_filedesc_master, file_mode_flags);
193 for(filenr=0;filenr<*numFiles;filenr++) {
195 DPRINTFP((4,
"_sion_paropen_mapped_generic", rank,
" starting init of SION #%d of %d (%d local tasks) \n", filenr,*numFiles,lfilecounter[filenr]));
199 helpint32 = lfilemanager[filenr];
200 sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
202 for(task=0;task<ntasks;task++) {
203 if(sion_count[task]==1) root=task;
207 sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64,1 , 0); root=helpint64;
209 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: on task %d: local rank 0 of file number index (%d) will not used by any tasks, aborting ...\n",
213 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" file #%d will be managed by task %d \n", filenr,root));
217 if (sion_filedesc_sub == NULL) {
218 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate filedescriptor structure of size %lu (sion_filedesc), aborting ...\n",
219 (
unsigned long)
sizeof(sion_filedesc_sub)));
221 sion_filedesc_master->
multifiles[filenr]=sion_filedesc_sub;
225 sion_filedesc_sub->
fname = (sion_gendata->apidesc->get_multi_filename_cb?sion_gendata->apidesc->get_multi_filename_cb:
_sion_get_multi_filename)(fname, filenr);
234 sion_filedesc_sub->
fsblksize = *fsblksize;
236 sion_filedesc_sub->
nfiles = *numFiles;
238 sion_filedesc_sub->
prefix = strdup(prefix);
239 sion_filedesc_sub->
compress = file_mode_flags&_SION_FMODE_COMPRESS;
240 sion_filedesc_sub->
usecoll = file_mode_flags&_SION_FMODE_COLLECTIVE;
244 _sion_keyval_check_env(sion_filedesc_sub, file_mode_flags);
257 helpint32 = lfilecounter[filenr];
259 sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, root);
262 for(task=0;task<ntasks;task++) helpint64 += sion_count[task];
264 sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, root);
267 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
"mapping size increased to %d\n",sion_filedesc_master->
mapping_size));
271 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" file #%d (%s) will store chunks from %d tasks (%d local) \n",
272 filenr,sion_filedesc_sub->
fname,
277 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" create file #%d (%s) \n", filenr,sion_filedesc_sub->
fname));
280 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_generic: cannot open %s for writing, aborting ...\n", fname));
285 if((new_fsblocksize<0) || (new_fsblocksize>SION_MAX_FSBLOCKSIZE)) new_fsblocksize=SION_DEFAULT_FSBLOCKSIZE;
286 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" found new_fsblksize of %d\n", (
int) new_fsblocksize));
293 sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
295 sion_gendata->apidesc->bcastr_cb(&new_fsblocksize, sion_gendata->comm_data_global, _SION_INT64, 1, root);
296 sion_filedesc_sub->
fsblksize = new_fsblocksize;
297 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" setting fsblksize to %d\n", (
int) new_fsblocksize));
304 sion_tmpintfield2 = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
305 if (sion_tmpintfield2 == NULL) {
306 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield2), aborting ...\n",
307 (
unsigned long) tmpsize *
sizeof(sion_int64)));
311 sion_tmpintfield3 = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
312 if (sion_tmpintfield3 == NULL) {
313 free(sion_tmpintfield2);
314 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield3), aborting ...\n",
315 (
unsigned long) tmpsize *
sizeof(sion_int64)));
317 }
else sion_tmpintfield3 = NULL;
321 for(ltask=0;ltask<*nlocaltasks;ltask++) {
322 lfilenr=(int) (*mapping_filenrs)[ltask];
323 if(lfilenr==filenr) {
324 sion_tmpintfield2[p*3+0]=(sion_int64) (*mapping_lranks)[ltask];
325 sion_tmpintfield2[p*3+1]=(sion_int64) (*globalranks)[ltask];
326 sion_tmpintfield2[p*3+2]=(sion_int64) (*chunksizes)[ltask];
327 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" prepare %d --> lrank=%d %d %d\n", p,(
int) sion_tmpintfield2[p*3+0],(
int) sion_tmpintfield2[p*3+1],(
int) sion_tmpintfield2[p*3+2]));
336 if (rank == root)
for(task=0;task<ntasks;task++) sion_count[task]*=3;
337 sion_gendata->apidesc->gathervr_cb(sion_tmpintfield2, sion_tmpintfield3, sion_gendata->comm_data_global, _SION_INT64,sion_count,3*sion_filedesc_sub->
nlocaltasksinfile, root);
338 if (rank == root)
for(task=0;task<ntasks;task++) sion_count[task]/=3;
355 lrank=(int) sion_tmpintfield3[ltask*3+0];
356 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" sort in ltask=%d --> lrank=%d\n", ltask,lrank));
357 sion_filedesc_sub->
all_globalranks[lrank]=sion_tmpintfield3[ltask*3+1];
358 sion_filedesc_sub->
all_chunksizes[lrank] =sion_tmpintfield3[ltask*3+2];
362 _sion_calculate_startpointers(sion_filedesc_sub);
367 DPRINTFTS(rank,
"before open");
370 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_generic: cannot open %s for reading, aborting ...\n", fname));
372 sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
373 DPRINTFTS(rank,
"after open");
376 sion_filedesc_sub->
fileptr = sion_fileptr;
378 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" store for file %s fileprt=%x\n",sion_filedesc_sub->
fname, sion_fileptr ));
383 DPRINTFTS(rank,
"before writeh");
386 DPRINTFTS(rank,
"after writeh");
395 DPRINTFTS(rank,
"before setp(0)");
398 DPRINTFTS(rank,
"after setp(0)");
401 _sion_free_filedesc_all_globalranks(sion_filedesc_sub);
405 _sion_alloc_filedesc_all_globalranks(sion_filedesc_sub);
406 _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
414 _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
419 _sion_alloc_filedesc_all_keyvalptr(sion_filedesc_sub);
424 sion_filedesc_sub->
all_localranks[ltask] = sion_tmpintfield2[ltask*3+0];
425 sion_filedesc_sub->
all_globalranks[ltask] = sion_tmpintfield2[ltask*3+1];
433 lrank=(int) sion_tmpintfield3[ltask*3+0];
435 sion_tmpintfield3[ltask*3+2]=sion_filedesc_sub->
all_chunksizes[lrank];
436 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" sort out ltask=%d --> lrank=%d startptr=%ld chunksize=%ld\n",
437 ltask,lrank,(
long) sion_tmpintfield3[ltask*3+1],sion_tmpintfield3[ltask*3+2]));
440 if (rank == root)
for(task=0;task<ntasks;task++) sion_count[task]*=3;
441 sion_gendata->apidesc->scattervr_cb(sion_tmpintfield2, sion_tmpintfield3, sion_gendata->comm_data_global, _SION_INT64,sion_count,3*sion_filedesc_sub->
nlocaltasksinfile, root);
442 if (rank == root)
for(task=0;task<ntasks;task++) sion_count[task]/=3;
446 _sion_free_filedesc_all_startpointers(sion_filedesc_sub);
447 _sion_free_filedesc_all_chunksizes(sion_filedesc_sub);
449 _sion_alloc_filedesc_all_startpointers(sion_filedesc_sub);
450 _sion_alloc_filedesc_all_chunksizes(sion_filedesc_sub);
455 sion_filedesc_sub->
all_chunksizes[ltask] = sion_tmpintfield2[ltask*3+2];
456 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" get startpointer[%d] --> %ld\n", ltask, sion_filedesc_sub->
all_startpointers[ltask]));
460 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
globalskip, sion_gendata->comm_data_global, _SION_INT64, 1, root);
464 DPRINTFTS(rank,
"before setp");
465 sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
468 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" allocating block arrays of size %d\n", sion_filedesc_sub->
ntasks));
473 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" set all_currentpos[%d]=%d\n",ltask,sion_filedesc_sub->
all_currentpos[ltask] ));
479 sion_filedesc_sub->
rank = 0;
490 sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
492 if(sion_tmpintfield2) free(sion_tmpintfield2);
493 if(sion_tmpintfield3) free(sion_tmpintfield3);
495 DPRINTFP((4,
"_sion_paropen_mapped_generic", rank,
" ending init of SION #%d of %d \n", filenr,*numFiles));
504 {
int lfile=-1, lrank=-1, blknum;
505 sion_filedesc_sub=NULL;
506 for(filenr=0;filenr<*numFiles;filenr++) {
507 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
517 if((sion_filedesc_sub) && (lrank>=0) && (lfile>=0)) {
522 sion_filedesc_master->
rank = lrank;
539 for (blknum = 0; blknum < sion_filedesc_sub->
all_blockcount[lrank]; blknum++) {
549 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"set startpointer to %d\n",(
int) sion_filedesc_master->
currentpos));
554 *fileptr=sion_filedesc_master->
fileptr->fileptr;
566 if(sion_count) free(sion_count);
568 if(lfilecounter) free(lfilecounter);
569 if(lfilemanager) free(lfilemanager);
573 }
else if (file_mode_flags&_SION_FMODE_READ) {
576 int mapping_size,mapsid=-1, rootcounter;
578 sion_int32 lfsblksize;
582 DPRINTFP((1,
"_sion_paropen_mapped_generic", rank,
"read mode ntasks=%d\n",ntasks));
584 for(ltask=0;ltask<*nlocaltasks;ltask++) {
585 DPRINTFP((128,
"_sion_paropen_mapped_generic", rank,
"input: %2d: gtask=%2d \n", ltask, (
int) (*globalranks)[ltask]));
591 sion_filedesc_master->
sid=sid;
594 sion_count = (sion_int32 *) malloc(ntasks *
sizeof(sion_int32));
595 if (sion_count == NULL) {
596 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (sion_count), aborting ...\n",
597 (
unsigned long) ntasks *
sizeof(sion_int32)));
605 DPRINTFP((1,
"_sion_paropen_mapped_generic", rank,
"before open\n"));
606 mapsid=
_sion_open_read(fname,_SION_FMODE_READ|_SION_FMODE_ANSI,_SION_READ_MASTER_ONLY_OF_MULTI_FILES,
607 &lntasks,&lnfiles,NULL,&lfsblksize,NULL,&lfileptr);
609 DPRINTFP((1,
"_sion_paropen_mapped_generic", rank,
"after open\n"));
611 DPRINTFP((1,
"_sion_paropen_mapped_generic", rank,
"sion file %d files #tasks=%d rc=%d\n", *numFiles,mapping_size,rc));
614 lfilemanager = (
int *) malloc(*numFiles *
sizeof(
int));
615 if (lfilemanager == NULL) {
616 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (lfilemanager), aborting ...\n",
617 (
unsigned long) *numFiles *
sizeof(
int)));
624 for(task=0;task<mapping_size;task++) {
625 if(mapping[task*2+1]==0) {
626 lfilemanager[mapping[task*2+0]]=task;
627 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" manager of file %d is grank=%d\n",mapping[task*2+0],task));
641 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot find file %s , aborting ...\n",fname));
646 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_master->
mapping_size, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
647 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" mapping_size is=%d\n",sion_filedesc_master->
mapping_size));
651 if (mapsid>=0) _sion_close_sid(mapsid);
658 int tasks_per_task = sion_filedesc_master->
mapping_size / ntasks;
659 int startpos = rank*tasks_per_task;
660 int endpos = (rank+1)*tasks_per_task;
663 if(endpos<sion_filedesc_master->mapping_size) endpos=sion_filedesc_master->
mapping_size;
665 *nlocaltasks=endpos-startpos;
666 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"pre-compute distribution: startpos=%d endpos=%d nlocaltasks=%d\n",startpos, endpos, (
int) *nlocaltasks ));
668 if (globalranks == NULL) {
670 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"pre-compute distribution: cannot allocate globalranks, not pointer parameter given, aborting ...\n"));
672 if (mapping_filenrs == NULL) {
674 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"pre-compute distribution: cannot allocate mapping_filenrs, not pointer parameter given, aborting ...\n"));
676 if (mapping_lranks == NULL) {
678 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"pre-compute distribution: cannot allocate mapping_lranks, not pointer parameter given, aborting ...\n"));
680 if ((*globalranks) != NULL) {
682 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"pre-compute distribution: cannot allocate globalranks, memory allready allocated (unknown size), aborting ...\n"));
684 if ((*mapping_filenrs) != NULL) {
686 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"pre-compute distribution: cannot allocate mapping_filenrs, memory allready allocated (unknown size), aborting ...\n"));
688 if ((*mapping_lranks) != NULL) {
690 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"pre-compute distribution: cannot allocate mapping_lranks, memory allready allocated (unknown size), aborting ...\n"));
694 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"allocate globalranks field for parameter size=%d\n",(
int) *nlocaltasks ));
695 *globalranks = (sion_int32 *) malloc(*nlocaltasks *
sizeof(sion_int32));
696 if (*globalranks == NULL) {
698 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate memory of size %lu (globalranks), aborting ...\n", (
unsigned long)
sizeof(sion_int32)));
702 for(task=startpos;task<endpos;task++) {
703 (*globalranks)[ltask]=task;
704 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"set *globalranks[%d]=%d\n",(
int) ltask,(*globalranks)[ltask]));
711 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_master->
keyvalmode, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
712 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" keyvalmode is=%d\n",sion_filedesc_master->
keyvalmode));
715 _sion_keyval_check_env(sion_filedesc_master, file_mode_flags);
718 if (rank == 0) helpint64=*numFiles;
719 sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, 0); *numFiles=helpint64;
720 sion_filedesc_master->
nfiles=*numFiles;
724 if (sion_filedesc_master->
multifiles == NULL) {
725 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate filedescriptor structure vector of size %lu (chunksizes), aborting ...\n",
731 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
733 DPRINTFP((4,
"_sion_paropen_mapped_generic", rank,
" starting init of SION #%d of %d\n", filenr,*numFiles));
735 #ifdef _SION_FIND_ROOT_LRANK_NULL_DO_NOT_USE
742 helpint64=lfilemanager[filenr];
744 sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, 0);
749 for(task=0;task<*nlocaltasks;task++) {
750 if((*globalranks)[task]==grankroot) helpint32=1;
754 sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
756 for(task=0;task<ntasks;task++) {
757 if(sion_count[task]==1) {
768 rootcounter=( (rootcounter+1) % ntasks);
769 helpint64=rootcounter;
772 sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, 0);
774 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" manager of file %d is rank=%d\n",filenr,root));
778 if (sion_filedesc_sub == NULL) {
779 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate filedescriptor structure of size %lu (sion_filedesc), aborting ...\n",
780 (
unsigned long)
sizeof(sion_filedesc_sub)));
782 sion_filedesc_master->
multifiles[filenr]=sion_filedesc_sub;
784 sion_filedesc_sub->
fname = (sion_gendata->apidesc->get_multi_filename_cb?sion_gendata->apidesc->get_multi_filename_cb:
_sion_get_multi_filename)(fname, filenr);
793 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" starting open for read on file %s\n", sion_filedesc_sub->
fname));
794 DPRINTFTS(rank,
"before open");
795 sion_filedesc_sub->
fileptr=NULL;
799 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot open %s for reading, aborting ...\n", fname));
801 sion_filedesc_sub->
fileptr = sion_fileptr;
803 sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
804 DPRINTFTS(rank,
"after open root");
809 if (rc!=SION_SUCCESS) {
810 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot read header from file %s, aborting ...\n", fname));
812 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
813 " read, after read of fix header part endianness=0x%x blksize=%d ntasks=%d\n", sion_filedesc_sub->
endianness, sion_filedesc_sub->
fsblksize, sion_filedesc_sub->
ntasks));
815 DPRINTFTS(rank,
"before alloc");
818 DPRINTFTS(rank,
"after alloc");
821 if (rc != SION_SUCCESS) {
822 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot read header from file %s, aborting ...\n", fname));
825 _sion_coll_check_env(sion_filedesc_sub);
829 if (!sion_filedesc_sub->
usecoll) _sion_calculate_startpointers(sion_filedesc_sub);
830 else _sion_calculate_startpointers_collective(sion_filedesc_sub);
831 DPRINTFTS(rank,
"after calculate");
834 _sion_keyval_check_env(sion_filedesc_sub, file_mode_flags);
839 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
globalskip, sion_gendata->comm_data_global, _SION_INT64, 1, root);
842 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
endianness, sion_gendata->comm_data_global, _SION_INT32, 1, root);
843 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
swapbytes, sion_gendata->comm_data_global, _SION_INT32, 1, root);
844 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
fsblksize, sion_gendata->comm_data_global, _SION_INT32, 1, root);
845 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
ntasks, sion_gendata->comm_data_global, _SION_INT32, 1, root);
848 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
fileversion, sion_gendata->comm_data_global, _SION_INT32, 1, root);
849 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
nfiles, sion_gendata->comm_data_global, _SION_INT32, 1, root);
850 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
filenumber, sion_gendata->comm_data_global, _SION_INT32, 1, root);
851 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
flag1, sion_gendata->comm_data_global, _SION_INT64, 1, root);
852 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
flag2, sion_gendata->comm_data_global, _SION_INT64, 1, root);
853 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
maxusedchunks, sion_gendata->comm_data_global, _SION_INT32, 1, root);
854 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
start_of_varheader, sion_gendata->comm_data_global, _SION_INT64, 1, root);
855 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
858 DPRINTFTS(rank,
"after bcast");
865 sion_tmpintfield2 = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
866 if (sion_tmpintfield2 == NULL) {
867 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield2), aborting ...\n",
868 (
unsigned long) tmpsize *
sizeof(sion_int64)));
873 sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
ntotaltasksinfile, root);
878 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" scan for gtask=%d\n", (
int) sion_tmpintfield2[task]));
879 for(ltask=0;ltask<*nlocaltasks;ltask++) {
880 if( (
int) sion_tmpintfield2[task]==(*globalranks)[ltask]) {
881 sion_tmpintfield2[task]=-1 * (sion_tmpintfield2[task] + 1);
886 DPRINTFP((32,
"_sion_paropen_mapped_generic", rank,
" found %d globalranks for file %s\n", sion_filedesc_sub->
nlocaltasksinfile, sion_filedesc_sub->
fname));
888 DPRINTFTS(rank,
"before open non-root");
893 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot open %s for reading, aborting ...\n", fname));
895 sion_filedesc_sub->
fileptr = sion_fileptr;
898 DPRINTFTS(rank,
"after open non-root");
904 _sion_free_filedesc_all_globalranks(sion_filedesc_sub);
907 _sion_alloc_filedesc_all_globalranks(sion_filedesc_sub);
908 _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
913 _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
919 if(sion_tmpintfield2[task]<0) {
921 sion_filedesc_sub->
all_globalranks[ltask]= (-1 * sion_tmpintfield2[task]) - 1;
922 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" all_globalranks[%d]=%d all_localranks[%d]=%d\n",
932 sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
ntotaltasksinfile, root);
934 _sion_free_filedesc_all_chunksizes(sion_filedesc_sub);
935 _sion_alloc_filedesc_all_chunksizes(sion_filedesc_sub);
947 sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
ntotaltasksinfile, root);
949 _sion_free_filedesc_all_startpointers(sion_filedesc_sub);
950 _sion_alloc_filedesc_all_startpointers(sion_filedesc_sub);
967 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" got from file blockcount[%d]=%d\n",task,(
int) sion_tmpintfield2[task]));
969 sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
ntotaltasksinfile, root);
974 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" store blockcount task=%d -> ltask=%d cnt=%d\n",task,ltask,(
int) sion_tmpintfield2[task]));
979 for (blknum = 0; blknum < sion_filedesc_sub->
maxusedchunks; blknum++) {
985 sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
ntotaltasksinfile, root);
994 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
keyvalmode, sion_gendata->comm_data_global, _SION_INT32, 1, root);
997 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
usecoll, sion_gendata->comm_data_global, _SION_INT32, 1, root);
998 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
collsize, sion_gendata->comm_data_global, _SION_INT32, 1, root);
1000 if(sion_filedesc_sub->
usecoll) {
1004 sion_tmpintfield2[task]= (sion_int64) (sion_filedesc_sub->
all_coll_collector[task]*_SION_CONST_MAX_INT32) + sion_filedesc_sub->
collsize;
1006 sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
ntotaltasksinfile, root);
1010 _sion_alloc_filedesc_all_chunksizes(sion_filedesc_sub);
1013 DPRINTFP((64,
"_sion_paropen_mapped_generic", rank,
" store collsize+collector for %d elements\n",sion_filedesc_sub->
nlocaltasksinfile));
1028 sion_filedesc_sub->
rank = 0;
1038 _sion_alloc_filedesc_all_keyvalptr(sion_filedesc_sub);
1045 if(sion_tmpintfield2) free(sion_tmpintfield2);
1053 int lfile=-1,lrank=-1, blknum;
1054 sion_filedesc_sub=NULL;
1055 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
1056 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
1064 DPRINTFP((32,
"sion_paropen_mapped_generic",rank,
"init to first local rank in first file (%d, %d)\n",lfile,lrank));
1066 if((sion_filedesc_sub) && (lrank>=0) && (lfile>=0)) {
1067 DPRINTFP((32,
"sion_paropen_mapped_generic",rank,
"sion_filedesc_master->mapping_size=%d\n",sion_filedesc_master->
mapping_size));
1076 sion_filedesc_master->
rank = lrank;
1094 for(filenr=0;filenr<sion_filedesc_sub->
nfiles;filenr++) {
1099 for (blknum = 0; blknum < sion_filedesc_sub->
all_blockcount[lrank]; blknum++) {
1110 DPRINTFP((32,
"sion_paropen_mapped_generic",rank,
"set startpointer to %d\n",(
int) sion_filedesc_master->
currentpos));
1119 *fileptr=sion_filedesc_master->
fileptr->fileptr;
1128 sion_int64 *helpptr_chunksize = NULL;
1129 sion_int32 *helpptr_mapping_filenrs = NULL;
1130 sion_int32 *helpptr_mapping_lranks = NULL;
1133 if (chunksizes != NULL) {
1134 if ((*chunksizes) == NULL) {
1135 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"allocate chunksizes field for parameter size=%d\n",(
int) *nlocaltasks ));
1136 helpptr_chunksize = (sion_int64 *) malloc(*nlocaltasks *
sizeof(sion_int64));
1137 if (helpptr_chunksize == NULL) {
1138 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate filedescriptor structure of size %lu (chunksizes), aborting ...\n", (
unsigned long)
sizeof(sion_int64)));
1140 *chunksizes = helpptr_chunksize;
1142 helpptr_chunksize = *chunksizes;
1146 if (mapping_filenrs != NULL) {
1147 if ((*mapping_filenrs) == NULL) {
1148 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"allocate mapping_filenrs field for parameter size=%d\n",(
int) *nlocaltasks ));
1149 helpptr_mapping_filenrs = (sion_int32 *) malloc(*nlocaltasks *
sizeof(sion_int32));
1150 if (helpptr_mapping_filenrs == NULL) {
1151 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate filedescriptor structure of size %lu (mapping_filenrs), aborting ...\n", (
unsigned long)
sizeof(sion_int32)));
1153 *mapping_filenrs = helpptr_mapping_filenrs;
1155 helpptr_mapping_filenrs = *mapping_filenrs;
1159 if (mapping_lranks != NULL) {
1160 if ((*mapping_lranks) == NULL) {
1161 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
"allocate mapping_lranks field for parameter size=%d\n",(
int) *nlocaltasks ));
1162 helpptr_mapping_lranks = (sion_int32 *) malloc(*nlocaltasks *
sizeof(sion_int32));
1163 if (helpptr_mapping_lranks == NULL) {
1164 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate filedescriptor structure of size %lu (mapping_lranks), aborting ...\n", (
unsigned long)
sizeof(sion_int32)));
1166 *mapping_lranks = helpptr_mapping_lranks;
1168 helpptr_mapping_lranks = *mapping_lranks;
1173 if(helpptr_chunksize || helpptr_mapping_filenrs || helpptr_mapping_lranks) {
1174 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
1175 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
1177 for(task=0;task<*nlocaltasks;task++) {
1179 DPRINTFP((32,
"sion_paropen_mapped_generic:",rank,
" set chunksizes[%d]=%4d (filenr=%d, ltask=%d lrank=%d)\n",
1181 if(helpptr_chunksize) helpptr_chunksize[task] = sion_filedesc_sub->
all_chunksizes[ltask];
1182 if(helpptr_mapping_filenrs) helpptr_mapping_filenrs[task] = filenr;
1183 if(helpptr_mapping_lranks) helpptr_mapping_lranks[task] = sion_filedesc_sub->
all_localranks[ltask];
1192 _sion_print_filedesc(sion_filedesc_master, 512,
"_sion_paropen_mapped_generic", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
1195 if(sion_count) free(sion_count);
1197 if(lfilemanager) free(lfilemanager);
1202 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_multi_mpi: unknown file mode"));
1209 int _sion_parclose_mapped_generic(
int sid,
1213 int rc=SION_SUCCESS;
1214 int lfile, grank, lrank, blknum, filenr, tmpsize, root, ltask, mappingroot, task;
1217 sion_int64 *sion_tmpintfield_send = NULL;
1218 sion_int64 *sion_tmpintfield_lrank_recv = NULL;
1219 sion_int64 *sion_tmpintfield_data_recv = NULL;
1220 sion_int64 *sion_tmpintfield_data = NULL;
1221 sion_int32 *mapping = NULL;
1222 sion_int32 *sion_tmpint32field_send = NULL;
1223 sion_int32 *sion_tmpint32field_data_recv = NULL;
1224 sion_int32 *sion_count = NULL;
1225 sion_int32 helpint32;
1227 DPRINTFP((2,
"_sion_parclose_mapped_generic", rank,
"enter parallel close sid=%d\n", sid));
1230 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic: invalid sion_filedesc_master, aborting %d ...\n", sid));
1235 int numbytes, numfds;
1237 DPRINTFP((2,
"_sion_parclose_mapped_generic", rank,
"internal data size of sid %2d (%d bytes, %d fds) \n", sid,numbytes, numfds));
1245 return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc_master->
rank,
"sion_parclose_mapped: invalid file open state (!PAROPENMAPPED), aborting %d ...", sid));
1251 _sion_print_filedesc(sion_filedesc_master, 512,
"_sion_parclose_mapped_generic", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
1259 lrank=sion_filedesc_master->
rank;
1260 if((lrank>=0) && (lfile>=0)) {
1261 sion_filedesc_sub=sion_filedesc_master->
multifiles[lfile];
1267 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
1268 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
1270 DPRINTFP((32,
"_sion_parclose_mapped_generic", rank,
" parallel close (read mode) call fclose on file %s (fileptr=%x)\n", sion_filedesc_sub->
fname,sion_filedesc_sub->
fileptr));
1272 if(sion_filedesc_sub->
fileptr!=NULL) {
1274 sion_filedesc_sub->
fileptr = NULL;
1280 _sion_free_filedesc(sion_filedesc_sub);
1283 _SION_SAFE_FREE(mapping, NULL);
1284 _SION_SAFE_FREE(sion_filedesc_master->
multifiles, NULL);
1289 _sion_free_filedesc(sion_filedesc_master);
1290 sion_filedesc_master = NULL;
1302 _sion_print_filedesc(sion_filedesc_master, 512,
"_sion_parclose_mapped_generic", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
1306 lrank=sion_filedesc_master->
rank;
1307 sion_filedesc_sub=sion_filedesc_master->
multifiles[lfile];
1319 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
"on file %d: sub,maxchunk=%d master,maxchunk=%d \n", lfile,sion_filedesc_sub->
maxchunks, sion_filedesc_master->
maxchunks));
1325 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
"store current information lrank=%d lastchunknr=%d\n", lrank,sion_filedesc_sub->
lastchunknr));
1329 for (blknum = 0; blknum <= sion_filedesc_sub->
lastchunknr; blknum++) {
1334 sion_count = (sion_int32 *) malloc(ntasks *
sizeof(sion_int32));
1335 if (sion_count == NULL) {
1336 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_paropen_mapped_generic: cannot allocate temporary memory of size %lu (sion_count), aborting ...\n",
1337 (
unsigned long) ntasks *
sizeof(sion_int32)));
1341 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
1343 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
1344 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" starting close for file %d: %s \n", filenr,sion_filedesc_sub->
fname));
1351 DPRINTFP((32,
"_sion_parclose_mapped_generic", rank,
">parallel close (write mode, not managed) call fclose on file %s (fileptr=%x)\n", sion_filedesc_sub->
fname,sion_filedesc_sub->
fileptr));
1353 DPRINTFP((32,
"_sion_parclose_mapped_generic", rank,
"<parallel close (write mode, not managed) call fclose on file %s (fileptr=%x)\n", sion_filedesc_sub->
fname,sion_filedesc_sub->
fileptr));
1354 sion_filedesc_sub->
fileptr = NULL;
1359 sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
1363 sion_tmpintfield_send = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
1364 if (sion_tmpintfield_send == NULL) {
1365 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield_send), aborting ...\n",
1366 (
unsigned long) tmpsize *
sizeof(sion_int64)));
1368 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" file %d: allocate send field for all local tasks of file (%d) --> %x\n", filenr, tmpsize, sion_tmpintfield_send));
1375 sion_tmpintfield_lrank_recv = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
1376 if (sion_tmpintfield_lrank_recv == NULL) {
1377 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield_lrank_recv), aborting ...\n",
1378 (
unsigned long) tmpsize *
sizeof(sion_int64)));
1380 sion_tmpintfield_data_recv = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
1381 if (sion_tmpintfield_data_recv == NULL) {
1382 free(sion_tmpintfield_lrank_recv);
1383 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield_data_recv), aborting ...\n",
1384 (
unsigned long) tmpsize *
sizeof(sion_int64)));
1386 sion_tmpintfield_data = (sion_int64 *) malloc(tmpsize *
sizeof(sion_int64));
1387 if (sion_tmpintfield_data == NULL) {
1388 free(sion_tmpintfield_data_recv);
1389 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield_data), aborting ...\n",
1390 (
unsigned long) tmpsize *
sizeof(sion_int64)));
1392 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" file %d: allocate fields for all tasks of file (%d)\n", filenr,tmpsize));
1395 }
else sion_tmpintfield_lrank_recv=sion_tmpintfield_data_recv=sion_tmpintfield_data=NULL;
1399 sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, root);
1403 sion_tmpintfield_send[ltask]=sion_filedesc_sub->
all_localranks[ltask];
1405 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" file %d: before call of gathervr_cb %x %x %x %d %d %d\n",
1406 filenr,sion_tmpintfield_lrank_recv, sion_tmpintfield_send, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->
nlocaltasksinfile, root));
1408 sion_gendata->apidesc->gathervr_cb(sion_tmpintfield_send, sion_tmpintfield_lrank_recv, sion_gendata->comm_data_global, _SION_INT64, sion_count, sion_filedesc_sub->
nlocaltasksinfile, root);
1412 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" send all_blockcount[%d]: %d\n", ltask, sion_filedesc_sub->
all_blockcount[ltask]));
1413 sion_tmpintfield_send[ltask]=sion_filedesc_sub->
all_blockcount[ltask];
1415 sion_gendata->apidesc->gathervr_cb(sion_tmpintfield_send, sion_tmpintfield_data_recv, sion_gendata->comm_data_global, _SION_INT64, sion_count, sion_filedesc_sub->
nlocaltasksinfile, root);
1421 if (sion_tmpintfield_data_recv[ltask] > sion_filedesc_sub->
maxusedchunks) {
1422 sion_filedesc_sub->
maxusedchunks = (int) sion_tmpintfield_data_recv[ltask];
1427 sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->
maxusedchunks, sion_gendata->comm_data_global, _SION_INT32, 1, root);
1428 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" file %d: maxusedchunks=%d\n", filenr,sion_filedesc_sub->
maxusedchunks));
1434 lrank=(int) sion_tmpintfield_lrank_recv[ltask];
1435 DPRINTFP((64,
"_sion_parclose_mapped_generic", rank,
" sort in ltask=%d --> lrank=%d blkcount=%d\n",
1436 ltask,lrank,sion_tmpintfield_data_recv[ltask]));
1437 sion_tmpintfield_data[lrank]=sion_tmpintfield_data_recv[ltask];
1452 for (blknum = 0; blknum < sion_filedesc_sub->
maxusedchunks; blknum++) {
1454 DPRINTFP((32,
"_sion_parclose_mapped_generic", rank,
" collect blocksize step %d of %d\n", blknum+1,sion_filedesc_sub->
maxusedchunks));
1457 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"sion_filedesc_sub->nlocaltasksinfile=%d\n",sion_filedesc_sub->
nlocaltasksinfile));
1460 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"sort in blksize[%d][%d]=%d\n",blknum, ltask, sion_tmpintfield_send[ltask]));
1462 sion_gendata->apidesc->gathervr_cb(sion_tmpintfield_send, sion_tmpintfield_data_recv, sion_gendata->comm_data_global, _SION_INT64, sion_count, sion_filedesc_sub->
nlocaltasksinfile, root);
1469 lrank=(int) sion_tmpintfield_lrank_recv[ltask];
1470 sion_tmpintfield_data[lrank]=sion_tmpintfield_data_recv[ltask];
1471 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"prepare blksize[%d][%d]=%ld\n",blknum,lrank,sion_tmpintfield_data[lrank]));
1480 if(sion_tmpintfield_lrank_recv) free(sion_tmpintfield_lrank_recv);
1481 if(sion_tmpintfield_data_recv) free(sion_tmpintfield_data_recv);
1482 if(sion_tmpintfield_data) free(sion_tmpintfield_data);
1483 if(sion_tmpintfield_send) free(sion_tmpintfield_send);
1485 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" ending close for file %d: %s \n", filenr,sion_filedesc_sub->
fname));
1491 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"mappingroot=%d rank=%d\n", mappingroot, rank ));
1492 if(rank==mappingroot) {
1493 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"allocate mapping of size %d\n",sion_filedesc_master->
mapping_size));
1494 mapping = (sion_int32 *) malloc(sion_filedesc_master->
mapping_size * 2 *
sizeof(sion_int32));
1495 if (mapping == NULL) {
1497 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_ABORT,
"_sion_parclose_generic_mapped: Cannot allocate memory for mapping"));
1502 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
1503 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
1507 sion_tmpint32field_send = (sion_int32 *) malloc(tmpsize *
sizeof(sion_int32));
1508 if (sion_tmpint32field_send == NULL) {
1510 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic_mapped: cannot allocate temporary memory of size %lu (sion_tmpintfield_send), aborting ...\n",
1511 (
unsigned long) tmpsize *
sizeof(sion_int32)));
1516 sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, mappingroot);
1518 DPRINTFP((4,
"_sion_parclose_mapped_generic", rank,
" file %d: allocate send field for all local tasks of file (%d) --> %x\n", filenr, tmpsize, sion_tmpint32field_send));
1520 if(rank==mappingroot) {
1523 sion_tmpint32field_data_recv = (sion_int32 *) malloc(tmpsize *
sizeof(sion_int32));
1524 if (sion_tmpint32field_data_recv == NULL) {
1525 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_parclose_generic_mapped: cannot allocate temporary memory of size %lu (sion_tmpintfield_data_recv), aborting ...\n",
1526 (
unsigned long) tmpsize *
sizeof(sion_int32)));
1528 }
else sion_tmpint32field_data_recv=NULL;
1532 sion_tmpint32field_send[ltask*2+0]= (int) sion_filedesc_sub->
all_localranks[ltask];
1533 sion_tmpint32field_send[ltask*2+1]= (
int) sion_filedesc_sub->
all_globalranks[ltask];
1534 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"local lrank[%d]=%d grank[%d]=%d\n",ltask,(
int) sion_filedesc_sub->
all_localranks[ltask],ltask,(
int) sion_filedesc_sub->
all_globalranks[ltask]));
1538 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
" sion_tmpint32field_send: %d -> %d \n",ltask, sion_tmpint32field_send[ltask]));
1541 if (rank == mappingroot)
for(task=0;task<ntasks;task++) sion_count[task]*=2;
1542 sion_gendata->apidesc->gathervr_cb(sion_tmpint32field_send, sion_tmpint32field_data_recv, sion_gendata->comm_data_global, _SION_INT32, sion_count, 2*sion_filedesc_sub->
nlocaltasksinfile, mappingroot);
1543 if (rank == mappingroot)
for(task=0;task<ntasks;task++) sion_count[task]/=2;
1545 if(rank==mappingroot) {
1548 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
" sion_tmpint32field_send: %d -> %d \n",ltask, sion_tmpint32field_data_recv[ltask]));
1551 lrank=(int) sion_tmpint32field_data_recv[ltask*2+0];
1552 grank=(int) sion_tmpint32field_data_recv[ltask*2+1];
1553 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"store mapping[%d]=(%d,%d)\n",grank,filenr,lrank));
1554 mapping[grank*2+0]=filenr;
1555 mapping[grank*2+1]=lrank;
1559 if(sion_tmpint32field_data_recv) free(sion_tmpint32field_data_recv);
1560 if(sion_tmpint32field_send) free(sion_tmpint32field_send);
1564 for(filenr=0;filenr<sion_filedesc_master->
nfiles;filenr++) {
1565 sion_filedesc_sub=sion_filedesc_master->
multifiles[filenr];
1571 DPRINTFP((32,
"_sion_parclose_mapped_generic:",rank,
"mapping size is %d\n",sion_filedesc_master->
mapping_size));
1575 DPRINTFP((32,
"_sion_parclose_mapped_generic", rank,
" parallel close (write mode, managed) call fclose on file %s (fileptr=%x)\n", sion_filedesc_sub->
fname,sion_filedesc_sub->
fileptr));
1577 sion_filedesc_sub->
fileptr = NULL;
1586 _sion_free_filedesc(sion_filedesc_sub);
1588 if (sion_gendata->apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
1589 sion_gendata->apidesc->free_lcg_cb(sion_gendata->comm_data_local);
1591 _SION_SAFE_FREE(mapping, NULL);
1592 _SION_SAFE_FREE(sion_count, NULL);
1593 _SION_SAFE_FREE(sion_filedesc_master->
multifiles, NULL);
1596 _sion_free_filedesc(sion_filedesc_master);
1597 sion_filedesc_master = NULL;
1601 DPRINTFP((2,
"_sion_parclose_mapped_generic", rank,
"leave parallel close sid=%d\n", sid));