23 #include <sys/types.h> 32 #include "sion_error_handler.h" 48 int _sion_mpi_api_aid = -1;
84 const char* file_mode,
87 const MPI_Comm* lComm,
88 sion_int64* chunksize,
89 sion_int32* fsblksize,
95 int rc = SION_NOT_SUCCESS, sid = SION_ID_UNDEF;
96 int filenumber, gtasks, gRank, lRank, lSize;
103 MPI_Comm_size(gComm, >asks);
104 MPI_Comm_rank(gComm, &gRank);
106 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"enter parallel open of file %s\n", fname));
110 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: No lComm variable given"));
112 if (numFiles == NULL) {
113 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: No numFiles variable given"));
118 if ( ! flags_store ) {
119 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: could not parse file mode in %s, aborting ...\n", file_mode));
123 if(_sion_mpi_api_aid<0) _sion_mpi_api_aid=_sion_register_callbacks_mpi();
126 if (flags_store->mask&_SION_FMODE_WRITE) {
129 if (*numFiles <= 0) {
132 rc = _sion_get_info_from_splitted_comm_mpi(gComm, *lComm, numFiles, &filenumber, &lRank, &lSize);
133 if(rc != SION_SUCCESS) {
134 _sion_flags_destroy_store(&flags_store);
135 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: error in _sion_get_info_from_splitted_comm_mpi"));
137 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"%d local communicators found\n", *numFiles));
143 if(rc != SION_SUCCESS) {
144 _sion_flags_destroy_store(&flags_store);
145 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: error in _sion_gen_info_from_gcomm_mpi"));
147 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"Global communicator divided in %d local communicators\n", *numFiles));
153 }
else if (flags_store->mask&_SION_FMODE_READ) {
163 if(! (flags_store->mask&_SION_FMODE_BUDDY) ) {
167 rc = _sion_get_info_from_splitted_comm_mpi(gComm, *lComm, numFiles, &filenumber, &lRank, &lSize);
168 if(rc != SION_SUCCESS)
return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: error in _sion_get_info_from_splitted_comm_mpi"));
169 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"%d local communicators found\n", *numFiles));
174 _sion_flags_destroy_store(&flags_store);
175 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: unknown file mode"));
180 if (gen_gcomm == NULL) {
181 _sion_flags_destroy_store(&flags_store);
182 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate mpi internal data structure of size %lu (_mpi_api_commdata), aborting ...\n",
185 gen_gcomm->comm=gComm;
186 gen_gcomm->commset=1;
188 gen_gcomm->rank=gRank;
189 gen_gcomm->size=gtasks;
190 gen_gcomm->lcommgroup=NULL;
192 if ((flags_store->mask&_SION_FMODE_WRITE) && (*numFiles <= 0)) {
196 if (gen_lcomm == NULL) {
197 _sion_flags_destroy_store(&flags_store);
199 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate mpi internal data structure of size %lu (_mpi_api_commdata), aborting ...\n",
202 gen_lcomm->comm=*lComm;
203 gen_lcomm->commset=1;
204 gen_lcomm->commcreated=0;
206 gen_lcomm->rank=lRank;
207 gen_lcomm->size=lSize;
209 gen_gcomm->lcommgroup=gen_lcomm;
211 _sion_flags_destroy_store(&flags_store);
213 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"enter parallel open of %d files (current name %s) in %s mode\n", *numFiles, fname, file_mode));
214 sid =
sion_generic_paropen(_sion_mpi_api_aid, fname, file_mode, chunksize, fsblksize, gen_gcomm, gRank, gtasks, &filenumber, numFiles, &lRank, &lSize,
216 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"leave parallel open of %d files in %s mode #tasks=%d sid=%d\n", *numFiles, file_mode, lSize, sid));
219 if ( sid == SION_ID_NOT_VALID ) {
220 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mpi: invalid return code from internal open %d", rc));
223 DPRINTFP((1,
"sion_paropen_mpi", gRank,
"leave parallel open of file %s sid=%d\n", fname, sid));
243 DPRINTFP((1,
"sion_parclose_mpi", _SION_DEFAULT_RANK,
"enter parallel close of sid %d\n", sid));
245 rc = sion_generic_parclose(sid);
247 DPRINTFP((1,
"sion_parclose_mpi", _SION_DEFAULT_RANK,
"leave parallel close of sid %d rc=%d\n", sid, rc));
252 int sion_parreinit_mpi(
int sid,
253 sion_int64 chunksize )
257 DPRINTFP((1,
"sion_parreinit_mpi", _SION_DEFAULT_RANK,
"enter parallel reinit of sid %d\n", sid));
259 rc = sion_generic_parreinit(sid, chunksize);
261 DPRINTFP((1,
"sion_parreinit_mpi", _SION_DEFAULT_RANK,
"leave parallel reinit of sid %d rc=%d\n", sid, rc));
266 int sion_paropen_mapped_mpi(
char *fname,
267 const char *file_mode,
272 sion_int64 **chunksizes,
273 int **mapping_filenrs,
274 int **mapping_lranks,
275 sion_int32 *fsblksize,
278 int sid=SION_ID_UNDEF;
284 MPI_Comm_size(gComm, >asks);
285 MPI_Comm_rank(gComm, &gRank);
287 DPRINTFP((1,
"sion_paropen_mapped_mpi", gRank,
"enter parallel open of file %s\n", fname));
290 if (numFiles == NULL) {
291 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mapped_mpi: No numFiles variable given"));
294 lprefix = calloc(SION_FILENAME_LENGTH,1);
295 if (lprefix == NULL) {
296 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mapped_mpi: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (
unsigned long) SION_FILENAME_LENGTH));
300 if ( ! flags_store ) {
302 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mapped_mpi: could not parse file mode in %s, aborting ...\n", file_mode));
306 if(_sion_mpi_api_aid<0) _sion_mpi_api_aid=_sion_register_callbacks_mpi();
308 if (flags_store->mask&_SION_FMODE_WRITE) {
311 if (*numFiles <= 0) {
312 _sion_flags_destroy_store(&flags_store);
314 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mapped_mpi: numFiles variable <= 0 not allowed for mapped files in write mode"));
318 strcpy(lprefix, fname);
321 else if (flags_store->mask&_SION_FMODE_READ) {
326 _sion_flags_destroy_store(&flags_store);
328 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mapped_mpi: unknown file mode"));
330 _sion_flags_destroy_store(&flags_store);
334 if (gen_gcomm == NULL) {
336 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"cannot allocate mpi internal data structure of size %lu (_mpi_api_commdata), aborting ...\n",
339 gen_gcomm->comm=gComm;
340 gen_gcomm->commset=1;
342 gen_gcomm->rank=gRank;
343 gen_gcomm->size=gtasks;
344 gen_gcomm->lcommgroup=NULL;
347 DPRINTFP((1,
"sion_paropen_mapped_mpi", gRank,
"enter parallel open of %d files (current name %s) in %s mode (sid=%d)\n", *numFiles, fname, file_mode, sid));
348 sid=sion_generic_paropen_mapped(_sion_mpi_api_aid, fname, file_mode, numFiles, gen_gcomm, gRank, gtasks, nlocaltasks, globalranks, chunksizes,
349 mapping_filenrs, mapping_lranks, fsblksize, fileptr);
350 DPRINTFP((1,
"sion_paropen_mapped_mpi", gRank,
"leave parallel open of %d files in %s mode #tasks=%d sid=%d\n", *numFiles, file_mode, *nlocaltasks, sid));
353 if ( sid == SION_ID_NOT_VALID ) {
355 return(_sion_errorprint_mpi(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_mapped_mpi: invalid return code from internal open %d", sid));
358 if(lprefix) free(lprefix);
359 DPRINTFP((1,
"sion_paropen_mapped_mpi", gRank,
"leave parallel open of file %s sid=%d\n", fname, sid));
365 int sion_parclose_mapped_mpi(
int sid ) {
368 DPRINTFP((1,
"sion_parclose_mapped_mpi", _SION_DEFAULT_RANK,
"enter parallel close of sid %d\n", sid));
370 rc = sion_generic_parclose_mapped(sid);
372 DPRINTFP((1,
"sion_parclose_mapped_mpi", _SION_DEFAULT_RANK,
"leave parallel close of sid %d rc=%d\n", sid, rc));
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.
int sion_parclose_mpi(int sid)
Close a sion file using MPI.
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.
_sion_flags_store * _sion_parse_flags(const char *flags)
Parse flags and return a flags store with key value pairs.
int _sion_gen_info_from_gcomm_mpi(int numFiles, MPI_Comm gComm, int *filenumber, int *lrank, int *lsize)
Splits a Communicator in numfiles different communicators.