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.