SIONlib  1.6.2
Scalable I/O library for parallel access to task-local files
sion_generic_internal.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <unistd.h>
23 
24 #include "sion.h"
25 #include "sion_debug.h"
26 #include "sion_file.h"
27 #include "sion_filedesc.h"
28 #include "sion_fd.h"
29 #include "sion_metadata.h"
30 #include "sion_internal.h"
31 #include "sion_printts.h"
32 #include "sion_keyvalue.h"
33 #include "sion_flags.h"
34 
35 #include "sion_cache.h"
36 #include "sion_buffer.h"
37 #include "sion_hints.h"
38 #include "sion_generic_internal.h"
40 
63  int sid,
64  char *fname,
65  _sion_flags_store *flags_store,
66  char *prefix,
67  int *numFiles,
68  int *filenumber,
69  sion_int64 *chunksize,
70  sion_int32 *fsblksize,
71  int rank,
72  int ntasks,
73  int *globalrank,
74  int flag,
75  FILE **fileptr,
76  _sion_generic_gendata *sion_gendata )
77 {
78 
79  int i, j;
80  int rc;
81 
82  _sion_filedesc *sion_filedesc;
83  _sion_fileptr *sion_fileptr;
84 
85  int nfiles, filenum;
86  sion_int64 lchunksize, lstartpointer, lglobalrank, new_fsblocksize, helpint64, apiflag;
87  sion_int64 *sion_tmpintfield = NULL;
88 
89  _sion_flags_entry* flags_entry = NULL;
90 
91  if (flags_store->mask&_SION_FMODE_POSIX) apiflag=SION_FILE_FLAG_POSIX;
92  else apiflag=SION_FILE_FLAG_ANSI;
93 
94 
95  DPRINTFP((2, "_sion_paropen_generic_one_file", rank, "enter parallel open of file %s in mode %d #tasks=%d\n", fname, (int) flags_store->mask, ntasks));
96  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, "sizeof: int=%d long=%d longlong=%d sion_int32=%d sion_int64=%d\n", sizeof(int), sizeof(long),
97  sizeof(long long), sizeof(sion_int32), sizeof(sion_int64)));
98 
99  /* some shortcuts */
100  nfiles = *numFiles;
101  filenum = *filenumber;
102 
103  sion_filedesc = _sion_alloc_filedesc();
104  if (sion_filedesc == NULL) {
105  _sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_ABORT,"_sion_paropen_omp: cannot allocate filedescriptor structure of size %lu (sion_filedesc), aborting ...\n",
106  (unsigned long) sizeof(sion_filedesc));
107  }
108  _sion_init_filedesc(sion_filedesc);
109  sion_filedesc->fname = strdup(fname); /* Set the filename */
110 
111  _sion_reassignvcd(sid,sion_filedesc, SION_FILEDESCRIPTOR);
112  sion_filedesc->sid=sid;
113 
114  /* Allocate memory for storing MAXCHUNKS chunksize infos in internal structure */
116  sion_filedesc->lastchunknr = 0; /* Set the current number of chunks */
117  sion_filedesc->currentblocknr = 0; /* Set the current block number */
118 
119 
120 
121  if (flags_store->mask&_SION_FMODE_WRITE) {
122  /* **************** WRITE mode **************** */
123 
124  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, " starting open for write #tasks=%d\n", ntasks));
125 
126  /* check parameter */
127  if (ntasks<0) {
128  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen: wrong number of tasks specific: ntasks=%d (<0), returning ...\n", (int) ntasks));
129  }
130 
131  /* check parameter */
132  if (chunksize<0) {
133  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen: chunksize=%d < 0, returning ...\n", (int) *chunksize));
134  }
135 
136  /* check parameter */
137  if (globalrank<0) {
138  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen: globalrank < 0, returning ...\n", (int) *globalrank));
139  }
140 
141  sion_filedesc->state = SION_FILESTATE_PAROPEN;
142  sion_filedesc->mode = SION_FILEMODE_WRITE;
143  sion_filedesc->endianness = _sion_get_endianness_with_flags(flags_store->mask); /* Endianness */
144  sion_filedesc->swapbytes = 0; /* Endianness, swapping bytes */
145  sion_filedesc->fsblksize = *fsblksize;
146  sion_filedesc->rank = rank;
147  sion_filedesc->globalrank = *globalrank;
148  sion_filedesc->ntasks = ntasks;
149  sion_filedesc->nfiles = nfiles;
150  sion_filedesc->filenumber = filenum;
151  sion_filedesc->prefix = strdup(prefix);
152  sion_filedesc->compress = flags_store->mask&_SION_FMODE_COMPRESS;
153  sion_filedesc->usecoll = (flags_store->mask&_SION_FMODE_COLLECTIVE)>0;
154  sion_filedesc->collmergemode = (flags_store->mask&_SION_FMODE_COLLECTIVE_MERGE)>0;
155 
156 
157  /* close file on rank 0, first time to create file and get fsblksize if necessary */
158  if (rank == 0) {
159  sion_fileptr = _sion_file_open(fname,apiflag|SION_FILE_FLAG_WRITE|SION_FILE_FLAG_CREATE,0);
160  if (!sion_fileptr) {
161  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_generic: cannot open %s for writing, aborting ...\n", fname));
162  }
163  if(*fsblksize<=-1) {
164  /* check with fstat fsblksize */
165  new_fsblocksize=(sion_int64) _sion_file_get_opt_blksize(sion_fileptr);
166  if((new_fsblocksize<0) || (new_fsblocksize>SION_MAX_FSBLOCKSIZE)) new_fsblocksize=SION_DEFAULT_FSBLOCKSIZE;
167  }
168  _sion_file_close(sion_fileptr);
169  }
170  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
171  /* printf("WF: rank=%2d after first barrier fsblksize=%d\n",rank,(int) *fsblksize); */
172 
173  /* distribute new fsblksize */
174  if(*fsblksize==-1) {
175  sion_gendata->apidesc->bcastr_cb(&new_fsblocksize, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
176  *fsblksize=new_fsblocksize;
177  sion_filedesc->fsblksize = *fsblksize;
178  /* printf("WF: rank=%2d after bcast fsblksize=%d new_fsblocksize=%d\n",rank,(int) *fsblksize,(int) new_fsblocksize); */
179  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, "setting fsblksize to %lld\n", new_fsblocksize));
180  }
181 
182  /* check for buffer, needed at this point to set flag before writing header */
183  _sion_cache_check_env(sion_filedesc);
184  _sion_buffer_check_env(sion_filedesc);
185 
186  /* check for keyval parameter, needed at this point to set flag before writing header (flag1) */
187  if (rank == 0) {
188  _sion_keyval_check_env(sion_filedesc, flags_store->mask);
189  }
190  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->keyvalmode, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
191 
192  /* check for collective options */
193  if (rank == 0) {
194  if ((flags_entry = _sion_flags_get(flags_store, "collsize"))) {
195  sion_filedesc->collsize = atoi(flags_entry->val);
196  }
197  _sion_coll_check_env(sion_filedesc);
198  }
199  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->usecoll, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
200  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->collsize, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
201  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->collmergemode, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
202 
203  /* check if API support coalescing I/O */
204  if(sion_filedesc->usecoll) {
205  if(sion_gendata->apidesc->level!=SION_GENERIC_API_LEVEL_FULL) {
206  _sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_WARN,"sion_paropen_generic: requested coalescing I/O but API does not support this mode, falling back to individual mode ...\n");
207  sion_filedesc->usecoll=0;
208  }
209  }
210 
211  /* check for hints options */
212  if (rank == 0) {
213  _sion_hints_check_env(sion_filedesc);
214  }
215  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->usehints, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
216  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->hinttype, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
217 
218  /* */ DPRINTFTS(rank, "before alloc");
219  if (rank == 0) {
220  /* memory allocation for internal fields */
221  _sion_alloc_filedesc_arrays(sion_filedesc);
222  if(sion_filedesc->usecoll) _sion_alloc_filedesc_coll_arrays(sion_filedesc);
223  }
224  /* */ DPRINTFTS(rank, "after alloc");
225 
226  /* collect data and init startpointers on PE 0 */
227  lchunksize = (sion_int64) *chunksize;
228  lglobalrank = (sion_int64) *globalrank;
229  sion_filedesc->chunksize_req=lchunksize;
230  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, "lchunksize=%lld lglobalrank=%lld\n", lchunksize,lglobalrank));
231 
232  /* */ DPRINTFTS2(rank, "before gather");
233  sion_gendata->apidesc->gatherr_cb(&lchunksize, sion_filedesc->all_chunksizes, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
234  sion_gendata->apidesc->gatherr_cb(&lglobalrank, sion_filedesc->all_globalranks, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
235 
236  /* check capability of tasks */
237  if(sion_filedesc->usecoll) {
238  sion_filedesc->coll_capability=sion_gendata->apidesc->get_capability_cb(sion_gendata->comm_data_global);
239  sion_gendata->apidesc->gatherr_cb(&sion_filedesc->coll_capability, sion_filedesc->all_coll_capability, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
240  }
241 
242  /* */ DPRINTFTS2(rank, "after gather");
243  if (rank == 0) {
244  /* */ DPRINTFTS(rank, "before calculate");
245  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, "chunksizes[%d - 1]=%ld\n", ntasks,(long) sion_filedesc->all_chunksizes[ntasks - 1]));
246  if (!sion_filedesc->usecoll) _sion_calculate_startpointers(sion_filedesc);
247  else {
248  if (!sion_filedesc->collmergemode) _sion_calculate_startpointers_collective(sion_filedesc);
249  else _sion_calculate_startpointers_collective_merge(sion_filedesc);
250  }
251  /* */ DPRINTFTS(rank, "after calculate");
252  }
253 
254  /* open file on all ranks */
255  /* */ DPRINTFTS(rank, "before open");
256  sion_fileptr = _sion_file_open(fname,apiflag|SION_FILE_FLAG_WRITE,0);
257  if (!sion_fileptr) {
258  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_generic: cannot open %s for reading, aborting ...\n", fname));
259  }
260  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
261  /* */ DPRINTFTS(rank, "after open");
262 
263  /* store data in static data structure (sid) */
264  sion_filedesc->fileptr = sion_fileptr;
265 
266 
267  /* write header */
268  if (rank == 0) {
269 
270  /* apply hint for first meta data block */
271  _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_METADATABLOCK1);
272 
273  /* */ DPRINTFTS(rank, "before writeh");
274  _sion_write_header(sion_filedesc);
275  /* */ DPRINTFTS(rank, "after writeh");
276 
277  /* needed for writing pointer to var part of metadata at the end of the file */
278  sion_filedesc->end_of_header = _sion_file_get_position(sion_filedesc->fileptr);
279  sion_filedesc->start_of_data = sion_filedesc->all_startpointers[0];
280  /*set max. file size */
281  lstartpointer = sion_filedesc->all_startpointers[ntasks - 1]
282  + sion_filedesc->all_chunksizes[ntasks - 1];
283  /* */ DPRINTFTS(rank, "before setp(0)");
284  _sion_file_flush(sion_filedesc->fileptr);
285  _sion_file_set_position(sion_filedesc->fileptr, lstartpointer);
286  /* */ DPRINTFTS(rank, "after setp(0)");
287 
288  }
289 
290  /* distribute start_pos */
291  /* */ DPRINTFTS(rank, "before scatter");
292  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_startpointers, &sion_filedesc->startpos, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
293  /* */ DPRINTFTS(rank, "after scatter");
294 
295  /* distribute chunksize */
296  /* */ DPRINTFTS(rank, "before scatter");
297  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_chunksizes, &sion_filedesc->chunksize, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
298  /* */ DPRINTFTS(rank, "after scatter");
299 
300  /* distribute information for collective operations */
301  if(sion_filedesc->usecoll) {
302  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_coll_collsize, &sion_filedesc->collsize, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
303  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_coll_collector, &sion_filedesc->collector, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
304 
305  _sion_free_filedesc_coll_arrays(sion_filedesc);
306  }
307 
308  /* distribute globalskip */
309  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->globalskip, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
310 
311  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, " start position is %10lld %10.4f MB chunksize=%10lld %10.4f MB\n",
312  sion_filedesc->startpos, sion_filedesc->startpos / 1024.0 / 1024.0,
313  sion_filedesc->chunksize, sion_filedesc->chunksize / 1024.0 / 1024.0
314  ));
315 
316  /* set filepointer on each task */
317  /* */ DPRINTFTS(rank, "before setp");
318  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
319  _sion_file_flush(sion_filedesc->fileptr);
320  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->startpos);
321  sion_filedesc->currentpos = sion_filedesc->startpos;
322  /* given by calculate startpointers ...
323  sion_filedesc->chunksize = (sion_int64) *chunksize;
324  */
325  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
326 
327  /* apply hint for first chunk */
328  _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_CHUNK);
329 
330  /* */ DPRINTFTS(rank, "after setp");
331  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, " ending open for write #tasks=%d filepos=%lld\n", ntasks, _sion_file_get_position(sion_filedesc->fileptr)));
332 
333  }
334  else if (flags_store->mask&_SION_FMODE_READ) {
335  /* **************** READ mode **************** */
336  if (rank == 0)
337  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, " starting open for read #tasks=%d\n", ntasks));
338 
339  /* */ DPRINTFTS(rank, "before openR");
340  sion_fileptr = _sion_file_open(fname,apiflag|SION_FILE_FLAG_READ,0);
341  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
342  /* */ DPRINTFTS(rank, "after openR");
343  if (!sion_fileptr) {
344  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_generic_one_file: cannot open %s for reading, aborting ...\n", fname));
345  }
346 
347  /* store data in static data structure (sid) */
348  sion_filedesc->fileptr = sion_fileptr;
349  sion_filedesc->rank = rank;
350  sion_filedesc->ntasks = ntasks;
351  sion_filedesc->state = SION_FILESTATE_PAROPEN;
352  sion_filedesc->mode = SION_FILEMODE_READ;
353  sion_filedesc->nfiles = nfiles;
354 
355 
356  if (rank == 0) {
357  rc = _sion_read_header_fix_part(sion_filedesc);
358  if (rc!=SION_SUCCESS) {
359  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_generic_one_file: cannot read header from file %s, aborting ...\n", fname));
360  }
361  DPRINTFP((32, "_sion_paropen_generic_one_file", rank,
362  " read, after read of fix header part endianness=0x%x blksize=%d ntasks=%d\n", sion_filedesc->endianness, sion_filedesc->fsblksize, sion_filedesc->ntasks));
363 
364  /* */ DPRINTFTS(rank, "before alloc");
365  /* memory allocation */
366  _sion_alloc_filedesc_arrays(sion_filedesc);
367  /* */ DPRINTFTS(rank, "after alloc");
368 
369  rc = _sion_read_header_var_part(sion_filedesc);
370  if (rc!=SION_SUCCESS) {
371  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_generic_one_file: cannot read header from file %s, aborting ...\n", fname));
372  }
373 
374  if ((flags_entry = _sion_flags_get(flags_store, "collsize"))) {
375  sion_filedesc->collsize = atoi(flags_entry->val);
376  }
377  _sion_coll_check_env(sion_filedesc);
378  if(sion_filedesc->usecoll) _sion_alloc_filedesc_coll_arrays(sion_filedesc);
379 
380  /* collective */
381  if (!sion_filedesc->usecoll) _sion_calculate_startpointers(sion_filedesc);
382  else {
383  if (!sion_filedesc->collmergemode) _sion_calculate_startpointers_collective(sion_filedesc);
384  else _sion_calculate_startpointers_collective_merge(sion_filedesc);
385  }
386  /* */ DPRINTFTS(rank, "after calculate");
387 
388  /* check for keyval parameter, needed at this point to set flag before writing header (flag1) */
389  _sion_keyval_check_env(sion_filedesc, flags_store->mask);
390 
391  }
392  /* distribute keyvalmode */
393  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->keyvalmode, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
394 
395  /* distribute collective options */
396  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->usecoll, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
397  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->collsize, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
398 
399  if(sion_filedesc->usecoll) {
400  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_coll_collsize, &sion_filedesc->collsize, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
401  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_coll_collector, &sion_filedesc->collector, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
402 
403  _sion_free_filedesc_coll_arrays(sion_filedesc);
404  }
405 
406  /* distribute globalskip */
407  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->globalskip, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
408 
409  /* broadcast information read from file */
410  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->endianness, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
411  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->swapbytes, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
412  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->fsblksize, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
413  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->ntasks, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
414  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->fileversion, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
415  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->nfiles, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
416  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->filenumber, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
417  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->flag1, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
418  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->flag2, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
419  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->maxusedchunks, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
420 
421  DPRINTFP((32, "_sion_paropen_generic_one_file", rank,
422  " read, after read of maxusedchunks=%d maxchunks=%d (%d)\n", sion_filedesc->maxusedchunks,sion_filedesc->maxchunks, MAXCHUNKS));
423  if (sion_filedesc->maxusedchunks > MAXCHUNKS) _sion_realloc_filedesc_blocklist(sion_filedesc, sion_filedesc->maxusedchunks);
424  /* */ DPRINTFTS(rank, "after bcast");
425 
426  /* scatter per task information read from file */
427  /* */ DPRINTFTS(rank, "before scatter");
428  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_chunksizes, &sion_filedesc->chunksize, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
429  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_startpointers, &sion_filedesc->startpos, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
430  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_globalranks, &helpint64, sion_gendata->comm_data_local, _SION_INT64, 1, 0);sion_filedesc->globalrank=(sion_int32) helpint64;
431  /* */ DPRINTFTS(rank, "after scatter");
432 
433  /* read number of blocks for each task */
434  if (rank == 0) {
435  sion_tmpintfield = (sion_int64 *) malloc(ntasks * sizeof(sion_int64));
436  if (sion_tmpintfield == NULL) {
437  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_paropen_generic_one_file: cannot allocate temporary memory of size %lu (sion_tmpintfield), aborting ...\n",
438  (unsigned long) ntasks * sizeof(sion_int64)));
439  }
440  _sion_read_header_var_part_blockcount_to_field(sion_filedesc, ntasks, sion_tmpintfield);
441 
442  for (j = 0; j < ntasks; j++)
443  DPRINTFP((2048, "_sion_paropen_generic_one_file", rank, " read, blockcount on task %02d is %10ld\n", j, (long) sion_tmpintfield[j]));
444  }
445 
446  /* and distribute them */
447  /* */ DPRINTFTS(rank, "before scatter");
448  sion_gendata->apidesc->scatterr_cb(sion_tmpintfield, &helpint64, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
449  /* */ DPRINTFTS(rank, "after scatter");
450  sion_filedesc->lastchunknr = helpint64-1;
451  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, " lastchunknr on task %02d is %10ld\n", rank, (long) sion_filedesc->lastchunknr));
452 
453  for (i = 0; i < sion_filedesc->maxusedchunks; i++) {
454  if (rank == 0) _sion_read_header_var_part_nextblocksizes_to_field(sion_filedesc, ntasks, sion_tmpintfield);
455  /* */ DPRINTFTS(rank, "before scatter");
456  sion_gendata->apidesc->scatterr_cb(sion_tmpintfield, &helpint64, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
457  /* */ DPRINTFTS(rank, "after scatter");
458  sion_filedesc->blocksizes[i] = helpint64;
459  }
460 
461  #define BGFLUSH
462  #ifdef BGFLUSH
463  _sion_file_flush(sion_filedesc->fileptr);
464  #endif
465 
466  /* */ DPRINTFTS(rank, "before setp");
467  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
468  _sion_file_purge(sion_filedesc->fileptr);
469  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->startpos);
470  sion_filedesc->currentpos = sion_filedesc->startpos;
471  sion_filedesc->currentblocknr = 0;
472 
473  /* OUTPUT parameters */
474  *fsblksize = sion_filedesc->fsblksize;
475  *chunksize = sion_filedesc->chunksize;
476  *globalrank = sion_filedesc->globalrank;
477 
478  /* free tmp field */
479  if(sion_tmpintfield) free(sion_tmpintfield);
480 
481  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
482  /* */ DPRINTFTS(rank, "after setp");
483  /* end of read */
484  } else {
485  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_multi_mpi: unknown file mode"));
486  }
487 
488  if(fileptr!=NULL) {
489  if(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI) {
490  *fileptr=sion_filedesc->fileptr->fileptr;
491  sion_filedesc->fileptr_exported=1;
492  } else {
493  *fileptr=NULL;
494  sion_filedesc->fileptr_exported=0;
495  }
496  }
497 
498  if (rank == 0) {
499  /* not needed for rest of sionlib function calls */
500  _sion_free_filedesc_arrays(sion_filedesc);
501  }
502 
503  _sion_print_filedesc(sion_filedesc, 512, "_sion_paropen_generic_one_file", 1);
504 
505  DPRINTFP((32, "_sion_paropen_generic_one_file", rank, " start position on task %02d is at end of sion_paropen_generic %10lld\n", rank,
506  _sion_file_get_position(sion_filedesc->fileptr)));
507 
508  DPRINTFP((2, "_sion_paropen_generic_one_file", rank, "leave parallel open of file %s in mode 0x%lx #tasks=%d\n", fname, (long) flags_store->mask, ntasks));
509 
510  return (sid);
511 
512 
513 }
514 
515 
516 
529  int rank,
530  int ntasks,
531  int mapping_size,
532  sion_int32 *mapping,
533  _sion_generic_gendata *sion_gendata )
534 {
535 
536  int rc = SION_SUCCESS;
537  int blknum, lrank;
538  sion_int64 helpint64;
539  sion_int64 *sion_tmpintfield = NULL;
540  _sion_filedesc *sion_filedesc;
541 
542  if ((_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
543  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parclose_generic: invalid sion_filedesc, aborting %d ...\n", sid));
544  }
545 
546  if (sion_filedesc->state != SION_FILESTATE_PAROPEN) {
547  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parclose_generic: sion file with sid=%d was not opened by a sion_paropen\n", sid));
548  }
549 
550  DPRINTFP((2, "_sion_parclose_generic", rank, "enter parallel close sid=%d\n", sid));
551 
552  /* READ MODE: close file on all tasks */
553  if (sion_filedesc->mode == SION_FILEMODE_READ) {
554  if (sion_filedesc->state != SION_FILESTATE_CLOSE) {
555 
556  _sion_print_filedesc(sion_filedesc, 512, "_sion_parclose_generic", 1);
557  DPRINTFP((32, "_sion_parclose_generic", rank, " parallel close (read mode) sid=%d, call fclose on file\n", sid));
558 
559  _sion_file_close(sion_filedesc->fileptr);
560  sion_filedesc->fileptr = NULL;
561  sion_filedesc->state = SION_FILESTATE_CLOSE;
562  }
563  }
564  else {
565  /* WRITE MODE: collect data from all tasks, write metadata, and close file on all tasks */
566 
567  /* _sion_buffer_flush(sion_filedesc); */ /* clear internal buffer */
568  _sion_flush_block(sion_filedesc);
569 
570  if (sion_filedesc->usebuffer) {
571  _sion_buffer_flush(sion_filedesc);
572  }
573 
574  _sion_print_filedesc(sion_filedesc, 512, "_sion_parclose_generic", 1);
575 
576  /* close file on all other task, except 0 */
577  if (rank != 0) {
578  if (sion_filedesc->state != SION_FILESTATE_CLOSE) {
579  DPRINTFP((32, "_sion_parclose_generic", rank, " parallel close (write mode) sid=%d, call fclose on file\n", sid));
580  _sion_file_close(sion_filedesc->fileptr);
581  sion_filedesc->fileptr = NULL;
582  sion_filedesc->state = SION_FILESTATE_CLOSE;
583  }
584  }
585 
586  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
587 
588  DPRINTFP((32, "_sion_parclose_generic", rank, " parallel close sid=%d: lastchunknr=%d globalskip=%lld\n", sid, sion_filedesc->lastchunknr,
589  sion_filedesc->globalskip));
590  for (blknum = 0; blknum <= sion_filedesc->lastchunknr; blknum++) {
591  DPRINTFP((1024, "_sion_parclose_generic", rank, " parallel close sid=%d: local block %02d -> %10lld bytes\n", sid, blknum,
592  sion_filedesc->blocksizes[blknum]));
593  }
594 
595  if (rank == 0) {
596  sion_tmpintfield = (sion_int64 *) malloc(sion_filedesc->ntasks * sizeof(sion_int64));
597  if (sion_tmpintfield == NULL) {
598  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parclose_generic: cannot allocate temporary memory of size %lu (sion_tmpintfield), aborting ...\n",
599  (unsigned long) sion_filedesc->ntasks * sizeof(sion_int64)));
600  }
601  }
602 
603  /* gather number of blocks of each tasks, and search maxusedchunks */
604  /* */ DPRINTFTS2(rank, "before gather");
605  helpint64 = sion_filedesc->lastchunknr + 1;
606  sion_gendata->apidesc->gatherr_cb(&helpint64, sion_tmpintfield, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
607 
608  if (rank == 0) {
609  sion_filedesc->maxusedchunks = -1;
610  for (blknum = 0; blknum < sion_filedesc->ntasks; blknum++)
611  if (sion_tmpintfield[blknum] > sion_filedesc->maxusedchunks)
612  sion_filedesc->maxusedchunks = (int) sion_tmpintfield[blknum];
613  }
614  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->maxusedchunks, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
615  /* */ DPRINTFTS2(rank, "after gather");
616 
617  /* calculate and set start_of_varheader */
618  sion_filedesc->start_of_varheader = sion_filedesc->start_of_data + sion_filedesc->maxusedchunks * sion_filedesc->globalskip;
619 
620  /* write rest of first meta data block on rank 0 */
621  if (rank == 0) {
622  _sion_write_header_var_info(sion_filedesc);
623 
624  _sion_write_header_var_part_blockcount_from_field(sion_filedesc,sion_filedesc->ntasks,sion_tmpintfield);
625 
626  }
627 
628  /* collect chunksizes of each block from each task and write it to file */
629  for (blknum = 0; blknum < sion_filedesc->maxusedchunks; blknum++) {
630  if (blknum <= sion_filedesc->lastchunknr) {
631  helpint64 = sion_filedesc->blocksizes[blknum];
632  }
633  else {
634  helpint64 = 0;
635  }
636 
637  /* */ DPRINTFTS2(rank, "before gather");
638  sion_gendata->apidesc->gatherr_cb(&helpint64, sion_tmpintfield, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
639  /* */ DPRINTFTS2(rank, "after gather");
640 
641  if (rank == 0) {
642  for (lrank = 0; lrank < ntasks; lrank++)
643  DPRINTFP((2048, "_sion_parclose_generic", rank, " parallel close sid=%d: write total chunksize for block %d: %2lld rank=%d\n", sid, blknum,
644  sion_tmpintfield[lrank], lrank));
645 
646  _sion_write_header_var_part_nextblocksizes_from_field(sion_filedesc,sion_filedesc->ntasks,sion_tmpintfield);
647 
648  }
649  }
650 
651  /* write mapping to file if more than one physical file is used, mapping_size is the number of global tasks */
652  if (rank == 0) {
653  _sion_write_header_var_part_mapping(sion_filedesc, mapping_size, mapping);
654  }
655 
656  /* close file on task 0 */
657  if (rank == 0) {
658  DPRINTFP((32, "_sion_parclose_generic", rank, " parallel close (write mode) sid=%d, call fclose on file\n", sid));
659  _sion_file_close(sion_filedesc->fileptr);
660  sion_filedesc->fileptr = NULL;
661  sion_filedesc->state = SION_FILESTATE_CLOSE;
662 
663  /* free tmp field */
664  if(sion_tmpintfield) free(sion_tmpintfield);
665  }
666 
667  } /* write */
668 
669  _sion_free_filedesc(sion_filedesc);
670  sion_filedesc = NULL;
671 
672 
673  DPRINTFP((2, "_sion_parclose_generic", rank, "leave parallel close sid=%d\n", sid));
674 
675  return (rc);
676 }
677 
683  int sid,
684  sion_int64 chunksize,
685  int rank,
686  int ntasks,
687  _sion_generic_gendata *sion_gendata)
688 {
689 
690  int rc = SION_SUCCESS;
691  _sion_filedesc *sion_filedesc;
692  sion_int64 lchunksize, lstartpointer, lglobalrank;
693 
694  if ((_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
695  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parreinit_generic: invalid sion_filedesc, aborting %d ...\n", sid));
696  }
697 
698  if (sion_filedesc->state != SION_FILESTATE_PAROPEN) {
699  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parreinit_generic: sion file with sid=%d was not opened by a sion_paropen\n", sid));
700  }
701 
702  DPRINTFP((2, "_sion_parreinit_generic", sion_filedesc->rank, "enter parallel reinit sid=%d\n", sid));
703 
704  if (sion_filedesc->mode == SION_FILEMODE_READ) {
705  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_parreinit_generic: sion file with sid=%d only allowed for files openend for write\n", sid));
706  }
707 
708  /* */ DPRINTFTS(sion_filedesc->rank, "before alloc");
709  if (sion_filedesc->rank == 0) {
710  /* memory allocation for internal fields */
711  _sion_alloc_filedesc_arrays(sion_filedesc);
712  }
713  /* */ DPRINTFTS(sion_filedesc->rank, "after alloc");
714 
715  /* collect new chunksize data and init startpointers on PE 0 */
716  lchunksize = (sion_int64) chunksize;
717  lglobalrank = (sion_int64) sion_filedesc->globalrank;
718 
719  /* */ DPRINTFTS2(sion_filedesc->rank, "before gather");
720  sion_gendata->apidesc->gatherr_cb(&lchunksize, sion_filedesc->all_chunksizes, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
721  sion_gendata->apidesc->gatherr_cb(&lglobalrank, sion_filedesc->all_globalranks, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
722 
723  /* */ DPRINTFTS2(sion_filedesc->rank, "after gather");
724 
725  if(sion_filedesc->usecoll) _sion_alloc_filedesc_coll_arrays(sion_filedesc);
726 
727  if (sion_filedesc->rank == 0) {
728  /* */ DPRINTFTS(sion_filedesc->rank, "before calculate");
729  if (!sion_filedesc->usecoll) _sion_calculate_startpointers(sion_filedesc);
730  else _sion_calculate_startpointers_collective(sion_filedesc);
731  /* */ DPRINTFTS(sion_filedesc->rank, "after calculate");
732  }
733 
734  /* write header again */
735  if (sion_filedesc->rank == 0) {
736 
737  /* apply hint for first meta data block */
738  _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_METADATABLOCK1);
739 
740  _sion_file_flush(sion_filedesc->fileptr);
741  lstartpointer=0;
742  _sion_file_set_position(sion_filedesc->fileptr, lstartpointer);
743 
744  /* */ DPRINTFTS(sion_filedesc->rank, "before writeh");
745  _sion_write_header(sion_filedesc);
746  /* */ DPRINTFTS(sion_filedesc->rank, "after writeh");
747 
748  /* needed for writing pointer to var part of metadata at the end of the file */
749  sion_filedesc->end_of_header = _sion_file_get_position(sion_filedesc->fileptr);
750  sion_filedesc->start_of_data = sion_filedesc->all_startpointers[0];
751 
752  /*set max. file size */
753  lstartpointer = sion_filedesc->all_startpointers[sion_filedesc->ntasks - 1]
754  + sion_filedesc->all_chunksizes[sion_filedesc->ntasks - 1];
755  /* */ DPRINTFTS(sion_filedesc->rank, "before setp(0)");
756  _sion_file_flush(sion_filedesc->fileptr);
757  _sion_file_set_position(sion_filedesc->fileptr, lstartpointer);
758  /* */ DPRINTFTS(sion_filedesc->rank, "after setp(0)");
759 
760  }
761 
762  /* distribute start_pos */
763  /* */ DPRINTFTS(sion_filedesc->rank, "before scatter");
764  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_startpointers, &sion_filedesc->startpos, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
765  /* */ DPRINTFTS(sion_filedesc->rank, "after scatter");
766 
767  /* distribute information for collective operations */
768  if(sion_filedesc->usecoll) {
769  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_coll_collsize, &sion_filedesc->collsize, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
770  sion_gendata->apidesc->scatterr_cb(sion_filedesc->all_coll_collector, &sion_filedesc->collector, sion_gendata->comm_data_local, _SION_INT32, 1, 0);
771 
772  _sion_free_filedesc_coll_arrays(sion_filedesc);
773  }
774 
775  /* distribute globalskip */
776  sion_gendata->apidesc->bcastr_cb(&sion_filedesc->globalskip, sion_gendata->comm_data_local, _SION_INT64, 1, 0);
777 
778  DPRINTFP((32, "_sion_parreinit_generic", sion_filedesc->rank, " start position is %10lld %10.4f MB\n",
779  sion_filedesc->startpos, sion_filedesc->startpos / 1024.0 / 1024.0));
780 
781  /* set filepointer on each task */
782  /* */ DPRINTFTS(sion_filedesc->rank, "before setp");
783  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
784  _sion_file_flush(sion_filedesc->fileptr);
785  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->startpos);
786  sion_filedesc->currentpos = sion_filedesc->startpos;
787  sion_filedesc->chunksize = (sion_int64) chunksize;
788  sion_gendata->apidesc->barrier_cb(sion_gendata->comm_data_local);
789 
790  /* apply hint for first chunk */
791  _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_CHUNK);
792 
793  if (sion_filedesc->rank == 0) {
794  /* not needed for rest of sionlib function calls */
795  _sion_free_filedesc_arrays(sion_filedesc);
796  }
797 
798  /* */ DPRINTFTS(sion_filedesc->rank, "after setp");
799  DPRINTFP((32, "_sion_parreinit_generic", sion_filedesc->rank, " ending open for write #tasks=%d filepos=%lld\n",
800  sion_filedesc->ntasks, _sion_file_get_position(sion_filedesc->fileptr)));
801 
802  DPRINTFP((2, "_sion_parreinit_generic", sion_filedesc->rank, "leave parallel reinit of file %s in #tasks=%d\n",
803  sion_filedesc->fname, sion_filedesc->ntasks));
804 
805  return (rc);
806 
807 
808 }
809 /* END OF _sion_parclose_generic */
long _sion_file_get_opt_blksize(_sion_fileptr *sion_fileptr)
Get optional file system block size for a file.
Definition: sion_file.c:189
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:268
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:163
int _sion_flush_block(_sion_filedesc *sion_filedesc)
Update the internal data structure.
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:238
_sion_filedesc * _sion_alloc_filedesc()
Allocates memory for internal sion structure.
int _sion_reassignvcd(int sid, void *data, int type)
Definition: sion_fd.c:61
_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:40
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
#define SION_FILE_FLAG_WRITE
Definition: sion_file.h:23
int _sion_read_header_var_part(_sion_filedesc *sion_filedesc)
Read the second part of SION Meta Block 1.
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.
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:322
Definition: sion_flags.h:30
sion_int64 * all_globalranks
int _sion_write_header(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 1.
Definition: sion_metadata.c:35
int _sion_alloc_filedesc_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion arrays.
int _sion_free_filedesc_arrays(_sion_filedesc *sion_filedesc)
free memory for the internal sion arrays
int _sion_parclose_generic(int sid, int rank, int ntasks, int mapping_size, sion_int32 *mapping, _sion_generic_gendata *sion_gendata)
Internal function to close parallel opened SION file.
#define SION_FILE_FLAG_READ
Definition: sion_file.h:24
int _sion_realloc_filedesc_blocklist(_sion_filedesc *sion_filedesc, sion_int32 maxchunks)
Increase the memory used by the internal sion structure for the blocklist.
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
sion_int32 * all_coll_collector
sion_int32 fileptr_exported
sion_int32 _sion_get_endianness_with_flags(sion_int64 flags)
Return endianness including possible choice via flags.
#define SION_FILE_FLAG_POSIX
Definition: sion_file.h:21
int _sion_parreinit_generic(int sid, sion_int64 chunksize, int rank, int ntasks, _sion_generic_gendata *sion_gendata)
change chunksize for an already opened SION file (write)
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...
#define MAXCHUNKS
Definition: sion_common.h:37
sion_int32 * all_coll_capability
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
#define SION_FILE_FLAG_ANSI
Definition: sion_file.h:19
#define SION_FILE_FLAG_CREATE
Definition: sion_file.h:22
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:33
sion_int64 * all_startpointers
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.
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.
Definition: sion_file.c:117
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
#define SION_FILESTATE_PAROPEN
Definition: sion_filedesc.h:24
int _sion_write_header_var_info(_sion_filedesc *sion_filedesc)
Write the SION Meta Block 1.
int _sion_free_filedesc_coll_arrays(_sion_filedesc *sion_filedesc)
free memory for the internal sion arrays
int _sion_read_header_fix_part(_sion_filedesc *sion_filedesc)
Read part of the SION Meta Block 1.
int _sion_buffer_check_env(_sion_filedesc *sion_filedesc)
Checks if environment variables are set to use buffer.
Definition: sion_buffer.c:56
sion_int32 coll_capability
sion_int64 * blocksizes
Definition: sion_filedesc.h:98
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.
sion_int32 currentblocknr
Definition: sion_filedesc.h:95
int _sion_cache_check_env(_sion_filedesc *sion_filedesc)
Check if environment variables are set to use cache.
Definition: sion_cache.c:59
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
sion_int64 * all_chunksizes
int _sion_print_filedesc(_sion_filedesc *sion_filedesc, int level, char *desc, int flag)
Print the initialized sion file description.
#define SION_FILESTATE_CLOSE
Definition: sion_filedesc.h:31
int _sion_alloc_filedesc_coll_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion arrays.
int _sion_init_filedesc(_sion_filedesc *sion_filedesc)
Initialize the sion file description.
Definition: sion_filedesc.c:34
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:34
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...
Sion Time Stamp Header.
sion_int32 * all_coll_collsize
sion_int64 start_of_varheader
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:298
int _sion_paropen_generic_one_file(int sid, char *fname, _sion_flags_store *flags_store, char *prefix, int *numFiles, int *filenumber, sion_int64 *chunksize, sion_int32 *fsblksize, int rank, int ntasks, int *globalrank, int flag, FILE **fileptr, _sion_generic_gendata *sion_gendata)
Generic parallel open of one direct access file.
_sion_fileptr * fileptr
Definition: sion_filedesc.h:80