SIONlib  1.6.2
Scalable I/O library for parallel access to task-local files
sion_mpi_deprecated.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 
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <stdarg.h>
17 #include <string.h>
18 #include <time.h>
19 
20 #include <sys/time.h>
21 
22 #include <sys/types.h>
23 #include <fcntl.h>
24 
25 #include <unistd.h>
26 
27 #include "mpi.h"
28 
29 #include "sion.h"
30 #include "sion_debug.h"
31 #include "sion_internal.h"
32 #include "sion_fd.h"
33 #include "sion_filedesc.h"
34 #include "sion_printts.h"
35 
36 #ifdef SION_MPI
37 
38 #include "sion_generic.h"
39 #include "sion_generic_internal.h"
40 
41 #include "sion_mpi.h"
42 #include "sion_mpi_internal_gen.h"
43 
44 #include "sion_mpi_cb_gen.h"
45 
46 
47 /* wrapper for old SIONlib MPI function */
48 size_t sion_coll_fwrite_mpi(const void *data, size_t size, size_t nitems, int sid) {
49  return(sion_coll_fwrite(data,size,nitems,sid));
50 }
51 
52 
53 /* wrapper for old SIONlib MPI function */
54 size_t sion_coll_fread_mpi(void *data, size_t size, size_t nitems, int sid) {
55  return(sion_coll_fread(data,size,nitems,sid));
56 }
57 
58 
59 /* wrapper for old SIONlib MPI function */
60 int sion_paropen_comms_mpi(char *fname,
61  const char *file_mode,
62  int *numFiles,
63  MPI_Comm gComm,
64  MPI_Comm lComm, sion_int64 *chunksize, sion_int32 *fsblksize, int *globalrank, FILE **fileptr, char *newfname)
65 {
66  *numFiles=0;
67  return(sion_paropen_mpi(fname,file_mode,numFiles,gComm,&lComm,chunksize,fsblksize,globalrank,fileptr,&newfname));
68 }
69 
70 int sion_paropen_multi_mpi(char *fname,
71  const char *file_mode,
72  int *numFiles,
73  MPI_Comm gComm,
74  MPI_Comm *lComm, sion_int64 *chunksize, sion_int32 *fsblksize, int *globalrank, FILE **fileptr, char *newfname)
75 {
76  return(sion_paropen_mpi(fname,file_mode,numFiles,gComm,lComm,chunksize,fsblksize,globalrank,fileptr,&newfname));
77 }
78 
79 
80 /* obsolate functions for transaction, not in public interface */
81 int sion_startof_transaction_mpi( int sid ) {
82  int rc = SION_SUCCESS;
83  int grank, lrank, lsize, blocksize, step=0;
84  MPI_Comm gComm, lComm;
85  MPI_Status status;
86  _sion_filedesc *sion_filedesc;
87  const char *t;
88  _sion_generic_gendata *sion_gendata;
89  _mpi_api_commdata *gcommgroup,*lcommgroup;
90 
91  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
92  return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_parclose_mpi: invalid sion_filedesc %d", sid));
93  }
94  sion_gendata = (_sion_generic_gendata *)sion_filedesc->dataptr;
95  gcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_global;
96  lcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_local;
97  gComm=gcommgroup->comm;
98  lComm=lcommgroup->comm;
99  MPI_Comm_rank(gComm, &grank);
100  MPI_Comm_rank(lComm, &lrank);
101  MPI_Comm_size(lComm, &lsize);
102 
103  t = _sion_getenv("SION_SERBLOCKSIZE");
104  if (t) blocksize= atoi(t);
105  else if(lsize>128) blocksize= 32;
106  else if(lsize>64) blocksize= 16;
107  else if(lsize>16) blocksize= 8;
108  else blocksize=lsize;
109  lcommgroup->blocksize=blocksize;
110 
111  /* */ DPRINTFTS(grank, "enter start of transaction of sid");
112  DPRINTFP((1, "sion_startof_transaction_mpi", grank, "enter start of transaction of sid %d blocksize=%d lrank=%d\n", sid,blocksize,lrank));
113 
114  lcommgroup->ts=_sion_get_time();
115 
116  if(lrank>blocksize) {
117  if(sion_filedesc->filenumber==0) fprintf(stderr,"sion_startof_transaction_mpi ts=%8.4fs on grank=%5d lrank=%3d waiting for message from %5d\n",_sion_get_time()-lcommgroup->ts,
118  grank,lrank,lrank-blocksize);
119  MPI_Recv(&step, 1, MPI_INT, lrank-blocksize, 1430, lComm, &status);
120  }
121 
122  lcommgroup->step=step;
123  if(sion_filedesc->filenumber==0) fprintf(stderr,"sion_startof_transaction_mpi ts=%8.4fs on grank=%5d lrank=%3d starting transaction (blocksize=%d, step=%d)\n",_sion_get_time()-lcommgroup->ts,
124  grank,lrank,blocksize,step);
125  DPRINTFP((1, "sion_startof_transaction_mpi", grank, "leave start of transaction of sid %d\n", sid));
126  /* */ DPRINTFTS(grank, "leave start of transaction of sid");
127  return(rc);
128 }
129 
130 int sion_endof_transaction_mpi ( int sid ) {
131  int rc = SION_SUCCESS;
132  int grank, lrank, lsize, blocksize, step=1;
133  MPI_Comm gComm, lComm;
134  _sion_filedesc *sion_filedesc;
135  _sion_generic_gendata *sion_gendata;
136  _mpi_api_commdata *gcommgroup,*lcommgroup;
137 
138  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
139  return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_parclose_mpi: invalid sion_filedesc %d", sid));
140  }
141  sion_gendata = (_sion_generic_gendata *)sion_filedesc->dataptr;
142  gcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_global;
143  lcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_local;
144  gComm=gcommgroup->comm;
145  lComm=lcommgroup->comm;
146  MPI_Comm_rank(gComm, &grank);
147  MPI_Comm_rank(lComm, &lrank);
148  MPI_Comm_size(lComm, &lsize);
149 
150  blocksize=lcommgroup->blocksize;
151  step= lcommgroup->step+1;
152 
153  /* */ DPRINTFTS(grank, "enter end of transaction of sid");
154  DPRINTFP((1, "sion_endof_transaction_mpi", grank, "enter end of transaction of sid %d blocksize=%d lrank=%d\n", sid,blocksize,lrank));
155 
156 
157  if(lrank+blocksize<lsize) {
158  if(sion_filedesc->filenumber==0) fprintf(stderr,"sion_endof_transaction_mpi ts=%8.4fs on grank=%5d lrank=%3d sending step %2d to %5d\n",_sion_get_time()-lcommgroup->ts,
159  grank,lrank,step,lrank+blocksize);
160  MPI_Send(&step, 1, MPI_INT, lrank+blocksize, 1430, lComm);
161  }
162 
163  if(sion_filedesc->filenumber==0) fprintf(stderr,"sion_endof_transaction_mpi ts=%8.4fs on grank=%5d lrank=%3d end of transaction step=%2d\n",_sion_get_time()-lcommgroup->ts,
164  grank,lrank,step);
165 
166  DPRINTFP((1, "sion_endof_transaction_mpi", grank, "leave end of transaction of sid %d\n", sid));
167  /* */ DPRINTFTS(grank, "leave end of transaction of sid");
168  return(rc);
169 }
170 
171 
172 /* end of ifdef MPI */
173 #endif
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
double _sion_get_time()
Returns the current time as a double.
Definition: sion_printts.c:77
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
char * _sion_getenv(const char *name)
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
int sion_paropen_mpi(const char *fname, const char *file_mode, int *numFiles, MPI_Comm gComm, const MPI_Comm *lComm, sion_int64 *chunksize, sion_int32 *fsblksize, int *globalrank, FILE **fileptr, char **newfname)
Open a sion file using MPI.
Definition: sion_mpi_gen.c:82
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
Sion Time Stamp Header.