SIONlib  1.7.1
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_error_handler.h"
32 #include "sion_internal.h"
33 #include "sion_fd.h"
34 #include "sion_filedesc.h"
35 #include "sion_printts.h"
36 
37 #ifdef SION_MPI
38 
39 #include "sion_generic.h"
40 #include "sion_generic_internal.h"
41 
42 #include "sion_mpi.h"
43 #include "sion_mpi_internal_gen.h"
44 
45 #include "sion_mpi_cb_gen.h"
46 
47 
48 /* wrapper for old SIONlib MPI function */
49 size_t sion_coll_fwrite_mpi(const void *data, size_t size, size_t nitems, int sid) {
50  return(sion_coll_fwrite(data,size,nitems,sid));
51 }
52 
53 
54 /* wrapper for old SIONlib MPI function */
55 size_t sion_coll_fread_mpi(void *data, size_t size, size_t nitems, int sid) {
56  return(sion_coll_fread(data,size,nitems,sid));
57 }
58 
59 
60 /* wrapper for old SIONlib MPI function */
61 int sion_paropen_comms_mpi(char *fname,
62  const char *file_mode,
63  int *numFiles,
64  MPI_Comm gComm,
65  MPI_Comm lComm, sion_int64 *chunksize, sion_int32 *fsblksize, int *globalrank, FILE **fileptr, char *newfname)
66 {
67  *numFiles=0;
68  return(sion_paropen_mpi(fname,file_mode,numFiles,gComm,&lComm,chunksize,fsblksize,globalrank,fileptr,&newfname));
69 }
70 
71 int sion_paropen_multi_mpi(char *fname,
72  const char *file_mode,
73  int *numFiles,
74  MPI_Comm gComm,
75  MPI_Comm *lComm, sion_int64 *chunksize, sion_int32 *fsblksize, int *globalrank, FILE **fileptr, char *newfname)
76 {
77  return(sion_paropen_mpi(fname,file_mode,numFiles,gComm,lComm,chunksize,fsblksize,globalrank,fileptr,&newfname));
78 }
79 
80 
81 /* obsolate functions for transaction, not in public interface */
82 int sion_startof_transaction_mpi( int sid ) {
83  int rc = SION_SUCCESS;
84  int grank, lrank, lsize, blocksize, step=0;
85  MPI_Comm gComm, lComm;
86  MPI_Status status;
87  _sion_filedesc *sion_filedesc;
88  const char *t;
89  _sion_generic_gendata *sion_gendata;
90  _mpi_api_commdata *gcommgroup,*lcommgroup;
91 
92  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
93  return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_parclose_mpi: invalid sion_filedesc %d", sid));
94  }
95  sion_gendata = (_sion_generic_gendata *)sion_filedesc->dataptr;
96  gcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_global;
97  lcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_local;
98  gComm=gcommgroup->comm;
99  lComm=lcommgroup->comm;
100  MPI_Comm_rank(gComm, &grank);
101  MPI_Comm_rank(lComm, &lrank);
102  MPI_Comm_size(lComm, &lsize);
103 
104  t = _sion_getenv("SION_SERBLOCKSIZE");
105  if (t) blocksize= atoi(t);
106  else if(lsize>128) blocksize= 32;
107  else if(lsize>64) blocksize= 16;
108  else if(lsize>16) blocksize= 8;
109  else blocksize=lsize;
110  lcommgroup->blocksize=blocksize;
111 
112  /* */ DPRINTFTS(grank, "enter start of transaction of sid");
113  DPRINTFP((1, "sion_startof_transaction_mpi", grank, "enter start of transaction of sid %d blocksize=%d lrank=%d\n", sid,blocksize,lrank));
114 
115  lcommgroup->ts=_sion_get_time();
116 
117  if(lrank>blocksize) {
118  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,
119  grank,lrank,lrank-blocksize);
120  MPI_Recv(&step, 1, MPI_INT, lrank-blocksize, 1430, lComm, &status);
121  }
122 
123  lcommgroup->step=step;
124  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,
125  grank,lrank,blocksize,step);
126  DPRINTFP((1, "sion_startof_transaction_mpi", grank, "leave start of transaction of sid %d\n", sid));
127  /* */ DPRINTFTS(grank, "leave start of transaction of sid");
128  return(rc);
129 }
130 
131 int sion_endof_transaction_mpi ( int sid ) {
132  int rc = SION_SUCCESS;
133  int grank, lrank, lsize, blocksize, step=1;
134  MPI_Comm gComm, lComm;
135  _sion_filedesc *sion_filedesc;
136  _sion_generic_gendata *sion_gendata;
137  _mpi_api_commdata *gcommgroup,*lcommgroup;
138 
139  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
140  return(_sion_errorprint_mpi(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_parclose_mpi: invalid sion_filedesc %d", sid));
141  }
142  sion_gendata = (_sion_generic_gendata *)sion_filedesc->dataptr;
143  gcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_global;
144  lcommgroup = (_mpi_api_commdata *) sion_gendata->comm_data_local;
145  gComm=gcommgroup->comm;
146  lComm=lcommgroup->comm;
147  MPI_Comm_rank(gComm, &grank);
148  MPI_Comm_rank(lComm, &lrank);
149  MPI_Comm_size(lComm, &lsize);
150 
151  blocksize=lcommgroup->blocksize;
152  step= lcommgroup->step+1;
153 
154  /* */ DPRINTFTS(grank, "enter end of transaction of sid");
155  DPRINTFP((1, "sion_endof_transaction_mpi", grank, "enter end of transaction of sid %d blocksize=%d lrank=%d\n", sid,blocksize,lrank));
156 
157 
158  if(lrank+blocksize<lsize) {
159  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,
160  grank,lrank,step,lrank+blocksize);
161  MPI_Send(&step, 1, MPI_INT, lrank+blocksize, 1430, lComm);
162  }
163 
164  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,
165  grank,lrank,step);
166 
167  DPRINTFP((1, "sion_endof_transaction_mpi", grank, "leave end of transaction of sid %d\n", sid));
168  /* */ DPRINTFTS(grank, "leave end of transaction of sid");
169  return(rc);
170 }
171 
172 
173 /* end of ifdef MPI */
174 #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:83
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
Sion Time Stamp Header.