diff --git a/config/ompi_setup_mpi_fortran.m4 b/config/ompi_setup_mpi_fortran.m4 index 94f26e83214..f92a5d70c93 100644 --- a/config/ompi_setup_mpi_fortran.m4 +++ b/config/ompi_setup_mpi_fortran.m4 @@ -151,14 +151,16 @@ AC_DEFUN([OMPI_SETUP_MPI_FORTRAN],[ OMPI_FORTRAN_CHECK([LOGICAL], [yes], [char, int32_t, int, int64_t, long long, long], [-1], [yes]) - OMPI_FORTRAN_CHECK([LOGICAL*1], [yes], + OMPI_FORTRAN_CHECK([LOGICAL*1], [no], [char, int8_t, short, int32_t, int, int64_t, long long, long], [1], [yes]) - OMPI_FORTRAN_CHECK([LOGICAL*2], [yes], + OMPI_FORTRAN_CHECK([LOGICAL*2], [no], [short, int16_t, int32_t, int, int64_t, long long, long], [2], [yes]) - OMPI_FORTRAN_CHECK([LOGICAL*4], [yes], + OMPI_FORTRAN_CHECK([LOGICAL*4], [no], [int32_t, int, int64_t, long long, long], [4], [yes]) - OMPI_FORTRAN_CHECK([LOGICAL*8], [yes], + OMPI_FORTRAN_CHECK([LOGICAL*8], [no], [int, int64_t, long long, long], [8], [yes]) + OMPI_FORTRAN_CHECK([LOGICAL*16], [no], + [int, int64_t, long long, long], [16], [yes]) OMPI_FORTRAN_CHECK([INTEGER], [yes], [int32_t, int, int64_t, long long, long], [-1], [yes]) diff --git a/ompi/datatype/ompi_datatype_internal.h b/ompi/datatype/ompi_datatype_internal.h index 1e4a80c76fe..28ee9acfe4f 100644 --- a/ompi/datatype/ompi_datatype_internal.h +++ b/ompi/datatype/ompi_datatype_internal.h @@ -247,6 +247,20 @@ # define OMPI_DATATYPE_MPI_LOGICAL8 OMPI_DATATYPE_MPI_UNAVAILABLE #endif +#if OMPI_SIZEOF_FORTRAN_LOGICAL16 == OMPI_SIZEOF_FORTRAN_LOGICAL +# define OMPI_DATATYPE_MPI_LOGICAL16 OMPI_DATATYPE_MPI_LOGICAL +#elif OMPI_SIZEOF_FORTRAN_LOGICAL16 == 1 +# define OMPI_DATATYPE_MPI_LOGICAL16 OMPI_DATATYPE_MPI_INT8_T +#elif OMPI_SIZEOF_FORTRAN_LOGICAL16 == 2 +# define OMPI_DATATYPE_MPI_LOGICAL16 OMPI_DATATYPE_MPI_INT16_T +#elif OMPI_SIZEOF_FORTRAN_LOGICAL16 == 4 +# define OMPI_DATATYPE_MPI_LOGICAL16 OMPI_DATATYPE_MPI_INT32_T +#elif OMPI_SIZEOF_FORTRAN_LOGICAL16 == 8 +# define OMPI_DATATYPE_MPI_LOGICAL16 OMPI_DATATYPE_MPI_INT64_T +#else +# define OMPI_DATATYPE_MPI_LOGICAL16 OMPI_DATATYPE_MPI_UNAVAILABLE +#endif + /* INTEGER */ #if OMPI_SIZEOF_FORTRAN_INTEGER1 == OMPI_SIZEOF_FORTRAN_INTEGER # define OMPI_DATATYPE_MPI_INTEGER1 OMPI_DATATYPE_MPI_INTEGER diff --git a/ompi/datatype/ompi_datatype_module.c b/ompi/datatype/ompi_datatype_module.c index f22e085aa2b..a094b6877e9 100644 --- a/ompi/datatype/ompi_datatype_module.c +++ b/ompi/datatype/ompi_datatype_module.c @@ -231,6 +231,11 @@ ompi_predefined_datatype_t ompi_mpi_logical8 = OMPI_DATATYPE_INIT_PREDEFIN #else ompi_predefined_datatype_t ompi_mpi_logical8 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL8, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); #endif +#if OMPI_HAVE_FORTRAN_LOGICAL16 +ompi_predefined_datatype_t ompi_mpi_logical16 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (INT, LOGICAL16, OMPI_SIZEOF_FORTRAN_LOGICAL16, OMPI_ALIGNMENT_FORTRAN_LOGICAL16, 0); +#else +ompi_predefined_datatype_t ompi_mpi_logical16 = OMPI_DATATYPE_INIT_UNAVAILABLE (LOGICAL16, OMPI_DATATYPE_FLAG_DATA_FORTRAN ); +#endif #if OMPI_HAVE_FORTRAN_REAL2 ompi_predefined_datatype_t ompi_mpi_real2 = OMPI_DATATYPE_INIT_PREDEFINED_BASIC_TYPE_FORTRAN (FLOAT, REAL2, OMPI_SIZEOF_FORTRAN_REAL2, OMPI_ALIGNMENT_FORTRAN_REAL2, OMPI_DATATYPE_FLAG_DATA_FLOAT); #else @@ -673,6 +678,9 @@ int32_t ompi_datatype_init( void ) MOOG(c_short_float_complex, 75); MOOG(cxx_sfltcplex, 76); + /* Datatype added in MPI 5.0 */ + MOOG(logical16, 77); + /** * Now make sure all non-contiguous types are marked as such. */ diff --git a/ompi/include/mpi.h.in b/ompi/include/mpi.h.in index 3f373c07686..b352fc2caf5 100644 --- a/ompi/include/mpi.h.in +++ b/ompi/include/mpi.h.in @@ -130,6 +130,9 @@ /* Whether we have FORTRAN LOGICAL*8 or not */ #undef OMPI_HAVE_FORTRAN_LOGICAL8 +/* Whether we have FORTRAN LOGICAL*16 or not */ +#undef OMPI_HAVE_FORTRAN_LOGICAL16 + /* Whether we have FORTRAN INTEGER*1 or not */ #undef OMPI_HAVE_FORTRAN_INTEGER1 @@ -1194,6 +1197,7 @@ OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical1; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical2; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical4; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical8; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_logical16; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer1; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer2; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_integer4; @@ -1341,6 +1345,9 @@ OMPI_DECLSPEC extern struct ompi_predefined_datatype_t ompi_mpi_ub; #if OMPI_HAVE_FORTRAN_LOGICAL8 #define MPI_LOGICAL8 OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_logical8) #endif +#if OMPI_HAVE_FORTRAN_LOGICAL16 +#define MPI_LOGICAL16 OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_logical16) +#endif #define MPI_INTEGER OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_integer) #if OMPI_HAVE_FORTRAN_INTEGER1 #define MPI_INTEGER1 OMPI_PREDEFINED_GLOBAL(MPI_Datatype, ompi_mpi_integer1) diff --git a/ompi/include/mpif-values.py b/ompi/include/mpif-values.py index 61affac1046..53159d5d8dd 100755 --- a/ompi/include/mpif-values.py +++ b/ompi/include/mpif-values.py @@ -150,6 +150,9 @@ 'MPI_C_LONG_DOUBLE_COMPLEX': 71, 'MPI_COUNT': 72, 'MPI_COMPLEX4': 73, + # Leave room for 16bit datatypes + # See https://github.com/mpi-forum/mpi-issues/issues/65 + 'MPI_LOGICAL16': 77, 'MPI_MESSAGE_NO_PROC': 1, 'MPI_INFO_ENV': 1, } diff --git a/ompi/mpi/fortran/use-mpi-f08/mod/mpi-f08-types.F90 b/ompi/mpi/fortran/use-mpi-f08/mod/mpi-f08-types.F90 index db0cb3e323c..e93a5cfa870 100644 --- a/ompi/mpi/fortran/use-mpi-f08/mod/mpi-f08-types.F90 +++ b/ompi/mpi/fortran/use-mpi-f08/mod/mpi-f08-types.F90 @@ -154,6 +154,7 @@ module mpi_f08_types type(MPI_Datatype), parameter :: MPI_LOGICAL2 = MPI_Datatype(OMPI_MPI_LOGICAL2) type(MPI_Datatype), parameter :: MPI_LOGICAL4 = MPI_Datatype(OMPI_MPI_LOGICAL4) type(MPI_Datatype), parameter :: MPI_LOGICAL8 = MPI_Datatype(OMPI_MPI_LOGICAL8) + type(MPI_Datatype), parameter :: MPI_LOGICAL16 = MPI_Datatype(OMPI_MPI_LOGICAL16) type(MPI_Datatype), parameter :: MPI_C_BOOL = MPI_Datatype(OMPI_MPI_C_BOOL) type(MPI_Datatype), parameter :: MPI_CXX_BOOL = MPI_Datatype(OMPI_MPI_CXX_BOOL) type(MPI_Datatype), parameter :: MPI_COUNT = MPI_Datatype(OMPI_MPI_COUNT) diff --git a/ompi/runtime/mpiruntime.h b/ompi/runtime/mpiruntime.h index 6fde46fb190..a8094dba213 100644 --- a/ompi/runtime/mpiruntime.h +++ b/ompi/runtime/mpiruntime.h @@ -101,6 +101,7 @@ OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_logical1_addr; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_logical2_addr; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_logical4_addr; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_logical8_addr; +OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_logical16_addr; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_integer_addr; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_integer1_addr; OMPI_DECLSPEC extern struct ompi_predefined_datatype_t *ompi_mpi_integer2_addr; diff --git a/ompi/runtime/ompi_mpi_init.c b/ompi/runtime/ompi_mpi_init.c index 787e1e10249..c7e61c5bf94 100644 --- a/ompi/runtime/ompi_mpi_init.c +++ b/ompi/runtime/ompi_mpi_init.c @@ -146,6 +146,7 @@ ompi_predefined_datatype_t *ompi_mpi_logical1_addr = &ompi_mpi_logical1; ompi_predefined_datatype_t *ompi_mpi_logical2_addr = &ompi_mpi_logical2; ompi_predefined_datatype_t *ompi_mpi_logical4_addr = &ompi_mpi_logical4; ompi_predefined_datatype_t *ompi_mpi_logical8_addr = &ompi_mpi_logical8; +ompi_predefined_datatype_t *ompi_mpi_logical16_addr = &ompi_mpi_logical16; ompi_predefined_datatype_t *ompi_mpi_integer_addr = &ompi_mpi_integer; ompi_predefined_datatype_t *ompi_mpi_integer1_addr = &ompi_mpi_integer1; ompi_predefined_datatype_t *ompi_mpi_integer2_addr = &ompi_mpi_integer2;