SIONlib  1.7.5
Scalable I/O library for parallel access to task-local files
sion_generic_mapped.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2019 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
15 #define _XOPEN_SOURCE 700
16 
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <unistd.h>
21 
22 #include "sion.h"
23 #include "sion_debug.h"
24 #include "sion_error_handler.h"
25 #include "sion_file.h"
26 #include "sion_filedesc.h"
27 #include "sion_fd.h"
28 #include "sion_metadata.h"
29 #include "sion_internal.h"
30 #include "sion_internal_startptr.h"
31 #include "sion_printts.h"
32 
33 #include "sion_buffer.h"
34 
35 #include "sion_filedesc.h"
36 #include "sion_keyvalue.h"
37 
38 #include "sion_generic_internal.h"
40 
41 #define _SION_CONST_MAX_INT32 2147483647
42 
67  int sid,
68  char *fname,
69  sion_int64 file_mode_flags,
70  char *prefix,
71  int *numFiles,
72  int *nlocaltasks,
73  int **globalranks,
74  sion_int64 **chunksizes,
75  int **mapping_filenrs,
76  int **mapping_lranks,
77  sion_int32 *fsblksize,
78  int rank,
79  int ntasks,
80  int flag,
81  FILE **fileptr,
82  _sion_generic_gendata *sion_gendata) {
83  int rc=SION_SUCCESS;
84  int filenr, root, task;
85 
86  _sion_filedesc *sion_filedesc_sub,*sion_filedesc_master;
87  _sion_fileptr *sion_fileptr = NULL;
88  sion_int64 helpint64, apiflag, new_fsblocksize, lstartpointer;
89  /* sion_int64 lchunksize, lstartpointer, lglobalrank, helpint64; */
90  sion_int32 *sion_count = NULL;
91  sion_int32 helpint32;
92  sion_int64 *sion_tmpintfield2 = NULL;
93  sion_int64 *sion_tmpintfield3 = NULL;
94 
95  /* for write */
96  int *lfilecounter,*lfilemanager, ltask, tmpsize, blknum;
97 
98  if (file_mode_flags&_SION_FMODE_POSIX) apiflag=SION_FILE_FLAG_POSIX;
99  else if (file_mode_flags&_SION_FMODE_SIONFWD) apiflag=SION_FILE_FLAG_SIONFWD;
100  else apiflag=SION_FILE_FLAG_ANSI;
101 
102  DPRINTFP((2, "_sion_paropen_mapped_generic", rank, "enter parallel open sid=%d\n", sid));
103 
104  sion_filedesc_master = _sion_alloc_filedesc();
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)));
108  }
109 
110  _sion_init_filedesc(sion_filedesc_master);
111  sion_filedesc_master->fname = strdup(fname); /* Set the filename */
112  sion_filedesc_master->state = SION_FILESTATE_PAROPENMAPPEDMASTER;
113 
114 
115  if (file_mode_flags&_SION_FMODE_WRITE) {
116  /* **************** WRITE mode **************** */
117 
118  DPRINTFP((32, "_sion_paropen_mapped_generic", rank, " starting open for write #tasks=%d\n", ntasks));
119 
120 
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]
127  ));
128  }
129 
130 
131  /* init and allocate master filedesc */
132  sion_filedesc_master->mode = SION_FILEMODE_WRITE;
133  _sion_reassignvcd(sid,sion_filedesc_master, SION_FILEDESCRIPTOR);
134  sion_filedesc_master->sid=sid;
135  sion_filedesc_master->nfiles=*numFiles;
136 
137  sion_filedesc_master->multifiles = (_sion_filedesc **) malloc(sion_filedesc_master->nfiles * sizeof(_sion_filedesc*));
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",
140  (unsigned long) sion_filedesc_master->nfiles * sizeof(_sion_filedesc*)));
141  }
142 
143  /* loop over all files:
144  - collect chunksizes, ... on task 0 of file
145  - calculate startpointers
146  - distribute info
147  */
148 
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)));
153  }
154  lfilemanager = (int *) malloc(*numFiles * sizeof(int));
155  if (lfilemanager == NULL) {
156  free(lfilecounter);
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)));
159  }
160 
161  sion_count = (sion_int32 *) malloc(ntasks * sizeof(sion_int32));
162  if (sion_count == NULL) {
163  free(lfilemanager);
164  free(lfilecounter);
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)));
167  }
168 
169 
170  /* get number of local tasks writing to a physical file */
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)){
175  free(sion_count);
176  free(lfilemanager);
177  free(lfilecounter);
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",
179  rank,filenr,ltask));
180  }
181  lfilecounter[filenr]++;
182  if((*mapping_lranks)[ltask]==0) {
183  lfilemanager[filenr]=1;
184  }
185  }
186 
187  sion_filedesc_master->mapping_size=0;
188 
189  /* check for keyval parameter also on master */
190  _sion_keyval_check_env(sion_filedesc_master, file_mode_flags);
191 
192  /* LOOP over files */
193  for(filenr=0;filenr<*numFiles;filenr++) {
194 
195  DPRINTFP((4, "_sion_paropen_mapped_generic", rank, " starting init of SION #%d of %d (%d local tasks) \n", filenr,*numFiles,lfilecounter[filenr]));
196 
197  /* determine which task handle this file */
198  root=-1;
199  helpint32 = lfilemanager[filenr];
200  sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
201  if (rank == 0) {
202  for(task=0;task<ntasks;task++) {
203  if(sion_count[task]==1) root=task;
204  }
205  helpint64=root;
206  }
207  sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64,1 , 0); root=helpint64;
208  if(root<0){
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",
210  rank,filenr));
211  }
212 
213  DPRINTFP((32, "_sion_paropen_mapped_generic", rank, " file #%d will be managed by task %d \n", filenr,root));
214 
215  /* allocate and initialise internal data structure with default values (NULL and -1) */
216  sion_filedesc_sub = _sion_alloc_filedesc();
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)));
220  }
221  sion_filedesc_master->multifiles[filenr]=sion_filedesc_sub;
222 
223  _sion_init_filedesc(sion_filedesc_sub);
224 
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); /* Set the filename */
226  if(rank == root ){
227  sion_filedesc_sub->state = SION_FILESTATE_PAROPENMAPPEDMANAGED;
228 
229  } else {
230  sion_filedesc_sub->state = SION_FILESTATE_PAROPENMAPPED;
231  }
232  sion_filedesc_sub->mode = SION_FILEMODE_WRITE;
233  sion_filedesc_sub->endianness = _sion_get_endianness_with_flags(file_mode_flags); /* Endianness */
234  sion_filedesc_sub->fsblksize = *fsblksize;
235  sion_filedesc_sub->swapbytes = 0; /* Endianness, swapping bytes */
236  sion_filedesc_sub->nfiles = *numFiles;
237  sion_filedesc_sub->filenumber = filenr;
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;
241  sion_filedesc_sub->filemanagedbytask = root;
242 
243  /* check for keyval parameter */
244  _sion_keyval_check_env(sion_filedesc_sub, file_mode_flags);
245 
246  /* allocate memory for storing MAXCHUNKS chunksize infos in internal structure */
247  _sion_realloc_filedesc_blocklist(sion_filedesc_sub, MAXCHUNKS);
248 
249  /* the local datastructure for one sion file contains only info for a subset of tasks writing at all to this file.
250  All parameter of this local data structures all set set as if the file consists only of the local maintained
251  tasks of the file. The data structure element all_localranks contains a mapping from local rank number
252  to the overall rank in this file. The data structure element all_globalranks contains the corresponding globalrank
253  number of all tasks of all files.
254  */
255 
256  /* get number of tasks writing to this file */
257  helpint32 = lfilecounter[filenr];
258  sion_filedesc_sub->nlocaltasksinfile = helpint32;
259  sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, root);
260  if (rank == root) {
261  helpint64=0;
262  for(task=0;task<ntasks;task++) helpint64 += sion_count[task];
263  }
264  sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, root);
265  sion_filedesc_sub->ntotaltasksinfile = helpint64;
266  sion_filedesc_master->mapping_size+=helpint64;
267  DPRINTFP((32, "_sion_paropen_mapped_generic", rank, "mapping size increased to %d\n",sion_filedesc_master->mapping_size));
268 
269  /* root stores in sion_count the number of local task of this file for each task */
270 
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,
273  sion_filedesc_sub->ntotaltasksinfile,sion_filedesc_sub->nlocaltasksinfile));
274 
275  /* check and distribute new fsblksize */
276  if(rank == root) {
277  DPRINTFP((32, "_sion_paropen_mapped_generic", rank, " create file #%d (%s) \n", filenr,sion_filedesc_sub->fname));
278  sion_fileptr = _sion_file_open(sion_filedesc_sub->fname,apiflag|SION_FILE_FLAG_WRITE|SION_FILE_FLAG_CREATE,0);
279  if (!sion_fileptr) {
280  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_generic: cannot open %s for writing, aborting ...\n", fname));
281  }
282  if(sion_filedesc_sub->fsblksize<=-1) {
283  /* check with fstat fsblksize */
284  new_fsblocksize=(sion_int64) _sion_file_get_opt_blksize(sion_fileptr);
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));
287  }
288  if (sion_filedesc_sub->usebuffer) {
289  _sion_buffer_flush(sion_filedesc_sub);
290  }
291  _sion_file_close(sion_fileptr);
292  }
293  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
294  if(sion_filedesc_sub->fsblksize==-1) {
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));
298  }
299 
300 
301 
302  /* collect local ranks/chunksizes */
303  tmpsize=3*sion_filedesc_sub->nlocaltasksinfile;
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)));
308  }
309  if (rank == root) {
310  tmpsize=3*sion_filedesc_sub->ntotaltasksinfile;
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)));
316  }
317  } else sion_tmpintfield3 = NULL;
318 
319  { int p,lfilenr;
320  p=0;
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]));
328 
329  p++;
330  }
331  }
332  }
333  /* for(ltask=0;ltask<3*sion_filedesc_sub->nlocaltasks;ltask++) {
334  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " debug in %d --> %d\n", ltask, (int) sion_tmpintfield2[ltask] ));
335  }*/
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;
339  /* if (rank == root) {
340  for(ltask=0;ltask<3*sion_filedesc_sub->ntasks;ltask++) {
341  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " debug out %d --> %d\n", ltask, (int) sion_tmpintfield3[ltask] ));
342  }
343 
344  } */
345 
346  if (rank == root) {
347  int lrank;
348 
349  /* memory allocation for internal fields (large size) */
350  sion_filedesc_sub->ntasks=sion_filedesc_sub->ntotaltasksinfile;
351  _sion_alloc_filedesc_arrays(sion_filedesc_sub);
352 
353  /* sort data into filedesc vectors */
354  for(ltask=0;ltask<sion_filedesc_sub->ntotaltasksinfile;ltask++) {
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];
359  }
360 
361  /* calculate startpointers */
362  _sion_calculate_startpointers(sion_filedesc_sub);
363  _sion_print_filedesc(sion_filedesc_sub, 512, "start of paropen_mapped", 1);
364  }
365 
366  /* open file on all ranks */
367  /* */ DPRINTFTS(rank, "before open");
368  sion_fileptr = _sion_file_open(sion_filedesc_sub->fname,apiflag|SION_FILE_FLAG_WRITE,0);
369  if (!sion_fileptr) {
370  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_generic: cannot open %s for reading, aborting ...\n", fname));
371  }
372  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
373  /* */ DPRINTFTS(rank, "after open");
374 
375  /* store data in static data structure (sid) */
376  sion_filedesc_sub->fileptr = sion_fileptr;
377 
378  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " store for file %s fileprt=%x\n",sion_filedesc_sub->fname, sion_fileptr ));
379 
380  /* write header */
381  if (rank == root) {
382 
383  /* */ DPRINTFTS(rank, "before writeh");
384  /* writes serial metadata, all_globalranks, all_chunksizes */
385  _sion_write_header(sion_filedesc_sub);
386  /* */ DPRINTFTS(rank, "after writeh");
387 
388  /* needed for writing pointer to var part of metadata at the end of the file */
389  sion_filedesc_sub->end_of_header = _sion_file_get_position(sion_filedesc_sub->fileptr);
390  sion_filedesc_sub->start_of_data = sion_filedesc_sub->all_startpointers[0];
391 
392  /*set file pointer to end of file (max. file size with one chunk) */
393  lstartpointer = sion_filedesc_sub->all_startpointers[sion_filedesc_sub->ntasks - 1]
394  + sion_filedesc_sub->all_chunksizes[sion_filedesc_sub->ntasks - 1];
395  /* */ DPRINTFTS(rank, "before setp(0)");
396  _sion_file_flush(sion_filedesc_sub->fileptr);
397  _sion_file_set_position(sion_filedesc_sub->fileptr, lstartpointer);
398  /* */ DPRINTFTS(rank, "after setp(0)");
399 
400  /* free on root some of the large fields */
401  _sion_free_filedesc_all_globalranks(sion_filedesc_sub);
402 
403  /* and realloc with less memory */
404  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
405  _sion_alloc_filedesc_all_globalranks(sion_filedesc_sub);
406  _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
407 
408  }
409 
410  if(rank!=root) {
411  /* allocate internal arrays (small size) */
412  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
413  _sion_alloc_filedesc_arrays(sion_filedesc_sub);
414  _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
415  }
416 
417  /* allocate memory for keyval if necessary (small size) */
418  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) {
419  _sion_alloc_filedesc_all_keyvalptr(sion_filedesc_sub);
420  }
421 
422  /* store data in internal data structure (rank info) */
423  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
424  sion_filedesc_sub->all_localranks[ltask] = sion_tmpintfield2[ltask*3+0];
425  sion_filedesc_sub->all_globalranks[ltask] = sion_tmpintfield2[ltask*3+1];
426  }
427 
428  /* distribute start_pointer and chunk sizes */
429  if (rank == root) {
430  int lrank;
431  /* get data out of filedesc vectors */
432  for(ltask=0;ltask<sion_filedesc_sub->ntotaltasksinfile;ltask++) {
433  lrank=(int) sion_tmpintfield3[ltask*3+0];
434  sion_tmpintfield3[ltask*3+1]=sion_filedesc_sub->all_startpointers[lrank];
435  sion_tmpintfield3[ltask*3+2]=sion_filedesc_sub->all_chunksizes[lrank]; /* possible changed by calculate_startpointers */
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]));
438  }
439  }
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;
443 
444  if (rank == root) {
445  /* free on root the last large fields */
446  _sion_free_filedesc_all_startpointers(sion_filedesc_sub);
447  _sion_free_filedesc_all_chunksizes(sion_filedesc_sub);
448  /* and realloc with less memory */
449  _sion_alloc_filedesc_all_startpointers(sion_filedesc_sub);
450  _sion_alloc_filedesc_all_chunksizes(sion_filedesc_sub);
451  }
452 
453  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
454  sion_filedesc_sub->all_startpointers[ltask] = sion_tmpintfield2[ltask*3+1];
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]));
457  }
458 
459  /* distribute globalskip */
460  sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->globalskip, sion_gendata->comm_data_global, _SION_INT64, 1, root);
461 
462 
463  /* set filepointer on each task */
464  /* */ DPRINTFTS(rank, "before setp");
465  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
466 
467  /* initalize current positions */
468  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " allocating block arrays of size %d\n", sion_filedesc_sub->ntasks));
469  _sion_alloc_filedesc_block_arrays(sion_filedesc_sub);
470  for (ltask = 0; ltask < sion_filedesc_sub->nlocaltasksinfile; ltask++) {
471  sion_filedesc_sub->all_blockcount[ltask] = 1;
472  sion_filedesc_sub->all_currentpos[ltask] = sion_filedesc_sub->all_startpointers[ltask];
473  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " set all_currentpos[%d]=%d\n",ltask,sion_filedesc_sub->all_currentpos[ltask] ));
474  sion_filedesc_sub->all_currentblocknr[ltask] = 0;
475  sion_filedesc_sub->all_blocksizes[0 * sion_filedesc_sub->nlocaltasksinfile + ltask] = 0;
476  }
477 
478  /* set position to first block of rank 0 */
479  sion_filedesc_sub->rank = 0;
480  sion_filedesc_sub->globalrank = sion_filedesc_sub->all_globalranks[sion_filedesc_sub->rank];
481  sion_filedesc_sub->chunksize = sion_filedesc_sub->all_chunksizes[0];
482  sion_filedesc_sub->startpos = sion_filedesc_sub->all_startpointers[0];
483  sion_filedesc_sub->currentpos = sion_filedesc_sub->startpos;
484  sion_filedesc_sub->lastchunknr = 0;
485  sion_filedesc_sub->currentblocknr = 0;
486 
487  _sion_file_purge(sion_fileptr);
488  _sion_file_set_position(sion_fileptr, sion_filedesc_sub->currentpos);
489 
490  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
491 
492  if(sion_tmpintfield2) free(sion_tmpintfield2);
493  if(sion_tmpintfield3) free(sion_tmpintfield3);
494 
495  DPRINTFP((4, "_sion_paropen_mapped_generic", rank, " ending init of SION #%d of %d \n", filenr,*numFiles));
496 
497  } /* for each file */
498 
499 
500  /* set master to first file, first available rank */
501 
502 
503  /* lookup file which contains current rank and set master */
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];
508  lfile=filenr;
509  lrank=0;
510  if(sion_filedesc_sub->nlocaltasksinfile>0) {
511  lfile=filenr;
512  lrank=0;
513  break;
514  }
515  }
516 
517  if((sion_filedesc_sub) && (lrank>=0) && (lfile>=0)) {
518  _sion_realloc_filedesc_blocklist(sion_filedesc_master, MAXCHUNKS);
519 
520  sion_filedesc_master->ntotaltasksinfile = sion_filedesc_master->mapping_size;
521  sion_filedesc_master->globalrank = sion_filedesc_sub->all_globalranks[lrank];
522  sion_filedesc_master->rank = lrank;
523  sion_filedesc_master->fsblksize = sion_filedesc_sub->fsblksize;
524  sion_filedesc_master->swapbytes = sion_filedesc_sub->swapbytes;
525  sion_filedesc_master->keyvalmode = sion_filedesc_sub->keyvalmode;
526  sion_filedesc_master->filenumber = lfile;
527 
528  /* set info for current rank and position */
529  sion_filedesc_master->chunksize = sion_filedesc_sub->all_chunksizes[lrank];
530  sion_filedesc_master->startpos = sion_filedesc_sub->all_startpointers[lrank];
531  sion_filedesc_master->currentpos = sion_filedesc_master->startpos;
532  sion_filedesc_master->globalskip = sion_filedesc_sub->globalskip;
533 
534  sion_filedesc_master->currentblocknr = 0;
535  sion_filedesc_master->lastchunknr = sion_filedesc_sub->all_blockcount[lrank]-1;
536 
537  sion_filedesc_master->maxusedchunks = sion_filedesc_sub->maxusedchunks;
538 
539  for (blknum = 0; blknum < sion_filedesc_sub->all_blockcount[lrank]; blknum++) {
540  sion_filedesc_master->blocksizes[blknum] = sion_filedesc_sub->all_blocksizes[sion_filedesc_sub->nlocaltasksinfile * blknum + lrank];
541  }
542 
543  /* set file pointer */
544  sion_filedesc_master->fileptr = sion_filedesc_master->multifiles[lfile]->fileptr;
545 
546  /* set position */
547  _sion_file_flush(sion_filedesc_master->fileptr);
548 
549  DPRINTFP((32,"sion_paropen_mapped_generic:",rank,"set startpointer to %d\n",(int) sion_filedesc_master->currentpos));
550  _sion_file_set_position(sion_filedesc_master->fileptr, sion_filedesc_master->currentpos);
551 
552  if(fileptr!=NULL) {
553  if(sion_filedesc_master->fileptr->flags&&SION_FILE_FLAG_ANSI) {
554  *fileptr=sion_filedesc_master->fileptr->fileptr;
555  sion_filedesc_master->fileptr_exported=1;
556  } else {
557  *fileptr=NULL;
558  sion_filedesc_master->fileptr_exported=0;
559  }
560  }
561 
562  }
563  }
564  _sion_print_filedesc(sion_filedesc_master, 512, "_sion_paropen_mapped_generic", 1);
565 
566  if(sion_count) free(sion_count);
567 
568  if(lfilecounter) free(lfilecounter);
569  if(lfilemanager) free(lfilemanager);
570 
571  /* ******************** end of WRITE ************************* */
572 
573  } else if (file_mode_flags&_SION_FMODE_READ) {
574 
575  /* ******************** start of READ ************************* */
576  int mapping_size,mapsid=-1, rootcounter;
577  int lnfiles,lntasks;
578  sion_int32 lfsblksize;
579  FILE *lfileptr;
580  sion_int32 *mapping;
581 
582  DPRINTFP((1, "_sion_paropen_mapped_generic", rank, "read mode ntasks=%d\n",ntasks));
583 
584  for(ltask=0;ltask<*nlocaltasks;ltask++) {
585  DPRINTFP((128, "_sion_paropen_mapped_generic", rank, "input: %2d: gtask=%2d \n", ltask, (int) (*globalranks)[ltask]));
586  }
587 
588  /* init and allocate master filedesc */
589  sion_filedesc_master->mode = SION_FILEMODE_READ;
590  _sion_reassignvcd(sid,sion_filedesc_master, SION_FILEDESCRIPTOR);
591  sion_filedesc_master->sid=sid;
592 
593  /* allocate temp fields */
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)));
598  }
599  lfilemanager=NULL;
600 
601  /* 1. Read mapping info from file */
602 
603  if(rank == 0) {
604  /* open and get mapping of sion file */
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);
608  if(mapsid>=0) {
609  DPRINTFP((1, "_sion_paropen_mapped_generic", rank, "after open\n"));
610  rc=sion_get_mapping(mapsid,&mapping_size,&mapping,numFiles);
611  DPRINTFP((1, "_sion_paropen_mapped_generic", rank, "sion file %d files #tasks=%d rc=%d\n", *numFiles,mapping_size,rc));
612 
613  /* allocate vector to distribute info about which task is managing which file */
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)));
618  }
619 
620  sion_filedesc_master->keyvalmode=sion_get_keyval_mode(mapsid);
621 
622  if(*numFiles>1) {
623  /* 1a. search filemanager for files, granks with lrank=0 for each file in mapping (tasks reading first sion task of multi file) */
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));
628  }
629  }
630  sion_filedesc_master->mapping_size=mapping_size;
631 
632  } else {
633  /* only one file */
634  sion_filedesc_master->mapping_size=lntasks;
635  lfilemanager[0]=0;
636  }
637 
638  } else {
639  *numFiles=-1;
640  free(sion_count);
641  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_mapped_generic: cannot find file %s , aborting ...\n",fname));
642  }
643  }
644 
645  /* broadcast information about mapping (number of global sion tasks) */
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));
648 
649  /* and close file directly */
650  if(rank == 0) {
651  if (mapsid>=0) _sion_close_sid(mapsid); /* frees also mapping vector */
652  }
653 
654  if(*nlocaltasks<0) {
655  /* 2. If not globalranks parameter given */
656  /* 2.a. compute distribution */
657  /* --> simple blockwise distribution, later improvements with task-to-file relation */
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;
661  if(rank+1==ntasks) {
662  /* remaining tasks are added to last communicator */
663  if(endpos<sion_filedesc_master->mapping_size) endpos=sion_filedesc_master->mapping_size;
664  }
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 ));
667 
668  if (globalranks == NULL) {
669  free(lfilemanager);
670  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"pre-compute distribution: cannot allocate globalranks, not pointer parameter given, aborting ...\n"));
671  }
672  if (mapping_filenrs == NULL) {
673  free(lfilemanager);
674  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"pre-compute distribution: cannot allocate mapping_filenrs, not pointer parameter given, aborting ...\n"));
675  }
676  if (mapping_lranks == NULL) {
677  free(lfilemanager);
678  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"pre-compute distribution: cannot allocate mapping_lranks, not pointer parameter given, aborting ...\n"));
679  }
680  if ((*globalranks) != NULL) {
681  free(lfilemanager);
682  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"pre-compute distribution: cannot allocate globalranks, memory allready allocated (unknown size), aborting ...\n"));
683  }
684  if ((*mapping_filenrs) != NULL) {
685  free(lfilemanager);
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"));
687  }
688  if ((*mapping_lranks) != NULL) {
689  free(lfilemanager);
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"));
691  }
692 
693 
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) {
697  free(lfilemanager);
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)));
699  }
700  /* init globalranks vector */
701  ltask=0;
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]));
705  ltask++;
706  }
707 
708  }
709 
710  /* broadcast keyvalmode from file */
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));
713 
714  /* check for keyval parameter also on master */
715  _sion_keyval_check_env(sion_filedesc_master, file_mode_flags);
716 
717  /* 4. bcast numfiles to all */
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;
721 
722  /* allocate on each task filedesc structure for each multifile */
723  sion_filedesc_master->multifiles = (_sion_filedesc **) malloc(sion_filedesc_master->nfiles * sizeof(_sion_filedesc*));
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",
726  (unsigned long) sion_filedesc_master->nfiles * sizeof(_sion_filedesc*)));
727  }
728 
729  /* 5. Loop over files */
730  rootcounter=0; /* for round robin */
731  for(filenr=0;filenr<sion_filedesc_master->nfiles;filenr++) {
732 
733  DPRINTFP((4, "_sion_paropen_mapped_generic", rank, " starting init of SION #%d of %d\n", filenr,*numFiles));
734 
735 #ifdef _SION_FIND_ROOT_LRANK_NULL_DO_NOT_USE
736  {
737  int grankroot;
738  /* WARNING: this algorithm has some problems if no rank reads lrank-0 from file */
739  /* bcast grank with lrank=0 for this file */
740  grankroot=-1;
741  if (rank == 0) {
742  helpint64=lfilemanager[filenr];
743  }
744  sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, 0);
745  grankroot=helpint64;
746 
747  /* search for grankroot in my globalranks */
748  helpint32=-1;
749  for(task=0;task<*nlocaltasks;task++) {
750  if((*globalranks)[task]==grankroot) helpint32=1;
751  }
752 
753  /* gather on task 0 vector containing -1 or ranknumber for each task to determine which task is handling this file */
754  sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
755  if (rank == 0) {
756  for(task=0;task<ntasks;task++) {
757  if(sion_count[task]==1) {
758  root=task;
759  break;
760  }
761  }
762  helpint32=root;
763  }
764  }
765 #endif
766 
767  /* round robin distribution of master role for a multi-file */
768  rootcounter=( (rootcounter+1) % ntasks);
769  helpint64=rootcounter;
770 
771  /* bcast root number for this file */
772  sion_gendata->apidesc->bcastr_cb(&helpint64, sion_gendata->comm_data_global, _SION_INT64, 1, 0);
773  root=helpint64;
774  DPRINTFP((32, "_sion_paropen_mapped_generic", rank, " manager of file %d is rank=%d\n",filenr,root));
775 
776  /* allocate and initialise internal data structure with default values (NULL and -1) */
777  sion_filedesc_sub = _sion_alloc_filedesc();
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)));
781  }
782  sion_filedesc_master->multifiles[filenr]=sion_filedesc_sub;
783  _sion_init_filedesc(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); /* Set the filename */
785  if(rank == root ){
786  sion_filedesc_sub->state = SION_FILESTATE_PAROPENMAPPEDMANAGED;
787  } else {
788  sion_filedesc_sub->state = SION_FILESTATE_PAROPENMAPPED;
789  }
790  sion_filedesc_sub->mode = SION_FILEMODE_READ;
791 
792  /* open file on each task */
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;
796  if (rank == root) {
797  sion_fileptr = _sion_file_open(sion_filedesc_sub->fname,apiflag|SION_FILE_FLAG_READ,0);
798  if (!sion_fileptr) {
799  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_mapped_generic: cannot open %s for reading, aborting ...\n", fname));
800  }
801  sion_filedesc_sub->fileptr = sion_fileptr;
802  }
803  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
804  /* */ DPRINTFTS(rank, "after open root");
805 
806  /* get meta data of file (1st Block ) on managing task */
807  if (rank == root) {
808  rc = _sion_read_header_fix_part(sion_filedesc_sub);
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));
811  }
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));
814 
815  /* */ DPRINTFTS(rank, "before alloc");
816  /* memory allocation (large fields, all sion tasks of file) */
817  _sion_alloc_filedesc_arrays(sion_filedesc_sub);
818  /* */ DPRINTFTS(rank, "after alloc");
819 
820  rc = _sion_read_header_var_part(sion_filedesc_sub);
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));
823  }
824 
825  _sion_coll_check_env(sion_filedesc_sub);
826  if(sion_filedesc_sub->usecoll) _sion_alloc_filedesc_coll_arrays(sion_filedesc_sub);
827 
828  /* collective */
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");
832 
833  /* check for keyval parameter */
834  _sion_keyval_check_env(sion_filedesc_sub, file_mode_flags);
835 
836  }
837 
838  /* distribute globalskip */
839  sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->globalskip, sion_gendata->comm_data_global, _SION_INT64, 1, root);
840 
841  /* broadcast information read from file */
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);
846  sion_filedesc_sub->ntotaltasksinfile=sion_filedesc_sub->ntasks;
847  sion_filedesc_sub->nlocaltasksinfile=-1; /* has to be computed after distribution of globalranks */
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,
856  " read, after read of maxusedchunks=%d maxchunks=%d (%d) start_of_varheader=%d\n", sion_filedesc_sub->maxusedchunks,sion_filedesc_sub->maxchunks, MAXCHUNKS,(int) sion_filedesc_sub->start_of_varheader ));
857  if (sion_filedesc_sub->maxusedchunks > sion_filedesc_sub->maxchunks) _sion_realloc_filedesc_blocklist(sion_filedesc_sub, sion_filedesc_sub->maxusedchunks);
858  /* */ DPRINTFTS(rank, "after bcast");
859 
860  /* allocate temp field to receive data of all tasks in file; Data
861  distribution will be done by data sieving: meta data about all sion
862  tasks in file will be sent to all task and meta data about local sion
863  tasks will be selected from these fields */
864  tmpsize=sion_filedesc_sub->ntotaltasksinfile;
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)));
869  }
870 
871  /* bcast GLOBALRANKS number in this file */
872  if(rank==root) for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++) sion_tmpintfield2[task]=sion_filedesc_sub->all_globalranks[task];
873  sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->ntotaltasksinfile, root);
874 
875  /* compare globalrank number list with list of globalrank to open on this task */
876  sion_filedesc_sub->nlocaltasksinfile=0;
877  for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++) {
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); /* set mask (set to negative value) */
882  sion_filedesc_sub->nlocaltasksinfile++;
883  }
884  }
885  }
886  DPRINTFP((32, "_sion_paropen_mapped_generic", rank, " found %d globalranks for file %s\n", sion_filedesc_sub->nlocaltasksinfile, sion_filedesc_sub->fname));
887 
888  /* */ DPRINTFTS(rank, "before open non-root");
889  /* if really necessary (not needed when on this task no globalranks are stored in this file) */
890  if ( (rank != root) && (sion_filedesc_sub->nlocaltasksinfile>0) ) {
891  sion_fileptr = _sion_file_open(sion_filedesc_sub->fname,apiflag|SION_FILE_FLAG_READ,0);
892  if (!sion_fileptr) {
893  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_mapped_generic: cannot open %s for reading, aborting ...\n", fname));
894  }
895  sion_filedesc_sub->fileptr = sion_fileptr;
896  }
897  /* sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global); */
898  /* */ DPRINTFTS(rank, "after open non-root");
899 
900 
901  /* allocate internal arrays (small size, only sion tasks needed by this task) */
902  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
903  /* free on root some of the large fields */
904  _sion_free_filedesc_all_globalranks(sion_filedesc_sub);
905  /* and realloc with less memory */
906  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
907  _sion_alloc_filedesc_all_globalranks(sion_filedesc_sub);
908  _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
909  /* all_chunksizes will follow later */
910  } else {
911  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
912  _sion_alloc_filedesc_arrays(sion_filedesc_sub);
913  _sion_alloc_filedesc_all_localranks(sion_filedesc_sub);
914  }
915 
916  /* store position of local tasks in this file */
917  ltask=0;
918  for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++) {
919  if(sion_tmpintfield2[task]<0) {
920  sion_filedesc_sub->all_localranks[ltask]=task;
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",
923  ltask,(int) sion_filedesc_sub->all_globalranks[ltask],ltask,(int) sion_filedesc_sub->all_localranks[ltask]));
924  ltask++;
925  }
926  }
927 
928  /* bcast CHUNKSIZES */
929  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
930  for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++) sion_tmpintfield2[task]=sion_filedesc_sub->all_chunksizes[task];
931  }
932  sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->ntotaltasksinfile, root);
933  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
934  _sion_free_filedesc_all_chunksizes(sion_filedesc_sub); /* free on root large field */
935  _sion_alloc_filedesc_all_chunksizes(sion_filedesc_sub); /* and realloc with less memory */
936  }
937  /* store in local field */
938  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
939  task=sion_filedesc_sub->all_localranks[ltask];
940  sion_filedesc_sub->all_chunksizes[ltask]=sion_tmpintfield2[task];
941  }
942 
943  /* bcast STARTPOINTERS */
944  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
945  for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++) sion_tmpintfield2[task]=sion_filedesc_sub->all_startpointers[task];
946  }
947  sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->ntotaltasksinfile, root);
948  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
949  _sion_free_filedesc_all_startpointers(sion_filedesc_sub); /* free on root large field */
950  _sion_alloc_filedesc_all_startpointers(sion_filedesc_sub); /* and realloc with less memory */
951  }
952  /* store in local field */
953  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
954  task=sion_filedesc_sub->all_localranks[ltask];
955  sion_filedesc_sub->all_startpointers[ltask]=sion_tmpintfield2[task];
956  }
957 
958  /* allocate memory for block info */
959  _sion_alloc_filedesc_block_arrays(sion_filedesc_sub);
960 
961  /* bcast BLOCKCOUNT */
962  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
963  sion_filedesc_sub->ntasks=sion_filedesc_sub->ntotaltasksinfile;
964  _sion_read_header_var_part_blockcount_to_field(sion_filedesc_sub, sion_filedesc_sub->ntotaltasksinfile, sion_tmpintfield2);
965  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
966  for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++)
967  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " got from file blockcount[%d]=%d\n",task,(int) sion_tmpintfield2[task]));
968  }
969  sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->ntotaltasksinfile, root);
970  /* store in local field */
971  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
972  task=sion_filedesc_sub->all_localranks[ltask];
973  sion_filedesc_sub->all_blockcount[ltask]=sion_tmpintfield2[task];
974  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " store blockcount task=%d -> ltask=%d cnt=%d\n",task,ltask,(int) sion_tmpintfield2[task]));
975 
976  }
977 
978  /* bcast BLOCKSIZES */
979  for (blknum = 0; blknum < sion_filedesc_sub->maxusedchunks; blknum++) {
980  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
981  sion_filedesc_sub->ntasks=sion_filedesc_sub->ntotaltasksinfile;
982  _sion_read_header_var_part_nextblocksizes_to_field(sion_filedesc_sub, sion_filedesc_sub->ntotaltasksinfile, sion_tmpintfield2);
983  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
984  }
985  sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->ntotaltasksinfile, root);
986  /* store in local field */
987  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
988  task=sion_filedesc_sub->all_localranks[ltask];
989  sion_filedesc_sub->all_blocksizes[sion_filedesc_sub->nlocaltasksinfile * blknum + ltask]=sion_tmpintfield2[task];
990  }
991  }
992 
993  /* distribute keyval options */
994  sion_gendata->apidesc->bcastr_cb(&sion_filedesc_sub->keyvalmode, sion_gendata->comm_data_global, _SION_INT32, 1, root);
995 
996  /* distribute collective options */
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);
999 
1000  if(sion_filedesc_sub->usecoll) {
1001 
1002  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1003  for(task=0;task<sion_filedesc_sub->ntotaltasksinfile;task++)
1004  sion_tmpintfield2[task]= (sion_int64) (sion_filedesc_sub->all_coll_collector[task]*_SION_CONST_MAX_INT32) + sion_filedesc_sub->collsize;
1005  }
1006  sion_gendata->apidesc->bcastr_cb(sion_tmpintfield2, sion_gendata->comm_data_global, _SION_INT64, sion_filedesc_sub->ntotaltasksinfile, root);
1007  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1008  _sion_free_filedesc_coll_arrays(sion_filedesc_sub); /* free on root large field */
1009  }
1010  _sion_alloc_filedesc_all_chunksizes(sion_filedesc_sub); /* and alloc with less memory on all tasks */
1011 
1012  /* store in local field */
1013  DPRINTFP((64, "_sion_paropen_mapped_generic", rank, " store collsize+collector for %d elements\n",sion_filedesc_sub->nlocaltasksinfile));
1014  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
1015  task=sion_filedesc_sub->all_localranks[ltask];
1016  sion_filedesc_sub->all_coll_collsize[sion_filedesc_sub->nlocaltasksinfile * blknum + ltask]=(sion_int32) sion_tmpintfield2[task]%_SION_CONST_MAX_INT32;
1017  sion_filedesc_sub->all_coll_collector[sion_filedesc_sub->nlocaltasksinfile * blknum + ltask]= (sion_int32)
1018  (sion_tmpintfield2[task]-sion_filedesc_sub->all_coll_collsize[sion_filedesc_sub->nlocaltasksinfile * blknum + ltask])/_SION_CONST_MAX_INT32;
1019  }
1020  }
1021 
1022  /* init rest of data structure */
1023  if(sion_filedesc_sub->nlocaltasksinfile>0) {
1024  for (ltask = 0; ltask < sion_filedesc_sub->nlocaltasksinfile; ltask++) {
1025  sion_filedesc_sub->all_currentpos[ltask] = sion_filedesc_sub->all_startpointers[ltask];
1026  sion_filedesc_sub->all_currentblocknr[ltask] = 0;
1027  }
1028  sion_filedesc_sub->rank = 0;
1029  sion_filedesc_sub->globalrank = sion_filedesc_sub->all_globalranks[sion_filedesc_sub->rank];
1030  sion_filedesc_sub->chunksize = sion_filedesc_sub->all_chunksizes[0];
1031  sion_filedesc_sub->startpos = sion_filedesc_sub->all_startpointers[0];
1032  sion_filedesc_sub->currentpos = sion_filedesc_sub->startpos;
1033  sion_filedesc_sub->currentblocknr = 0;
1034  sion_filedesc_sub->lastchunknr = sion_filedesc_sub->all_blockcount[sion_filedesc_sub->rank]-1;
1035 
1036  /* allocate memory for keyval if necessary (small size) */
1037  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) {
1038  _sion_alloc_filedesc_all_keyvalptr(sion_filedesc_sub);
1039  }
1040 
1041 
1042  _sion_file_purge(sion_fileptr);
1043  _sion_file_set_position(sion_fileptr, sion_filedesc_sub->currentpos);
1044  }
1045  if(sion_tmpintfield2) free(sion_tmpintfield2);
1046 
1047  } /* filenr */
1048 
1049  /* set master to first file, first available rank */
1050 
1051  /* lookup file which contains current rank and set master */
1052  {
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];
1057  if(sion_filedesc_sub->nlocaltasksinfile>0) {
1058  lfile=filenr;
1059  lrank=0;
1060  break;
1061  }
1062  }
1063 
1064  DPRINTFP((32,"sion_paropen_mapped_generic",rank,"init to first local rank in first file (%d, %d)\n",lfile,lrank));
1065 
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));
1068 
1069  sion_filedesc_master->ntotaltasksinfile = sion_filedesc_master->mapping_size;
1070  sion_filedesc_master->endianness = sion_filedesc_sub->endianness;
1071  sion_filedesc_master->swapbytes = sion_filedesc_sub->swapbytes;
1072  sion_filedesc_master->globalrank = sion_filedesc_sub->all_globalranks[lrank];
1073  sion_filedesc_master->fileversion = sion_filedesc_sub->fileversion;
1074  sion_filedesc_master->filesionversion = sion_filedesc_sub->filesionversion;
1075  sion_filedesc_master->filesionpatchlevel = sion_filedesc_sub->filesionpatchlevel;
1076  sion_filedesc_master->rank = lrank;
1077  sion_filedesc_master->fsblksize = sion_filedesc_sub->fsblksize;
1078  sion_filedesc_master->filenumber = lfile;
1079 
1080  /* set info for current rank and position */
1081  sion_filedesc_master->chunksize = sion_filedesc_sub->all_chunksizes[lrank];
1082  sion_filedesc_master->startpos = sion_filedesc_sub->all_startpointers[lrank];
1083  sion_filedesc_master->currentpos = sion_filedesc_master->startpos;
1084  sion_filedesc_master->globalskip = sion_filedesc_sub->globalskip;
1085 
1086  sion_filedesc_master->currentblocknr = 0;
1087  sion_filedesc_master->lastchunknr = sion_filedesc_sub->all_blockcount[lrank]-1;
1088 
1089  sion_filedesc_master->start_of_varheader = sion_filedesc_sub->start_of_varheader;
1090 
1091 
1092  /* set maxusedchunks to maxusedchunks of all files */
1093  sion_filedesc_master->maxusedchunks = sion_filedesc_sub->maxusedchunks;
1094  for(filenr=0;filenr<sion_filedesc_sub->nfiles;filenr++) {
1095  if (sion_filedesc_master->maxusedchunks < sion_filedesc_master->multifiles[filenr]->maxusedchunks)
1096  sion_filedesc_master->maxusedchunks = sion_filedesc_master->multifiles[filenr]->maxusedchunks;
1097  }
1098  _sion_realloc_filedesc_blocklist(sion_filedesc_master, sion_filedesc_master->maxusedchunks);
1099  for (blknum = 0; blknum < sion_filedesc_sub->all_blockcount[lrank]; blknum++) {
1100  sion_filedesc_master->blocksizes[blknum] = sion_filedesc_sub->all_blocksizes[sion_filedesc_sub->nlocaltasksinfile * blknum + lrank];
1101  }
1102 
1103 
1104  /* set file pointer */
1105  sion_filedesc_master->fileptr = sion_filedesc_master->multifiles[lfile]->fileptr;
1106 
1107  /* set position */
1108  _sion_file_flush(sion_filedesc_master->fileptr);
1109 
1110  DPRINTFP((32,"sion_paropen_mapped_generic",rank,"set startpointer to %d\n",(int) sion_filedesc_master->currentpos));
1111  _sion_file_set_position(sion_filedesc_master->fileptr, sion_filedesc_master->currentpos);
1112 
1113  }
1114  } /* block */
1115 
1116  /* OUTPUT parameters */
1117  if(fileptr!=NULL) {
1118  if ( (sion_filedesc_master->fileptr!=NULL) && (sion_filedesc_master->fileptr->flags&&SION_FILE_FLAG_ANSI) ) {
1119  *fileptr=sion_filedesc_master->fileptr->fileptr;
1120  sion_filedesc_master->fileptr_exported=1;
1121  } else {
1122  *fileptr=NULL;
1123  sion_filedesc_master->fileptr_exported=0;
1124  }
1125  }
1126 
1127  {
1128  sion_int64 *helpptr_chunksize = NULL;
1129  sion_int32 *helpptr_mapping_filenrs = NULL;
1130  sion_int32 *helpptr_mapping_lranks = NULL;
1131 
1132 
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)));
1139  }
1140  *chunksizes = helpptr_chunksize;
1141  } else {
1142  helpptr_chunksize = *chunksizes;
1143  }
1144  }
1145 
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)));
1152  }
1153  *mapping_filenrs = helpptr_mapping_filenrs;
1154  } else {
1155  helpptr_mapping_filenrs = *mapping_filenrs;
1156  }
1157  }
1158 
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)));
1165  }
1166  *mapping_lranks = helpptr_mapping_lranks;
1167  } else {
1168  helpptr_mapping_lranks = *mapping_lranks;
1169  }
1170  }
1171 
1172 
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];
1176  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile;ltask++) {
1177  for(task=0;task<*nlocaltasks;task++) {
1178  if((*globalranks)[task]==sion_filedesc_sub->all_globalranks[ltask]) {
1179  DPRINTFP((32,"sion_paropen_mapped_generic:",rank," set chunksizes[%d]=%4d (filenr=%d, ltask=%d lrank=%d)\n",
1180  (int) task, (int) sion_filedesc_sub->all_chunksizes[ltask],filenr,ltask, sion_filedesc_sub->all_localranks[ltask]));
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];
1184  }
1185  }
1186  }
1187  }
1188  }
1189 
1190  } /* block */
1191 
1192  _sion_print_filedesc(sion_filedesc_master, 512, "_sion_paropen_mapped_generic", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
1193 
1194 
1195  if(sion_count) free(sion_count);
1196 
1197  if(lfilemanager) free(lfilemanager);
1198 
1199 
1200 
1201  } else {
1202  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_multi_mpi: unknown file mode"));
1203  }
1204 
1205 
1206  return (sid);
1207 }
1208 
1209 int _sion_parclose_mapped_generic( int sid,
1210  int rank,
1211  int ntasks,
1212  _sion_generic_gendata *sion_gendata ) {
1213  int rc=SION_SUCCESS;
1214  int lfile, grank, lrank, blknum, filenr, tmpsize, root, ltask, mappingroot, task;
1215  _sion_filedesc *sion_filedesc_master;
1216  _sion_filedesc *sion_filedesc_sub;
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;
1226 
1227  DPRINTFP((2, "_sion_parclose_mapped_generic", rank, "enter parallel close sid=%d\n", sid));
1228 
1229  if ((_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc_master = _sion_vcdtovcon(sid))) {
1230  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parclose_generic: invalid sion_filedesc_master, aborting %d ...\n", sid));
1231  }
1232 
1233 #ifdef SION_DEBUG
1234  {
1235  int numbytes, numfds;
1236  sion_get_sizeof(sid, &numbytes, &numfds);
1237  DPRINTFP((2, "_sion_parclose_mapped_generic", rank, "internal data size of sid %2d (%d bytes, %d fds) \n", sid,numbytes, numfds));
1238  }
1239 #endif
1240 
1241  if ((sion_filedesc_master->state != SION_FILESTATE_PAROPENMAPPED)
1242  && (sion_filedesc_master->state != SION_FILESTATE_PAROPENMAPPEDMASTER)
1243  && (sion_filedesc_master->state != SION_FILESTATE_PAROPENMAPPEDMANAGED)
1244  ) {
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));
1246  }
1247 
1248  /* READ MODE: close files on all tasks */
1249  if (sion_filedesc_master->mode == SION_FILEMODE_READ) {
1250 
1251  _sion_print_filedesc(sion_filedesc_master, 512, "_sion_parclose_mapped_generic", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
1252 
1253  if(sion_filedesc_master->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
1254 
1255 
1256  /* pointer to keyval structure -> all_keyvalptr */
1257  if(sion_filedesc_master->keyvalmode!=SION_KEYVAL_NONE) {
1258  lfile=sion_filedesc_master->filenumber;
1259  lrank=sion_filedesc_master->rank; /* index to local list */
1260  if((lrank>=0) && (lfile>=0)) {
1261  sion_filedesc_sub=sion_filedesc_master->multifiles[lfile];
1262  sion_filedesc_sub->all_keyvalptr[lrank] = sion_filedesc_master->keyvalptr;
1263  }
1264  }
1265 
1266  /* loop again over files to close and collect mapping data*/
1267  for(filenr=0;filenr<sion_filedesc_master->nfiles;filenr++) {
1268  sion_filedesc_sub=sion_filedesc_master->multifiles[filenr];
1269 
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));
1271  if (sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_sub->keyvalptr = NULL;
1272  if(sion_filedesc_sub->fileptr!=NULL) {
1273  _sion_file_close(sion_filedesc_sub->fileptr);
1274  sion_filedesc_sub->fileptr = NULL;
1275  }
1276  sion_filedesc_sub->state = SION_FILESTATE_CLOSE;
1277  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE && (sion_filedesc_sub->keyvalptr!=NULL) && (sion_filedesc_sub->all_keyvalptr!=NULL))
1278  sion_filedesc_sub->all_keyvalptr[sion_filedesc_sub->rank] = sion_filedesc_sub->keyvalptr;
1279 
1280  _sion_free_filedesc(sion_filedesc_sub);
1281  }
1282  }
1283  _SION_SAFE_FREE(mapping, NULL);
1284  _SION_SAFE_FREE(sion_filedesc_master->multifiles, NULL);
1285 
1286  /* the top-level keyvalptr is a pointer to one of the all_keyvalptr of the subfiles, which are already freed */
1287  if(sion_filedesc_master->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_master->keyvalptr = NULL;
1288 
1289  _sion_free_filedesc(sion_filedesc_master);
1290  sion_filedesc_master = NULL;
1291 
1292  } else {
1293  /* WRITE MODE: gather data from all tasks and close files on all tasks */
1294 
1295  /* update meta data of current rank on master */
1296  _sion_flush_block(sion_filedesc_master);
1297 
1298  if (sion_filedesc_master->usebuffer) {
1299  _sion_buffer_flush(sion_filedesc_master);
1300  }
1301 
1302  _sion_print_filedesc(sion_filedesc_master, 512, "_sion_parclose_mapped_generic", _SION_DEBUG_PRINT_ALL|_SION_DEBUG_PRINT_RECURSIVE);
1303 
1304  /* transfer meta data to corresponding sub datastructure */
1305  lfile=sion_filedesc_master->filenumber;
1306  lrank=sion_filedesc_master->rank; /* index to local list */
1307  sion_filedesc_sub=sion_filedesc_master->multifiles[lfile];
1308 
1309  /* pointer to keyval structure */
1310  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_sub->keyvalptr = sion_filedesc_master->keyvalptr;
1311 
1312  sion_filedesc_sub->currentpos = sion_filedesc_master->currentpos;
1313  sion_filedesc_sub->currentblocknr = sion_filedesc_master->currentblocknr;
1314  sion_filedesc_sub->lastchunknr = sion_filedesc_master->lastchunknr;
1315 
1316  /* pointer to keyval structure -> all_keyvalptr */
1317  if(sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_sub->all_keyvalptr[lrank] = sion_filedesc_sub->keyvalptr;
1318 
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));
1320  if(sion_filedesc_sub->maxchunks < sion_filedesc_master->maxchunks) {
1321  _sion_realloc_filedesc_blocklist(sion_filedesc_sub, sion_filedesc_master->maxchunks);
1322  }
1323 
1324  /* store data of current rank on sub datastructure */
1325  DPRINTFP((4, "_sion_parclose_mapped_generic", rank, "store current information lrank=%d lastchunknr=%d\n", lrank,sion_filedesc_sub->lastchunknr));
1326  sion_filedesc_sub->all_currentpos[lrank] = sion_filedesc_sub->currentpos;
1327  sion_filedesc_sub->all_currentblocknr[lrank] = sion_filedesc_sub->lastchunknr;
1328  sion_filedesc_sub->all_blockcount[lrank] = sion_filedesc_sub->lastchunknr + 1;
1329  for (blknum = 0; blknum <= sion_filedesc_sub->lastchunknr; blknum++) {
1330  sion_filedesc_sub->blocksizes[blknum] = sion_filedesc_master->blocksizes[blknum];
1331  sion_filedesc_sub->all_blocksizes[sion_filedesc_sub->ntasks * blknum + lrank] = sion_filedesc_master->blocksizes[blknum];
1332  }
1333 
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)));
1338  }
1339 
1340  /* loop over all files */
1341  for(filenr=0;filenr<sion_filedesc_master->nfiles;filenr++) {
1342 
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));
1345 
1346  if (sion_filedesc_sub->usebuffer) {
1347  _sion_buffer_flush(sion_filedesc_sub);
1348  }
1349 
1350  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPED) {
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));
1352  _sion_file_close(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;
1355  sion_filedesc_sub->state = SION_FILESTATE_CLOSE;
1356 
1357  }
1358 
1359  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_global);
1360 
1361  /* allocate send field */
1362  tmpsize=sion_filedesc_sub->nlocaltasksinfile;
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)));
1367  }
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));
1369 
1370  root=sion_filedesc_sub->filemanagedbytask;
1371  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1372 
1373  /* allocate receive fields */
1374  tmpsize=sion_filedesc_sub->ntotaltasksinfile;
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)));
1379  }
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)));
1385  }
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)));
1391  }
1392  DPRINTFP((4, "_sion_parclose_mapped_generic", rank, " file %d: allocate fields for all tasks of file (%d)\n", filenr,tmpsize));
1393 
1394 
1395  } else sion_tmpintfield_lrank_recv=sion_tmpintfield_data_recv=sion_tmpintfield_data=NULL;
1396 
1397  /* get number of tasks writing to this file */
1398  helpint32 = sion_filedesc_sub->nlocaltasksinfile;
1399  sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, root);
1400 
1401  /* collect local rank mapping */
1402  for (ltask = 0; ltask < sion_filedesc_sub->nlocaltasksinfile; ltask++) {
1403  sion_tmpintfield_send[ltask]=sion_filedesc_sub->all_localranks[ltask];
1404  }
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));
1407 
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);
1409 
1410  /* collect number of written chunks (blocks) for each file task */
1411  for (ltask = 0; ltask < sion_filedesc_sub->nlocaltasksinfile; ltask++) {
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];
1414  }
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);
1416 
1417  /* search maxusedchunks */
1418  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1419  sion_filedesc_sub->maxusedchunks = -1;
1420  for (ltask = 0; ltask < sion_filedesc_sub->ntotaltasksinfile; ltask++) {
1421  if (sion_tmpintfield_data_recv[ltask] > sion_filedesc_sub->maxusedchunks) {
1422  sion_filedesc_sub->maxusedchunks = (int) sion_tmpintfield_data_recv[ltask];
1423  }
1424 
1425  }
1426  }
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));
1429 
1430  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1431 
1432  /* sort data */
1433  for(ltask=0;ltask<sion_filedesc_sub->ntotaltasksinfile;ltask++) {
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];
1438 
1439  }
1440  /* calculate and set start_of_varheader */
1441  sion_filedesc_sub->start_of_varheader = sion_filedesc_sub->start_of_data + sion_filedesc_sub->maxusedchunks * sion_filedesc_sub->globalskip;
1442 
1443  /* adjust ntasks to total number so that internal write routines work correctly */
1444  sion_filedesc_sub->ntasks=sion_filedesc_sub->ntotaltasksinfile;
1445 
1446  /* write rest of first meta data block on rank 0 */
1447  _sion_write_header_var_info(sion_filedesc_sub);
1448 
1449  _sion_write_header_var_part_blockcount_from_field(sion_filedesc_sub,sion_filedesc_sub->ntotaltasksinfile,sion_tmpintfield_data);
1450  }
1451 
1452  for (blknum = 0; blknum < sion_filedesc_sub->maxusedchunks; blknum++) {
1453 
1454  DPRINTFP((32, "_sion_parclose_mapped_generic", rank, " collect blocksize step %d of %d\n", blknum+1,sion_filedesc_sub->maxusedchunks));
1455 
1456  /* collect number of written chunks (blocks) for each file task */
1457  DPRINTFP((32,"_sion_parclose_mapped_generic:",rank,"sion_filedesc_sub->nlocaltasksinfile=%d\n",sion_filedesc_sub->nlocaltasksinfile));
1458  for (ltask = 0; ltask < sion_filedesc_sub->nlocaltasksinfile; ltask++) {
1459  sion_tmpintfield_send[ltask]=sion_filedesc_sub->all_blocksizes[sion_filedesc_sub->nlocaltasksinfile * blknum + ltask];
1460  DPRINTFP((32,"_sion_parclose_mapped_generic:",rank,"sort in blksize[%d][%d]=%d\n",blknum, ltask, sion_tmpintfield_send[ltask]));
1461  }
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);
1463 
1464 
1465  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1466 
1467  /* sort data */
1468  for(ltask=0;ltask<sion_filedesc_sub->ntotaltasksinfile;ltask++) {
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]));
1472  }
1473 
1474  _sion_write_header_var_part_nextblocksizes_from_field(sion_filedesc_sub,sion_filedesc_sub->ntotaltasksinfile,sion_tmpintfield_data);
1475 
1476  }
1477 
1478  }
1479 
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);
1484 
1485  DPRINTFP((4, "_sion_parclose_mapped_generic", rank, " ending close for file %d: %s \n", filenr,sion_filedesc_sub->fname));
1486 
1487  } /* for */
1488 
1489  /* for mapping table */
1490  mappingroot=sion_filedesc_master->multifiles[0]->filemanagedbytask;
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) {
1496  free(sion_count);
1497  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_ABORT,"_sion_parclose_generic_mapped: Cannot allocate memory for mapping"));
1498  }
1499  }
1500 
1501  /* loop again over files to close and collect mapping data */
1502  for(filenr=0;filenr<sion_filedesc_master->nfiles;filenr++) {
1503  sion_filedesc_sub=sion_filedesc_master->multifiles[filenr];
1504 
1505  /* allocate send field */
1506  tmpsize=2 * sion_filedesc_sub->nlocaltasksinfile;
1507  sion_tmpint32field_send = (sion_int32 *) malloc(tmpsize * sizeof(sion_int32));
1508  if (sion_tmpint32field_send == NULL) {
1509  free(mapping);
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)));
1512  }
1513 
1514  /* get number of tasks writing to this file */
1515  helpint32 = sion_filedesc_sub->nlocaltasksinfile;
1516  sion_gendata->apidesc->gatherr_cb(&helpint32, sion_count, sion_gendata->comm_data_global, _SION_INT32, 1, mappingroot);
1517 
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));
1519 
1520  if(rank==mappingroot) {
1521  /* allocate receive fields */
1522  tmpsize=2 * sion_filedesc_sub->ntotaltasksinfile;
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)));
1527  }
1528  } else sion_tmpint32field_data_recv=NULL;
1529 
1530  /* collect local mapping information */
1531  for (ltask = 0; ltask < sion_filedesc_sub->nlocaltasksinfile; ltask++) {
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]));
1535  }
1536 
1537  for(ltask=0;ltask<sion_filedesc_sub->nlocaltasksinfile*2;ltask++) {
1538  DPRINTFP((32,"_sion_parclose_mapped_generic:",rank," sion_tmpint32field_send: %d -> %d \n",ltask, sion_tmpint32field_send[ltask]));
1539  }
1540 
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;
1544 
1545  if(rank==mappingroot) {
1546  /* sort data into mapping vector */
1547  for(ltask=0;ltask<sion_filedesc_sub->ntotaltasksinfile*2;ltask++) {
1548  DPRINTFP((32,"_sion_parclose_mapped_generic:",rank," sion_tmpint32field_send: %d -> %d \n",ltask, sion_tmpint32field_data_recv[ltask]));
1549  }
1550  for(ltask=0;ltask<sion_filedesc_sub->ntotaltasksinfile;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;
1556  }
1557  }
1558 
1559  if(sion_tmpint32field_data_recv) free(sion_tmpint32field_data_recv);
1560  if(sion_tmpint32field_send) free(sion_tmpint32field_send);
1561  }
1562 
1563  /* loop again over files to close and collect mapping data*/
1564  for(filenr=0;filenr<sion_filedesc_master->nfiles;filenr++) {
1565  sion_filedesc_sub=sion_filedesc_master->multifiles[filenr];
1566 
1567  if(sion_filedesc_sub->state == SION_FILESTATE_PAROPENMAPPEDMANAGED) {
1568 
1569  /* write mapping */
1570  if(filenr==0) {
1571  DPRINTFP((32,"_sion_parclose_mapped_generic:",rank,"mapping size is %d\n",sion_filedesc_master->mapping_size));
1572  _sion_write_header_var_part_mapping(sion_filedesc_sub, sion_filedesc_master->mapping_size, mapping);
1573  }
1574 
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));
1576  _sion_file_close(sion_filedesc_sub->fileptr);
1577  sion_filedesc_sub->fileptr = NULL;
1578  }
1579 
1580  sion_filedesc_sub->state = SION_FILESTATE_CLOSE;
1581  if (sion_filedesc_sub->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_sub->keyvalptr = NULL;
1582 
1583  /* revert ntasks to local number so that free routines work correctly */
1584  sion_filedesc_sub->ntasks=sion_filedesc_sub->nlocaltasksinfile;
1585 
1586  _sion_free_filedesc(sion_filedesc_sub);
1587  }
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);
1590  }
1591  _SION_SAFE_FREE(mapping, NULL);
1592  _SION_SAFE_FREE(sion_count, NULL);
1593  _SION_SAFE_FREE(sion_filedesc_master->multifiles, NULL);
1594 
1595  if (sion_filedesc_master->keyvalmode!=SION_KEYVAL_NONE) sion_filedesc_master->keyvalptr = NULL;
1596  _sion_free_filedesc(sion_filedesc_master);
1597  sion_filedesc_master = NULL;
1598 
1599  } /* write */
1600 
1601  DPRINTFP((2, "_sion_parclose_mapped_generic", rank, "leave parallel close sid=%d\n", sid));
1602 
1603  return (rc);
1604 }
1605 
1606 /* END OF _sion_parclose_generic */
1607 
SION_FILE_FLAG_ANSI
#define SION_FILE_FLAG_ANSI
Definition: sion_file.h:21
_sion_write_header
int _sion_write_header(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 1.
Definition: sion_metadata.c:37
_sion_filedesc_struct::all_currentblocknr
sion_int64 * all_currentblocknr
Definition: sion_filedesc.h:148
_sion_filedesc_struct::usebuffer
sion_int32 usebuffer
Definition: sion_filedesc.h:88
_sion_filedesc_struct::all_coll_collector
sion_int32 * all_coll_collector
Definition: sion_filedesc.h:149
_sion_read_header_var_part_nextblocksizes_to_field
int _sion_read_header_var_part_nextblocksizes_to_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Read the next set of blocksizes from Meta Block 2 Assuming that filepointer is at the correct positio...
Definition: sion_metadata.c:606
_sion_file_close
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.
Definition: sion_file.c:139
_sion_filedesc_struct::usecoll
sion_int32 usecoll
Definition: sion_filedesc.h:180
_sion_filedesc_struct::filenumber
sion_int32 filenumber
Definition: sion_filedesc.h:128
_sion_write_header_var_info
int _sion_write_header_var_info(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 1.
Definition: sion_metadata.c:183
SION_FILESTATE_PAROPENMAPPED
#define SION_FILESTATE_PAROPENMAPPED
Definition: sion_filedesc.h:33
_sion_filedesc_struct::compress
sion_int32 compress
Definition: sion_filedesc.h:166
_sion_filedesc_struct::all_blocksizes
sion_int64 * all_blocksizes
Definition: sion_filedesc.h:157
_sion_generic_gendata_struct
Definition: sion_generic_apidesc.h:59
_sion_filedesc_struct::currentblocknr
sion_int32 currentblocknr
Definition: sion_filedesc.h:96
_sion_vcdtype
int _sion_vcdtype(int sid)
Definition: sion_fd.c:57
_sion_filedesc_struct::maxusedchunks
sion_int32 maxusedchunks
Definition: sion_filedesc.h:129
sion_filedesc.h
_sion_filedesc_struct::fileptr
_sion_fileptr * fileptr
Definition: sion_filedesc.h:81
sion_internal.h
sion_buffer.h
_sion_file_set_position
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:292
sion_generic_internal.h
_sion_filedesc_struct::collsize
sion_int32 collsize
Definition: sion_filedesc.h:181
_sion_filedesc_struct::all_startpointers
sion_int64 * all_startpointers
Definition: sion_filedesc.h:146
_sion_filedesc_struct::blocksizes
sion_int64 * blocksizes
Definition: sion_filedesc.h:99
_sion_filedesc_struct::filesionversion
sion_int32 filesionversion
Definition: sion_filedesc.h:114
_sion_filedesc_struct::sid
sion_int32 sid
Definition: sion_filedesc.h:85
_sion_filedesc_struct::mode
sion_int32 mode
Definition: sion_filedesc.h:108
_sion_filedesc_struct::mapping_size
sion_int32 mapping_size
Definition: sion_filedesc.h:160
MAXCHUNKS
#define MAXCHUNKS
Definition: sion_common.h:34
_sion_filedesc_struct::all_coll_collsize
sion_int32 * all_coll_collsize
Definition: sion_filedesc.h:150
SION_FILE_FLAG_SIONFWD
#define SION_FILE_FLAG_SIONFWD
Definition: sion_file.h:27
_sion_filedesc_struct::rank
sion_int32 rank
Definition: sion_filedesc.h:94
_sion_buffer_flush
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:177
_sion_filedesc_struct::nlocaltasksinfile
sion_int32 nlocaltasksinfile
Definition: sion_filedesc.h:139
_sion_flush_block
int _sion_flush_block(_sion_filedesc *sion_filedesc)
Update the internal data structure.
Definition: sion_internal.c:1032
SION_FILEMODE_WRITE
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:37
_sion_free_filedesc_coll_arrays
int _sion_free_filedesc_coll_arrays(_sion_filedesc *sion_filedesc)
free memory for the internal sion arrays
Definition: sion_filedesc.c:494
_sion_alloc_filedesc_coll_arrays
int _sion_alloc_filedesc_coll_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion arrays.
Definition: sion_filedesc.c:447
_sion_print_filedesc
int _sion_print_filedesc(_sion_filedesc *sion_filedesc, int level, char *desc, int flag)
Print the initialized sion file description.
Definition: sion_filedesc.c:656
_sion_filedesc_struct::flag2
sion_int64 flag2
Definition: sion_filedesc.h:120
_sion_alloc_filedesc_block_arrays
int _sion_alloc_filedesc_block_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion structure, fields for all chunksizes of all tasks.
Definition: sion_filedesc.c:522
_sion_filedesc_struct::fsblksize
sion_int32 fsblksize
Definition: sion_filedesc.h:117
_sion_read_header_var_part
int _sion_read_header_var_part(_sion_filedesc *sion_filedesc)
Read the second part of SION Meta Block 1.
Definition: sion_metadata.c:502
sion_fd.h
_sion_alloc_filedesc_arrays
int _sion_alloc_filedesc_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion arrays.
Definition: sion_filedesc.c:336
_sion_filedesc_struct::all_globalranks
sion_int64 * all_globalranks
Definition: sion_filedesc.h:144
_sion_filedesc_struct::prefix
char * prefix
Definition: sion_filedesc.h:162
sion.h
_sion_filedesc_struct::keyvalptr
void * keyvalptr
Definition: sion_filedesc.h:83
sion_debug.h
_sion_vcdtovcon
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:52
_sion_file_purge
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:371
_sion_open_read
int _sion_open_read(const char *fname, sion_int64 file_mode_flags, int read_all, int *ntasks, int *nfiles, sion_int64 **chunksizes, sion_int32 *fsblksize, int **globalranks, FILE **fileptr)
internal sion serial open function for reading on one or more files
Definition: sion_internal.c:258
SION_FILESTATE_PAROPENMAPPEDMANAGED
#define SION_FILESTATE_PAROPENMAPPEDMANAGED
Definition: sion_filedesc.h:32
SION_FILESTATE_PAROPENMAPPEDMASTER
#define SION_FILESTATE_PAROPENMAPPEDMASTER
Definition: sion_filedesc.h:31
_sion_filedesc_struct::all_localranks
sion_int64 * all_localranks
Definition: sion_filedesc.h:145
_sion_filedesc_struct::globalskip
sion_int64 globalskip
Definition: sion_filedesc.h:123
_sion_filedesc_struct::fileptr_exported
sion_int32 fileptr_exported
Definition: sion_filedesc.h:186
_sion_write_header_var_part_blockcount_from_field
int _sion_write_header_var_part_blockcount_from_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Write the block sizes from Meta Block 2.
Definition: sion_metadata.c:875
_sion_filedesc_struct
Sion File Descriptor Structure.
Definition: sion_filedesc.h:78
sion_internal_startptr.h
_sion_filedesc_struct::currentpos
sion_int64 currentpos
Definition: sion_filedesc.h:95
_sion_filedesc_struct::all_chunksizes
sion_int64 * all_chunksizes
Definition: sion_filedesc.h:143
_sion_filedesc_struct::keyvalmode
sion_int32 keyvalmode
Definition: sion_filedesc.h:169
_sion_filedesc_struct::multifiles
_sion_filedesc ** multifiles
Definition: sion_filedesc.h:163
_sion_paropen_mapped_generic
int _sion_paropen_mapped_generic(int sid, char *fname, sion_int64 file_mode_flags, char *prefix, int *numFiles, int *nlocaltasks, int **globalranks, sion_int64 **chunksizes, int **mapping_filenrs, int **mapping_lranks, sion_int32 *fsblksize, int rank, int ntasks, int flag, FILE **fileptr, _sion_generic_gendata *sion_gendata)
Generic parallel open of one direct access file. Mapping sion files to environment with less tasks.
Definition: sion_generic_mapped.c:65
SION_FILEDESCRIPTOR
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:16
_sion_filedesc_struct::flag1
sion_int64 flag1
Definition: sion_filedesc.h:119
sion_get_keyval_mode
int sion_get_keyval_mode(int sid)
Return selected mode for key value.
Definition: sion_keyvalue.c:406
_sion_file_get_opt_blksize
long _sion_file_get_opt_blksize(_sion_fileptr *sion_fileptr)
Get optional file system block size for a file.
Definition: sion_file.c:229
_sion_file_get_position
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:319
_sion_filedesc_struct::maxchunks
sion_int32 maxchunks
Definition: sion_filedesc.h:118
_sion_filedesc_struct::all_keyvalptr
void ** all_keyvalptr
Definition: sion_filedesc.h:153
sion_generic_collective.h
_sion_write_header_var_part_nextblocksizes_from_field
int _sion_write_header_var_part_nextblocksizes_from_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Write the next set of blocksizes from Meta Block 2 Assuming that filepointer is at the correct positi...
Definition: sion_metadata.c:915
_sion_read_header_fix_part
int _sion_read_header_fix_part(_sion_filedesc *sion_filedesc)
Read part of the SION Meta Block 1.
Definition: sion_metadata.c:316
_sion_filedesc_struct::fname
char * fname
Definition: sion_filedesc.h:104
_sion_file_open
_sion_fileptr * _sion_file_open(const char *fname, unsigned int flags, unsigned int addflags)
Create and open a new file for writing.
Definition: sion_file.c:45
_sion_filedesc_struct::ntasks
sion_int32 ntasks
Definition: sion_filedesc.h:106
_sion_filedesc_struct::globalrank
sion_int32 globalrank
Definition: sion_filedesc.h:105
SION_FILE_FLAG_CREATE
#define SION_FILE_FLAG_CREATE
Definition: sion_file.h:24
_sion_filedesc_struct::start_of_varheader
sion_int64 start_of_varheader
Definition: sion_filedesc.h:125
_sion_init_filedesc
int _sion_init_filedesc(_sion_filedesc *sion_filedesc)
Initialize the sion file description.
Definition: sion_filedesc.c:37
_sion_file_flush
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:345
sion_file.h
sion_metadata.h
SION_FILESTATE_CLOSE
#define SION_FILESTATE_CLOSE
Definition: sion_filedesc.h:34
_sion_filedesc_struct::all_currentpos
sion_int64 * all_currentpos
Definition: sion_filedesc.h:147
_sion_filedesc_struct::fileversion
sion_int32 fileversion
Definition: sion_filedesc.h:116
_sion_filedesc_struct::swapbytes
sion_int32 swapbytes
Definition: sion_filedesc.h:113
_sion_filedesc_struct::nfiles
sion_int32 nfiles
Definition: sion_filedesc.h:127
SION_FILE_FLAG_POSIX
#define SION_FILE_FLAG_POSIX
Definition: sion_file.h:23
_sion_get_endianness_with_flags
sion_int32 _sion_get_endianness_with_flags(sion_int64 flags)
Return endianness including possible choice via flags.
Definition: sion_internal.c:1140
_sion_read_header_var_part_blockcount_to_field
int _sion_read_header_var_part_blockcount_to_field(_sion_filedesc *sion_filedesc, int field_size, sion_int64 *field)
Read the block sizes from Meta Block 2.
Definition: sion_metadata.c:565
_sion_filedesc_struct::state
sion_int32 state
Definition: sion_filedesc.h:107
sion_get_mapping
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
Definition: sion_common.c:219
_sion_write_header_var_part_mapping
int _sion_write_header_var_part_mapping(_sion_filedesc *sion_filedesc, sion_int32 mapping_size, sion_int32 *mapping)
Write mapping into the SION Meta Block 2.
Definition: sion_metadata.c:263
_sion_filedesc_struct::all_blockcount
sion_int64 * all_blockcount
Definition: sion_filedesc.h:156
SION_KEYVAL_NONE
#define SION_KEYVAL_NONE
Definition: sion_const.h:79
_sion_alloc_filedesc
_sion_filedesc * _sion_alloc_filedesc(void)
Allocates memory for internal sion structure.
Definition: sion_filedesc.c:168
_sion_filedesc_struct::end_of_header
sion_int64 end_of_header
Definition: sion_filedesc.h:124
_sion_filedesc_struct::chunksize
sion_int64 chunksize
Definition: sion_filedesc.h:121
_sion_filedesc_struct::start_of_data
sion_int64 start_of_data
Definition: sion_filedesc.h:126
_sion_filedesc_struct::ntotaltasksinfile
sion_int32 ntotaltasksinfile
Definition: sion_filedesc.h:138
_sion_get_multi_filename
char * _sion_get_multi_filename(const char *fname, int filenumber)
generates the multi filename
Definition: sion_internal.c:911
SION_FILE_FLAG_WRITE
#define SION_FILE_FLAG_WRITE
Definition: sion_file.h:25
_sion_filedesc_struct::startpos
sion_int64 startpos
Definition: sion_filedesc.h:101
_sion_reassignvcd
int _sion_reassignvcd(int sid, void *data, int type)
Definition: sion_fd.c:62
SION_FILE_FLAG_READ
#define SION_FILE_FLAG_READ
Definition: sion_file.h:26
SION_FILEMODE_READ
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:36
_sion_filedesc_struct::endianness
sion_int32 endianness
Definition: sion_filedesc.h:109
sion_printts.h
Sion Time Stamp Header.
_sion_filedesc_struct::filemanagedbytask
sion_int32 filemanagedbytask
Definition: sion_filedesc.h:140
sion_keyvalue.h
_sion_fileptr_s
Definition: sion_file.h:29
_sion_realloc_filedesc_blocklist
int _sion_realloc_filedesc_blocklist(_sion_filedesc *sion_filedesc, sion_int32 maxchunks)
Increase the memory used by the internal sion structure for the blocklist.
Definition: sion_filedesc.c:191
sion_get_sizeof
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
Definition: sion_common.c:1123
_sion_filedesc_struct::filesionpatchlevel
sion_int32 filesionpatchlevel
Definition: sion_filedesc.h:115
_sion_filedesc_struct::lastchunknr
sion_int32 lastchunknr
Definition: sion_filedesc.h:100