SIONlib  1.7.0
Scalable I/O library for parallel access to task-local files
sion_generic.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 ****************************************************************************/
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <stdarg.h>
18 #include <string.h>
19 #include <time.h>
20 
21 #include <sys/time.h>
22 
23 #include <sys/types.h>
24 #include <fcntl.h>
25 
26 #include <unistd.h>
27 
28 #include "sion.h"
29 #include "sion_debug.h"
30 #include "sion_error_handler.h"
31 #include "sion_internal.h"
32 #include "sion_fd.h"
33 #include "sion_filedesc.h"
34 #include "sion_printts.h"
35 #include "sion_flags.h"
36 
37 #include "sion_generic_internal.h"
38 #include "sion_generic_apidesc.h"
39 #include "sion_generic_mapped.h"
40 #include "sion_generic_buddy.h"
41 #include "sion_generic.h"
42 
43 
44 int sion_generic_create_api( char *name ) {
45  int apiid = SION_ID_UNDEF;
46  _sion_generic_apidesc *sion_apidesc;
47 
48  sion_apidesc=_sion_generic_alloc_apidesc();
49  if(!sion_apidesc) {
50  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_generic_create_api: problems to alloc apidesc, aborting ...\n"));
51  }
52  _sion_generic_init_apidesc(sion_apidesc);
53 
54  if (name == NULL) {
55  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_generic_create_api: name for API not given, aborting ...\n"));
56  }
57 
58  sion_apidesc->name=strdup(name);
59 
60  apiid = _sion_newvcd(sion_apidesc,SION_APIDESCRIPTOR);
61  sion_apidesc->aid=apiid;
62  sion_apidesc->level=SION_GENERIC_API_LEVEL_NONE;
63 
64  DPRINTFP((2, "_sion_generic_create_api", _SION_DEFAULT_RANK, "API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
65 
66  return(apiid);
67 }
68 
69 int sion_generic_free_api( int aid ) {
70  _sion_generic_apidesc *sion_apidesc;
71  int rc = SION_SUCCESS;
72 
73  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
74  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_free_api: invalid sion_apidesc %d", aid));
75  }
76  _sion_freevcd(aid);
77  rc=_sion_generic_free_apidesc(sion_apidesc);
78 
79  return(rc);
80 }
81 
82 int sion_generic_register_create_local_commgroup_cb(int aid, int create_lcg_cb(void **, void *, int, int, int, int, int, int)) {
83  _sion_generic_apidesc *sion_apidesc;
84  int rc = SION_SUCCESS;
85 
86  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
87  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_create_local_commgroup_cb: invalid sion_apidesc %d", aid));
88  }
89 
90  if(sion_apidesc->create_lcg_cb!=NULL) {
91  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_create_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
92  }
93  sion_apidesc->create_lcg_cb=create_lcg_cb;
94 
95  _sion_generic_update_api_level(sion_apidesc);
96 
97  DPRINTFP((2, "sion_generic_register_create_local_commgroup_cb", _SION_DEFAULT_RANK, "create_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
98 
99  return(rc);
100 }
101 
102 int sion_generic_register_free_local_commgroup_cb(int aid, int free_lcg_cb(void *)) {
103  _sion_generic_apidesc *sion_apidesc;
104  int rc = SION_SUCCESS;
105 
106  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
107  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_free_local_commgroup_cb: invalid sion_apidesc %d", aid));
108  }
109 
110  if(sion_apidesc->free_lcg_cb!=NULL) {
111  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_free_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
112  }
113  sion_apidesc->free_lcg_cb=free_lcg_cb;
114 
115  _sion_generic_update_api_level(sion_apidesc);
116 
117  DPRINTFP((2, "sion_generic_register_free_local_commgroup_cb", _SION_DEFAULT_RANK, "free_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
118 
119  return(rc);
120 }
121 
122 
123 int sion_generic_register_barrier_cb(int aid, int barrier_cb(void *)) {
124  _sion_generic_apidesc *sion_apidesc;
125  int rc = SION_SUCCESS;
126 
127  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
128  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_barrier_cb: invalid sion_apidesc %d", aid));
129  }
130 
131  if(sion_apidesc->barrier_cb!=NULL) {
132  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_barrier_cb: barrier_cb already registered for apiid=%d", aid));
133  }
134  sion_apidesc->barrier_cb=barrier_cb;
135 
136  _sion_generic_update_api_level(sion_apidesc);
137 
138  DPRINTFP((2, "sion_generic_register_barrier_cb", _SION_DEFAULT_RANK, "barrier_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
139 
140  return(rc);
141 }
142 
143 int sion_generic_register_bcastr_cb(int aid, int bcastr_cb(void *,void *, int,int,int)) {
144  _sion_generic_apidesc *sion_apidesc;
145  int rc = SION_SUCCESS;
146 
147  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
148  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_bcastr_cb: invalid sion_apidesc %d", aid));
149  }
150 
151  if(sion_apidesc->bcastr_cb!=NULL) {
152  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_bcastr_cb: bcastr_cb already registered for apiid=%d", aid));
153  }
154  sion_apidesc->bcastr_cb=bcastr_cb;
155 
156  _sion_generic_update_api_level(sion_apidesc);
157 
158  DPRINTFP((2, "sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK, "bcastr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
159 
160  return(rc);
161 }
162 
163 int sion_generic_register_gatherr_cb(int aid, int gatherr_cb(void *,void *,void *, int,int,int)) {
164  _sion_generic_apidesc *sion_apidesc;
165  int rc = SION_SUCCESS;
166 
167  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
168  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gatherr_cb: invalid sion_apidesc %d", aid));
169  }
170 
171  if(sion_apidesc->gatherr_cb!=NULL) {
172  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gatherr_cb: gatherr_cb already registered for apiid=%d", aid));
173  }
174  sion_apidesc->gatherr_cb=gatherr_cb;
175 
176  _sion_generic_update_api_level(sion_apidesc);
177 
178  DPRINTFP((2, "sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK, "gatherr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
179 
180  return(rc);
181 }
182 
183 int sion_generic_register_gathervr_cb(int aid, int gathervr_cb(void *,void *,void *, int, int *, int, int)) {
184  _sion_generic_apidesc *sion_apidesc;
185  int rc = SION_SUCCESS;
186 
187  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
188  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gathervr_cb: invalid sion_apidesc %d", aid));
189  }
190 
191  if(sion_apidesc->gathervr_cb!=NULL) {
192  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gathervr_cb: gathervr_cb already registered for apiid=%d", aid));
193  }
194  sion_apidesc->gathervr_cb=gathervr_cb;
195 
196  _sion_generic_update_api_level(sion_apidesc);
197 
198  DPRINTFP((2, "sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK, "gathervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
199 
200  return(rc);
201 }
202 
203 int sion_generic_register_scatterr_cb(int aid, int scatterr_cb(void *,void *,void *, int,int,int)) {
204  _sion_generic_apidesc *sion_apidesc;
205  int rc = SION_SUCCESS;
206 
207  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
208  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scatterr_cb: invalid sion_apidesc %d", aid));
209  }
210 
211  if(sion_apidesc->scatterr_cb!=NULL) {
212  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scatterr_cb: scatterr_cb already registered for apiid=%d", aid));
213  }
214  sion_apidesc->scatterr_cb=scatterr_cb;
215 
216  _sion_generic_update_api_level(sion_apidesc);
217 
218  DPRINTFP((2, "sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK, "scatterr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
219 
220  return(rc);
221 }
222 
223 int sion_generic_register_scattervr_cb(int aid, int scattervr_cb(void *,void *,void *, int, int *, int, int)) {
224  _sion_generic_apidesc *sion_apidesc;
225  int rc = SION_SUCCESS;
226 
227  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
228  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
229  }
230 
231  if(sion_apidesc->scattervr_cb!=NULL) {
232  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: scattervr_cb already registered for apiid=%d", aid));
233  }
234  sion_apidesc->scattervr_cb=scattervr_cb;
235 
236  _sion_generic_update_api_level(sion_apidesc);
237 
238  DPRINTFP((2, "sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK, "scattervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
239 
240  return(rc);
241 }
242 
243 int sion_generic_register_gather_and_execute_cb(int aid, int gather_execute_cb(const void *, sion_int64*, int, sion_int64,
244  void *, int, int, int, int,
245  int process_cb(const void *,sion_int64 *, int))) {
246  _sion_generic_apidesc *sion_apidesc;
247  int rc = SION_SUCCESS;
248 
249  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
250  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gather_and_execute_cb: invalid sion_apidesc %d", aid));
251  }
252 
253  if(sion_apidesc->gather_execute_cb!=NULL) {
254  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gather_and_execute_cb: scattervr_cb already registered for apiid=%d", aid));
255  }
256  sion_apidesc->gather_execute_cb=gather_execute_cb;
257 
258  _sion_generic_update_api_level(sion_apidesc);
259 
260  DPRINTFP((2, "sion_generic_register_gather_and_execute_cb", _SION_DEFAULT_RANK, "gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
261 
262  return(rc);
263 }
264 
265 int sion_generic_register_execute_and_scatter_cb(int aid, int execute_scatter_cb(void *, sion_int64*, int, sion_int64,
266  void *, int, int, int, int,
267  int process_cb(void *,sion_int64 *, int))) {
268  _sion_generic_apidesc *sion_apidesc;
269  int rc = SION_SUCCESS;
270 
271  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
272  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_execute_and_scatter_cb: invalid sion_apidesc %d", aid));
273  }
274 
275  if(sion_apidesc->execute_scatter_cb!=NULL) {
276  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_execute_and_scatter_cb: scattervr_cb already registered for apiid=%d", aid));
277  }
278  sion_apidesc->execute_scatter_cb=execute_scatter_cb;
279 
280  DPRINTFP((2, "sion_generic_register_execute_and_scatter_cb", _SION_DEFAULT_RANK, "gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
281 
282  return(rc);
283 }
284 
285 int sion_generic_register_get_multi_filename_cb(int aid, char *get_multi_filename_cb(const char *,int)) {
286  _sion_generic_apidesc *sion_apidesc;
287  int rc=0;
288 
289  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
290  return(_sion_errorprint(-1,_SION_ERROR_RETURN,"sion_generic_register_get_multi_filename_cb: invalid sion_apidesc %d", aid));
291  }
292 
293  if(sion_apidesc->get_multi_filename_cb!=NULL) {
294  return(_sion_errorprint(-1,_SION_ERROR_RETURN,"sion_generic_register_get_multi_filename_cb: get_multi_filename_cb already registered for apiid=%d", aid));
295  }
296  sion_apidesc->get_multi_filename_cb=get_multi_filename_cb;
297 
298  _sion_generic_update_api_level(sion_apidesc);
299 
300  DPRINTFP((2, "sion_generic_register_get_multi_filename_cb", -1, "get_multi_filename_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
301 
302  return(rc);
303 }
304 
305 int sion_generic_register_get_capability_cb(int aid, int get_capability_cb(void *)) {
306  _sion_generic_apidesc *sion_apidesc;
307  int rc = SION_SUCCESS;
308 
309  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
310  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_get_capability_cb: invalid sion_apidesc %d", aid));
311  }
312 
313  if(sion_apidesc->get_capability_cb!=NULL) {
314  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_get_capability_cb: get_capability_cb already registered for apiid=%d", aid));
315  }
316  sion_apidesc->get_capability_cb=get_capability_cb;
317 
318  _sion_generic_update_api_level(sion_apidesc);
319 
320  DPRINTFP((2, "sion_generic_register_get_capability_cb", _SION_DEFAULT_RANK, "get_capability_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
321 
322  return(rc);
323 }
324 
325 
350  const char* fname,
351  const char* file_mode,
352  sion_int64* chunksize,
353  sion_int32* fsblksize,
354  void* gcommgroup,
355  int grank,
356  int gsize,
357  int* filenumber,
358  int* numfiles,
359  const int* lrank,
360  const int* lsize,
361  FILE** fileptr,
362  char** newfname
363  )
364 {
365  int rc, sid = SION_ID_UNDEF;
366  sion_int32 lfsblksize;
367  sion_int64 lchunksize;
368  int help_globalrank;
369  char *nfname=NULL,*lprefix=NULL;
370  _sion_filedesc *sion_filedesc;
371  _sion_generic_apidesc *sion_apidesc;
372  _sion_generic_gendata *sion_gendata;
373  _sion_flags_store* flags_store = NULL;
374 
375  /* */ DPRINTFTS(grank, "enter sion_generic_paropen");
376  DPRINTFP((1, "sion_generic_paropen", grank, "enter generic parallel open of FILE %s (global: %d of %d, local: %d of %d, file: %d of %d )\n",
377  fname, grank, gsize, *lrank, *lsize, *filenumber, *numfiles));
378 
379  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
380  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
381  }
382 
383  if ( (sion_apidesc->level!=SION_GENERIC_API_LEVEL_STD) &&
384  (sion_apidesc->level!=SION_GENERIC_API_LEVEL_FULL) ) {
385  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: API %s not correctly initalized, aborting",sion_apidesc->name));
386  }
387 
388  /* check parameters */
389  if ( (grank < 0 ) || (grank >= gsize) ) {
390  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: global rank %d not valid (0..%d)",grank,gsize));
391  }
392 
393 #ifdef HACK_SCALASCA
394  /* hack for scalasca */
395  if(strstr(fname,".def")!=NULL) {
396  lfsblksize=65536;
397  lchunksize=65536;
398  } else {
399 #endif
400  lfsblksize=*fsblksize;
401  lchunksize=*chunksize;
402 #ifdef HACK_SCALASCA
403  }
404 #endif
405  DPRINTFP((1, "sion_generic_paropen", grank, "setting fsblksize = %d for file %s\n", lfsblksize, fname));
406 
407  /* create data container */
408  sion_gendata=_sion_generic_alloc_gendata();
409  if(!sion_gendata) {
410  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: problems to alloc gendata, aborting ...\n"));
411  }
412  _sion_generic_init_gendata(sion_gendata);
413 
414  sion_gendata->aid=aid;
415  sion_gendata->apidesc=sion_apidesc;
416  sion_gendata->comm_data_global=gcommgroup;
417  sion_gendata->comm_data_local=NULL;
418  sion_gendata->grank=grank;
419  sion_gendata->gsize=gsize;
420 
421  flags_store = _sion_parse_flags(file_mode);
422  if ( ! flags_store ) {
423  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: could not parse file mode in %s, aborting ...\n", file_mode));
424  }
425 
426  if (flags_store->mask&_SION_FMODE_WRITE) {
427 
428 
429  if (lrank == NULL) {
430  _sion_flags_destroy_store(&flags_store);
431  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No lrank variable given"));
432  }
433  if (lsize == NULL) {
434  _sion_flags_destroy_store(&flags_store);
435  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No lsize variable given"));
436  }
437  if ( (*lrank < 0 ) || (*lrank >= *lsize) ) {
438  _sion_flags_destroy_store(&flags_store);
439  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: local rank %d not valid (0..%d)",*lrank,*lsize));
440  }
441  sion_gendata->lrank=*lrank;
442  sion_gendata->lsize=*lsize;
443 
444  if (filenumber == NULL) {
445  _sion_flags_destroy_store(&flags_store);
446  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No filenumber variable given"));
447  }
448  if (numfiles == NULL) {
449  _sion_flags_destroy_store(&flags_store);
450  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No numfiles variable given"));
451  }
452  if ( (*filenumber < 0 ) || (*filenumber >= *numfiles) ) {
453  _sion_flags_destroy_store(&flags_store);
454  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: file number %d not valid (0..%d)",*filenumber,*numfiles));
455  }
456  sion_gendata->filenumber=*filenumber;
457  sion_gendata->numfiles=*numfiles;
458 
459  lprefix = calloc(SION_FILENAME_LENGTH,1);
460  if (lprefix == NULL) {
461  _sion_flags_destroy_store(&flags_store);
462  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (unsigned long) SION_FILENAME_LENGTH));
463  }
464 
465  strcpy(lprefix, fname);
466 
467  } else if (flags_store->mask&_SION_FMODE_READ) {
468  /* file mode READ */
469 
470  DPRINTFP((1, "sion_generic_paropen", grank, "READ: buddy=%d\n", flags_store->mask&_SION_FMODE_BUDDY));
471 
472  /* get number of files and filenumber */
473  if(! (flags_store->mask&_SION_FMODE_BUDDY) ) {
474 
475  rc = _sion_generic_get_and_distribute_info_from_file(sion_gendata, fname);
476  *numfiles=sion_gendata->numfiles;
477  *filenumber=sion_gendata->filenumber;
478  if(rc != SION_SUCCESS) {
479  _sion_flags_destroy_store(&flags_store);
480  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file"));
481  }
482 
483  } else {
484  /* buddy will determine file layout later, but need local commgroup to optimize file operations */
485 
486  sion_gendata->lrank=*lrank;
487  sion_gendata->lsize=*lsize;
488 
489  if (filenumber == NULL) return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No filenumber variable given"));
490  if (numfiles == NULL) return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No numfiles variable given"));
491  if ( (*filenumber < 0 ) || (*filenumber >= *numfiles) ) {
492  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: file number %d not valid (0..%d)",*filenumber,*numfiles));
493  }
494  sion_gendata->filenumber=*filenumber;
495  sion_gendata->numfiles=*numfiles;
496 
497  }
498 
499 
500  } else {
501  _sion_flags_destroy_store(&flags_store);
502  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: unknown file mode"));
503  }
504 
505  /* generate local commgroup according to information from file (read) or parameter (write) */
506  rc=sion_apidesc->create_lcg_cb(&sion_gendata->comm_data_local,sion_gendata->comm_data_global,
507  sion_gendata->grank,sion_gendata->gsize,
508  sion_gendata->lrank,sion_gendata->lsize,
509  sion_gendata->filenumber,sion_gendata->numfiles);
510  if(rc) {
511  _sion_flags_destroy_store(&flags_store);
512  if(lprefix) free(lprefix);
513  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_generic: error in create_local_commgroup callback function"));
514  }
515 
516  /* set up parameters of call to generic open */
517  nfname=(sion_apidesc->get_multi_filename_cb?sion_apidesc->get_multi_filename_cb:_sion_get_multi_filename)(fname,sion_gendata->filenumber);
518  help_globalrank=sion_gendata->grank;
519 
520 
521  sid = _sion_newvcd(NULL,SION_FILEDESCRIPTOR);
522 
523  if(! (flags_store->mask&_SION_FMODE_BUDDY) ) {
524 
525  /* STANDARD */
526  DPRINTFP((1, "sion_generic_paropen", grank, "call parallel open of %d files (current name %s) in %s mode\n", sion_gendata->numfiles, nfname, file_mode));
527  rc=_sion_paropen_generic_one_file(sid, nfname, flags_store, lprefix, &sion_gendata->numfiles, &sion_gendata->filenumber, &lchunksize, &lfsblksize,
528  sion_gendata->lrank, sion_gendata->lsize, &help_globalrank,
529  _SION_INTERNAL_FLAG_NORMAL, fileptr, sion_gendata, NULL);
530  DPRINTFP((1, "sion_generic_paropen", sion_gendata->grank, "leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", sion_gendata->numfiles,
531  file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
532 
533  } else {
534 
535  /* branch BUDDY Checkpointing */
536  DPRINTFP((1, "sion_generic_paropen", grank, "call parallel buddy open of %d files (current name %s) in %s mode\n", sion_gendata->numfiles, nfname, file_mode));
537  rc=_sion_paropen_generic_buddy(sid, fname, flags_store, lprefix, &sion_gendata->numfiles, &sion_gendata->filenumber, &lchunksize, &lfsblksize,
538  sion_gendata->lrank, sion_gendata->lsize, &help_globalrank,
539  fileptr, sion_gendata);
540  DPRINTFP((1, "sion_generic_paropen", sion_gendata->grank, "leave parallel buddy open of %d files in %s mode #tasks=%d sid=%d globalrank=%d rc=%d\n", sion_gendata->numfiles,
541  file_mode, sion_gendata->lsize, sid, sion_gendata->grank, rc));
542 
543  }
544 
545  _sion_flags_destroy_store(&flags_store);
546 
547  /* test sid and get internal data structure */
548  if ((rc<0) || (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
549  DPRINTFP((1, "sion_generic_paropen", sion_gendata->grank, "invalid rc %d or sion_filedesc %d", rc, sid));
550  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: invalid rc %d or sion_filedesc %d", rc, sid));
551  }
552 
553  /* store additional data */
554  sion_filedesc->dataptr=sion_gendata;
555 
556  if(newfname!=NULL) {
557  *newfname=nfname;
558  } else {
559  if(nfname) free(nfname);
560  }
561 
562  /* OUTPUT parameters */
563  *fsblksize = lfsblksize;
564  *chunksize = lchunksize;
565 
566  /* Bug? */
567 
568  DPRINTFP((64, "sion_generic_paropen", grank, "lprefix=%s (%x)\n", lprefix,lprefix));
569  if(lprefix) free(lprefix);
570 
571  DPRINTFP((1, "sion_generic_paropen", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
572  /* */ DPRINTFTS(-1, "leave sion_generic_paropen");
573 
574  return (sid);
575 }
576 
577 
578 int sion_generic_parclose(int sid) {
579  ONLY_DEBUG(int grank);
580  int mapping_size=0, rc=SION_SUCCESS;
581  sion_int32 *mapping=NULL;
582  _sion_filedesc *sion_filedesc;
583  _sion_generic_gendata *sion_gendata;
584  _sion_generic_apidesc *sion_apidesc;
585 
586 
587  /* */ DPRINTFTS(-1, "enter sion_generic_parclose");
588 
589  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
590  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parclose: invalid sion_filedesc %d", sid));
591  }
592  sion_gendata=sion_filedesc->dataptr;
593  sion_apidesc=sion_gendata->apidesc;
594 
595  ONLY_DEBUG(grank=sion_gendata->grank);
596 
597  DPRINTFP((1, "sion_generic_parclose", grank, "enter parallel close of sid %d (%d file)\n", sid, sion_filedesc->nfiles));
598 
599  /* collect mapping information on rank 0 of first file, mapping=NULL for all others */
600  _sion_generic_collect_mapping(sion_filedesc,&mapping_size,&mapping);
601 
602  if(! sion_filedesc->usebuddy ) {
603  rc = _sion_parclose_generic( sid, sion_filedesc->rank, sion_filedesc->ntasks, mapping_size, mapping, _SION_INTERNAL_FLAG_NORMAL,
604  sion_gendata, NULL );
605  } else {
606  rc = _sion_parclose_generic_buddy( sid, sion_filedesc->rank, sion_filedesc->ntasks, mapping_size, mapping, sion_gendata );
607  }
608 
609 
610  if (sion_apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
611  sion_apidesc->free_lcg_cb(sion_gendata->comm_data_local);
612  }
613  _SION_SAFE_FREE(mapping, NULL);
614 
615  _sion_freevcd(sid);
616 
617  sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
618 
619  _SION_SAFE_FREE(sion_gendata, NULL);
620 
621  DPRINTFP((1, "sion_generic_parclose", grank, "leave parallel close of sid %d\n", sid));
622  /* */ DPRINTFTS(-1, "leave sion_generic_parclose");
623 
624  return (rc);
625 }
626 
627 
628 int sion_generic_paropen_mapped(int aid,
629  char *fname,
630  const char *file_mode,
631  int *numFiles,
632  void *gcommgroup,
633  int grank,
634  int gsize,
635  int *nlocaltasks,
636  int **globalranks,
637  sion_int64 **chunksizes,
638  int **mapping_filenrs,
639  int **mapping_lranks,
640  sion_int32 *fsblksize,
641  FILE **fileptr )
642 {
643  int rc, sid = SION_ID_UNDEF;
644  char *lprefix=NULL;
645  _sion_filedesc *sion_filedesc;
646  _sion_generic_apidesc *sion_apidesc;
647  _sion_generic_gendata *sion_gendata;
648  _sion_flags_store* flags_store = NULL;
649 
650  /* */ DPRINTFTS(grank, "enter sion_generic_paropen_mapped");
651  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n",
652  fname, grank, gsize, *nlocaltasks));
653 
654  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
655  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
656  }
657 
658  if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) || (!sion_apidesc->bcastr_cb) ||
659  (!sion_apidesc->gatherr_cb) || (!sion_apidesc->gathervr_cb) || (!sion_apidesc->scatterr_cb) || (!sion_apidesc->scattervr_cb) ) {
660  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: API %s not correctly initalized, aborting",sion_apidesc->name));
661  }
662 
663  /* check parameters */
664  if ( (grank < 0 ) || (grank >= gsize) ) {
665  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: global rank %d not valid (0..%d)",grank,gsize));
666  }
667 
668  /* create data container */
669  sion_gendata=_sion_generic_alloc_gendata();
670  if(!sion_gendata) {
671  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n"));
672  }
673  _sion_generic_init_gendata(sion_gendata);
674 
675  sion_gendata->aid=aid;
676  sion_gendata->apidesc=sion_apidesc;
677  sion_gendata->comm_data_global=gcommgroup;
678  sion_gendata->grank=grank;
679  sion_gendata->gsize=gsize;
680  sion_gendata->lrank=-1;
681  sion_gendata->lsize=-1;
682  sion_gendata->filenumber=-1;
683  sion_gendata->numfiles=-1;
684  sion_gendata->comm_data_local=NULL;
685 
686  flags_store = _sion_parse_flags(file_mode);
687  if ( ! flags_store ) {
688  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: could not parse file mode in %s, aborting ...\n", file_mode));
689  }
690 
691  if (flags_store->mask&_SION_FMODE_WRITE) {
692 
693 
694 
695 
696  lprefix = calloc(SION_FILENAME_LENGTH,1);
697  if (lprefix == NULL) {
698  _sion_flags_destroy_store(&flags_store);
699  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (unsigned long) SION_FILENAME_LENGTH));
700  }
701  strcpy(lprefix, fname);
702 
703  } else if (flags_store->mask&_SION_FMODE_READ) {
704  /* file mode READ */
705  /* nothing to do here so far, filenumbers and mapping will be determined by in generic routine */
706 
707  } else {
708  _sion_flags_destroy_store(&flags_store);
709  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: unknown file mode"));
710  }
711 
712  sid = _sion_newvcd(NULL,SION_FILEDESCRIPTOR);
713 
714  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter parallel mapped open in %s mode\n", file_mode));
715  rc=_sion_paropen_mapped_generic(sid, fname, flags_store->mask, lprefix,
716  numFiles, nlocaltasks, globalranks, chunksizes, mapping_filenrs, mapping_lranks,
717  fsblksize, grank, gsize, _SION_INTERNAL_FLAG_NORMAL,
718  fileptr, sion_gendata);
719  sion_gendata->numfiles=*numFiles;
720  DPRINTFP((1, "sion_generic_paropen_mapped", sion_gendata->grank, "leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", sion_gendata->numfiles,
721  file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
722 
723  _sion_flags_destroy_store(&flags_store);
724 
725  /* test sid again and get internal data structure */
726  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
727  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid));
728  }
729 
730  /* store additional data */
731  sion_filedesc->dataptr=sion_gendata;
732 
733  /* Bug? */
734 
735  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "lprefix=%s (%x)\n", lprefix,lprefix));
736  if(lprefix) free(lprefix);
737 
738  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
739  /* */ DPRINTFTS(-1, "leave sion_generic_paropen_mapped");
740 
741  return (rc);
742 }
743 
744 
745 int sion_generic_parclose_mapped(int sid)
746 {
747  int grank, gsize, rc;
748  _sion_filedesc *sion_filedesc;
749  _sion_generic_gendata *sion_gendata;
750 
751  /* */ DPRINTFTS(-1, "enter sion_generic_parclose_mapped");
752  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
753  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parclose_mapped: invalid sion_filedesc %d", sid));
754  }
755  sion_gendata=sion_filedesc->dataptr;
756 
757  grank=sion_gendata->grank;
758  gsize=sion_gendata->gsize;
759 
760  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "enter parallel close of sid %d\n", sid));
761 
762  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "closing %d file(s)\n", sion_filedesc->nfiles));
763 
764  rc = _sion_parclose_mapped_generic(sid, grank, gsize,sion_gendata);
765 
766  _sion_freevcd(sid);
767 
768  _sion_generic_free_gendata(sion_gendata);
769 
770  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "leave parallel close of sid %d\n", sid));
771  /* */ DPRINTFTS(-1, "leave sion_generic_parclose_mapped");
772 
773  return (rc);
774 }
775 
776 
777 int _sion_generic_get_and_distribute_info_from_file( _sion_generic_gendata *sion_gendata, const char *fname)
778 {
779  int sid = -1, ntasks = -1, nfiles = -1, t = 0;
780  int rc = SION_SUCCESS;
781  FILE *fileptr;
782  sion_int32 fsblksize;
783  int *tasksinfile;
784  int mapping_size = -1;
785  sion_int32 *mapping = NULL;
786  sion_int32 lpos[2];
787  _sion_generic_apidesc *sion_apidesc;
788 
789  sion_apidesc=sion_gendata->apidesc;
790 
791  if(sion_gendata->grank == 0) {
792  /* open and get mapping of sion file */
793  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "before open\n"));
794  sid=_sion_open_read(fname,_SION_FMODE_READ|_SION_FMODE_ANSI,_SION_READ_MASTER_ONLY_OF_MULTI_FILES,
795  &ntasks,&nfiles,NULL,&fsblksize,NULL,&fileptr);
796  /* sid = sion_open(fname, "br", &ntasks, &nfiles, &chunksizes, &fsblksize, &globalranks, &fileptr); */
797  if(sid>=0) {
798  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after open\n"));
799  rc=sion_get_mapping(sid,&mapping_size,&mapping,&sion_gendata->numfiles);
800  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "sion file %d files\n", sion_gendata->numfiles));
801  } else {
802  sion_gendata->numfiles=-1;
803  }
804  }
805 
806  /* each task has to know if more than file was used in sion file */
807  sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
808 
809  if((sion_gendata->grank == 0) && (sion_gendata->numfiles>1)) {
810  if(mapping_size!=sion_gendata->gsize) {
811  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_generic_get_and_distribute_info_from_file: Incorrect sum of ntasks of files %d <> %d\n", mapping_size, sion_gendata->gsize));
812  }
813  }
814 
815  if(sion_gendata->numfiles<0) {
816  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_generic_get_and_distribute_info_from_file: could not get numfiles from sion file\n"));
817  }
818 
819  if(sion_gendata->numfiles>1) {
820  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "before scatter\n"));
821  if(sion_gendata->grank==0) {
822  for(t=0;t<mapping_size;t++) {
823  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, " %d -> (%d,%d)\n",t,mapping[t*2],mapping[t*2+1]));
824  }
825  }
826 
827  sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
828  sion_gendata->filenumber=lpos[0];
829  sion_gendata->lrank =lpos[1];
830  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after scatter filenum+lrank (%d,%d)\n",sion_gendata->filenumber,sion_gendata->lrank));
831 
832  if(sion_gendata->grank==0) {
833  tasksinfile = (int *) malloc(sion_gendata->numfiles * sizeof(int));
834  if (tasksinfile == NULL) {
835  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_generic_get_and_distribute_info_from_file: Cannot allocate memory for tasksinfile counter vector"));
836  }
837  for(t=0;t<sion_gendata->numfiles;t++) tasksinfile[t]=0; /* init counter */
838  for(t=0;t<mapping_size;t++) tasksinfile[ mapping[t*2] ]++; /* count tasks in file */
839  for(t=0;t<mapping_size;t++) mapping[t*2+1]=tasksinfile[ mapping[t*2] ]; /* set 2nd value of mapping to lsize */
840  }
841  sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
842  sion_gendata->lsize =lpos[1];
843  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after scatter lsize (%d, %d of %d)\n",sion_gendata->filenumber, sion_gendata->lrank, sion_gendata->lsize));
844 
845  if(sion_gendata->grank==0) {
846  if(tasksinfile) free(tasksinfile);
847  }
848  /* WARNING: mapping file of sion file is now destroyed and should not be used until close */
849 
850  } else {
851  sion_gendata->filenumber=0;
852  sion_gendata->lrank = sion_gendata->grank;
853  sion_gendata->lsize = sion_gendata->gsize;
854  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "only one file -> filenumber=%d lRank=%d\n",sion_gendata->filenumber,sion_gendata->lrank));
855  }
856 
857  if(sion_gendata->grank == 0) {
858  /* frees also mapping vector */
859  if (sid>=0) _sion_close_sid(sid);
860  }
861 
862  return(rc);
863 }
864 
865 int sion_generic_parreinit(int sid, sion_int64 chunksize ) {
866  int grank, gsize, rc;
867  _sion_filedesc *sion_filedesc;
868  _sion_generic_gendata *sion_gendata;
869 
870  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
871  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parreinit: invalid sion_filedesc %d", sid));
872  }
873  sion_gendata=sion_filedesc->dataptr;
874 
875  grank=sion_gendata->grank;
876  gsize=sion_gendata->gsize;
877 
878  DPRINTFP((1, "sion_generic_parreinit", grank, "enter parallel reinit of sid %d\n", sid));
879 
880  rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
881 
882  DPRINTFP((1, "sion_generic_parreinit", grank, "leave parallel reinit of sid %d\n", sid));
883 
884  return(rc);
885 }
_sion_generic_gendata * _sion_generic_alloc_gendata()
Allocates memory for internal sion api data structure needed for each SION file.
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
int _sion_generic_free_apidesc(_sion_generic_apidesc *sion_apidesc)
free apidesc structure
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, _sion_generic_buddy *buddy_data)
Generic parallel open of one direct access file.
int _sion_parclose_generic(int sid, int rank, int ntasks, int mapping_size, sion_int32 *mapping, int flag, _sion_generic_gendata *sion_gendata, _sion_generic_buddy *buddy_data)
Internal function to close parallel opened SION file.
_sion_generic_apidesc * _sion_generic_alloc_apidesc()
Allocates memory for internal sion api desc structure.
int sion_generic_paropen(int aid, const char *fname, const char *file_mode, sion_int64 *chunksize, sion_int32 *fsblksize, void *gcommgroup, int grank, int gsize, int *filenumber, int *numfiles, const int *lrank, const int *lsize, FILE **fileptr, char **newfname)
Open a sion file a generic interface.
Definition: sion_generic.c:349
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.
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
_sion_flags_store * _sion_parse_flags(const char *flags)
Parse flags and return a flags store with key value pairs.
Definition: sion_flags.c:288
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_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
Definition: sion_common.c:221
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
int _sion_newvcd(void *data, int type)
Definition: sion_fd.c:41
char * _sion_get_multi_filename(const char *fname, int filenumber)
generates the multi filename
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
int _sion_freevcd(int sid)
Definition: sion_fd.c:46
int _sion_generic_update_api_level(_sion_generic_apidesc *sion_apidesc)
Update API level.
Sion Time Stamp Header.
int _sion_generic_init_apidesc(_sion_generic_apidesc *sion_apidesc)
Initialize the sion api description.
int _sion_generic_free_gendata(_sion_generic_gendata *sion_gendata)
Free sion gendata description.
int _sion_generic_init_gendata(_sion_generic_gendata *sion_gendata)
Initialize the sion file description.
#define SION_APIDESCRIPTOR
Definition: sion_fd.h:18
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