Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
change the way MPI datatypes are declared.
authorAugustin Degomme <adegomme@users.noreply.github.com>
Mon, 8 Mar 2021 00:05:00 +0000 (01:05 +0100)
committerAugustin Degomme <adegomme@users.noreply.github.com>
Mon, 8 Mar 2021 00:12:45 +0000 (01:12 +0100)
Our previous solution did not let everything seen as const, and it was preventing some codes to compile (initializer element is not constant).
This allows to compile  https://github.com/open-mpi/mpi-test-suite.git without changint the code (will be added in proxy apps) in tst_types.c
todo : other types (op and co)

include/smpi/smpi.h
src/smpi/include/smpi_datatype.hpp
src/smpi/mpi/smpi_datatype.cpp

index 557d7ee..da78005 100644 (file)
@@ -243,66 +243,131 @@ typedef SMPI_Info* MPI_Info;
 #define MPI_STATUSES_IGNORE ((MPI_Status*)NULL)
 #define MPI_STATUS_SIZE 5
 
-XBT_PUBLIC_DATA const MPI_Datatype MPI_DATATYPE_NULL;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_CHAR;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_SHORT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_LONG;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_LONG_LONG;
+#if !defined(DLL_EXPORT)
+#if defined(c_plusplus) || defined(__cplusplus)
+#define SMPI_PREDEFINED_POINTER(type, internal) (static_cast<type> (static_cast<void*> (&(internal))))
+#else
+#define SMPI_PREDEFINED_POINTER(type, internal) ((type) ((void *) &(internal)))
+#endif
+#else
+#define SMPI_PREDEFINED_POINTER(type, internal) ((type) &(internal))
+#endif
+
+extern SMPI_Datatype smpi_MPI_DATATYPE_NULL;
+extern SMPI_Datatype smpi_MPI_CHAR;
+extern SMPI_Datatype smpi_MPI_SHORT;
+extern SMPI_Datatype smpi_MPI_INT;
+extern SMPI_Datatype smpi_MPI_LONG;
+extern SMPI_Datatype smpi_MPI_LONG_LONG;
+extern SMPI_Datatype smpi_MPI_SIGNED_CHAR;
+extern SMPI_Datatype smpi_MPI_UNSIGNED_CHAR;
+extern SMPI_Datatype smpi_MPI_UNSIGNED_SHORT;
+extern SMPI_Datatype smpi_MPI_UNSIGNED;
+extern SMPI_Datatype smpi_MPI_UNSIGNED_LONG;
+extern SMPI_Datatype smpi_MPI_UNSIGNED_LONG_LONG;
+extern SMPI_Datatype smpi_MPI_FLOAT;
+extern SMPI_Datatype smpi_MPI_DOUBLE;
+extern SMPI_Datatype smpi_MPI_LONG_DOUBLE;
+extern SMPI_Datatype smpi_MPI_WCHAR;
+extern SMPI_Datatype smpi_MPI_C_BOOL;
+extern SMPI_Datatype smpi_MPI_INT8_T;
+extern SMPI_Datatype smpi_MPI_INT16_T;
+extern SMPI_Datatype smpi_MPI_INT32_T;
+extern SMPI_Datatype smpi_MPI_INT64_T;
+extern SMPI_Datatype smpi_MPI_UINT8_T;
+extern SMPI_Datatype smpi_MPI_BYTE;
+extern SMPI_Datatype smpi_MPI_UINT16_T;
+extern SMPI_Datatype smpi_MPI_UINT32_T;
+extern SMPI_Datatype smpi_MPI_UINT64_T;
+extern SMPI_Datatype smpi_MPI_C_FLOAT_COMPLEX;
+extern SMPI_Datatype smpi_MPI_C_DOUBLE_COMPLEX;
+extern SMPI_Datatype smpi_MPI_C_LONG_DOUBLE_COMPLEX;
+extern SMPI_Datatype smpi_MPI_AINT;
+extern SMPI_Datatype smpi_MPI_OFFSET;
+extern SMPI_Datatype smpi_MPI_LB;
+extern SMPI_Datatype smpi_MPI_UB;
+extern SMPI_Datatype smpi_MPI_FLOAT_INT;
+extern SMPI_Datatype smpi_MPI_LONG_INT;
+extern SMPI_Datatype smpi_MPI_DOUBLE_INT;
+extern SMPI_Datatype smpi_MPI_SHORT_INT;
+extern SMPI_Datatype smpi_MPI_2INT;
+extern SMPI_Datatype smpi_MPI_LONG_DOUBLE_INT;
+extern SMPI_Datatype smpi_MPI_2FLOAT;
+extern SMPI_Datatype smpi_MPI_2DOUBLE;
+extern SMPI_Datatype smpi_MPI_2LONG;
+extern SMPI_Datatype smpi_MPI_REAL;
+extern SMPI_Datatype smpi_MPI_REAL4;
+extern SMPI_Datatype smpi_MPI_REAL8;
+extern SMPI_Datatype smpi_MPI_REAL16;
+extern SMPI_Datatype smpi_MPI_COMPLEX8;
+extern SMPI_Datatype smpi_MPI_COMPLEX16;
+extern SMPI_Datatype smpi_MPI_COMPLEX32;
+extern SMPI_Datatype smpi_MPI_INTEGER1;
+extern SMPI_Datatype smpi_MPI_INTEGER2;
+extern SMPI_Datatype smpi_MPI_INTEGER4;
+extern SMPI_Datatype smpi_MPI_INTEGER8;
+extern SMPI_Datatype smpi_MPI_INTEGER16;
+extern SMPI_Datatype smpi_MPI_COUNT;
+
+#define MPI_DATATYPE_NULL SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_DATATYPE_NULL)
+#define MPI_CHAR SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_CHAR)
+#define MPI_SHORT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_SHORT)
+#define MPI_INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INT)
+#define MPI_LONG SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_LONG)
+#define MPI_LONG_LONG SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_LONG_LONG)
 #define MPI_LONG_LONG_INT MPI_LONG_LONG
-XBT_PUBLIC_DATA const MPI_Datatype MPI_SIGNED_CHAR;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UNSIGNED_CHAR;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UNSIGNED_SHORT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UNSIGNED;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UNSIGNED_LONG;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UNSIGNED_LONG_LONG;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_FLOAT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_DOUBLE;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_LONG_DOUBLE;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_WCHAR;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_C_BOOL;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INT8_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INT16_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INT32_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INT64_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UINT8_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_BYTE;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UINT16_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UINT32_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UINT64_T;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_C_FLOAT_COMPLEX;
+#define MPI_SIGNED_CHAR SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_SIGNED_CHAR)
+#define MPI_UNSIGNED_CHAR SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UNSIGNED_CHAR)
+#define MPI_UNSIGNED_SHORT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UNSIGNED_SHORT)
+#define MPI_UNSIGNED SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UNSIGNED)
+#define MPI_UNSIGNED_LONG SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UNSIGNED_LONG)
+#define MPI_UNSIGNED_LONG_LONG SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UNSIGNED_LONG_LONG)
+#define MPI_FLOAT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_FLOAT)
+#define MPI_DOUBLE SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_DOUBLE)
+#define MPI_LONG_DOUBLE SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_LONG_DOUBLE)
+#define MPI_WCHAR SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_WCHAR)
+#define MPI_C_BOOL SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_C_BOOL)
+#define MPI_INT8_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INT8_T)
+#define MPI_INT16_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INT16_T)
+#define MPI_INT32_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INT32_T)
+#define MPI_INT64_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INT64_T)
+#define MPI_UINT8_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UINT8_T)
+#define MPI_BYTE SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_BYTE)
+#define MPI_UINT16_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UINT16_T)
+#define MPI_UINT32_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UINT32_T)
+#define MPI_UINT64_T SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UINT64_T)
+#define MPI_C_FLOAT_COMPLEX SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_C_FLOAT_COMPLEX)
 #define MPI_C_COMPLEX MPI_C_FLOAT_COMPLEX
-XBT_PUBLIC_DATA const MPI_Datatype MPI_C_DOUBLE_COMPLEX;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_C_LONG_DOUBLE_COMPLEX;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_AINT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_OFFSET;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_LB;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_UB;
+#define MPI_C_DOUBLE_COMPLEX SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_C_DOUBLE_COMPLEX)
+#define MPI_C_LONG_DOUBLE_COMPLEX SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_C_LONG_DOUBLE_COMPLEX)
+#define MPI_AINT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_AINT)
+#define MPI_OFFSET SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_OFFSET)
+#define MPI_LB SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_LB)
+#define MPI_UB SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_UB)
 //The following are datatypes for the MPI functions MPI_MAXLOC  and MPI_MINLOC.
-XBT_PUBLIC_DATA const MPI_Datatype MPI_FLOAT_INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_LONG_INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_DOUBLE_INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_SHORT_INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_2INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_LONG_DOUBLE_INT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_2FLOAT;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_2DOUBLE;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_2LONG; // only for compatibility with Fortran
-
-XBT_PUBLIC_DATA const MPI_Datatype MPI_REAL;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_REAL4;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_REAL8;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_REAL16;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_COMPLEX8;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_COMPLEX16;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_COMPLEX32;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INTEGER1;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INTEGER2;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INTEGER4;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INTEGER8;
-XBT_PUBLIC_DATA const MPI_Datatype MPI_INTEGER16;
-
-XBT_PUBLIC_DATA const MPI_Datatype MPI_COUNT;
+#define MPI_FLOAT_INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_FLOAT_INT)
+#define MPI_LONG_INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_LONG_INT)
+#define MPI_DOUBLE_INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_DOUBLE_INT)
+#define MPI_SHORT_INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_SHORT_INT)
+#define MPI_2INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_2INT)
+#define MPI_LONG_DOUBLE_INT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_LONG_DOUBLE_INT)
+#define MPI_2FLOAT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_2FLOAT)
+#define MPI_2DOUBLE SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_2DOUBLE)
+#define MPI_2LONG SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_2LONG)
+ // only for compatibility with Fortran
+#define MPI_REAL SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_REAL)
+#define MPI_REAL4 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_REAL4)
+#define MPI_REAL8 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_REAL8)
+#define MPI_REAL16 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_REAL16)
+#define MPI_COMPLEX8 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_COMPLEX8)
+#define MPI_COMPLEX16 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_COMPLEX16)
+#define MPI_COMPLEX32 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_COMPLEX32)
+#define MPI_INTEGER1 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INTEGER1)
+#define MPI_INTEGER2 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INTEGER2)
+#define MPI_INTEGER4 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INTEGER4)
+#define MPI_INTEGER8 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INTEGER8)
+#define MPI_INTEGER16 SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_INTEGER16)
+#define MPI_COUNT SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_COUNT)
 
 //defines for fortran compatibility
 #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__) || defined(__aarch64__)
@@ -898,7 +963,9 @@ typedef void* MPI_Message;
 #define MPI_TYPE_DUP_FN ((MPI_Type_copy_attr_function*)MPI_DUP_FN)
 #define MPI_COMM_DUP_FN  ((MPI_Comm_copy_attr_function *)MPI_DUP_FN)
 #define MPI_INFO_ENV smpi_process_info_env()
-XBT_PUBLIC_DATA const MPI_Datatype MPI_PACKED;
+extern SMPI_Datatype smpi_MPI_PACKED;
+#define MPI_PACKED SMPI_PREDEFINED_POINTER(MPI_Datatype, smpi_MPI_PACKED)
+
 
 MPI_CALL(XBT_PUBLIC int, MPI_Cart_map, (MPI_Comm comm_old, int ndims, const int* dims, const int* periods, int* newrank));
 MPI_CALL(XBT_PUBLIC int, MPI_Graph_create,
index 5f7f287..67ac906 100644 (file)
@@ -30,7 +30,7 @@ constexpr unsigned DT_FLAG_DERIVED     = 0x0800; /**< is the datatype derived ?
 constexpr unsigned DT_FLAG_BASIC =
     (DT_FLAG_PREDEFINED | DT_FLAG_CONTIGUOUS | DT_FLAG_NO_GAPS | DT_FLAG_DATA | DT_FLAG_COMMITED);
 
-extern const MPI_Datatype MPI_PTR;
+extern MPI_Datatype MPI_PTR;
 
 //The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC.
 struct float_int {
index 42ee36c..d0a9b89 100644 (file)
@@ -21,84 +21,84 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (
 static std::unordered_map<std::string, simgrid::smpi::Datatype*> id2type_lookup;
 
 #define CREATE_MPI_DATATYPE(name, id, type)                                                                            \
-  static simgrid::smpi::Datatype _XBT_CONCAT(mpi_, name)((char*)_XBT_STRINGIFY(name), (id), sizeof(type), /* size */   \
+  simgrid::smpi::Datatype _XBT_CONCAT(smpi_MPI_, name)((char*)"MPI_"#name, (id), sizeof(type), /* size */   \
                                                          0,                                               /* lb */     \
                                                          sizeof(type), /* ub = lb + size */                            \
                                                          DT_FLAG_BASIC /* flags */                                     \
-                                                         );                                                            \
-  const MPI_Datatype name = &_XBT_CONCAT(mpi_, name);
+                                                         );
 
 #define CREATE_MPI_DATATYPE_NULL(name, id)                                                                             \
-  static simgrid::smpi::Datatype _XBT_CONCAT(mpi_, name)((char*)_XBT_STRINGIFY(name), (id), 0, /* size */              \
+  simgrid::smpi::Datatype _XBT_CONCAT(smpi_MPI_, name)((char*)"MPI_"#name, (id), 0, /* size */              \
                                                          0,                                    /* lb */                \
                                                          0,                                    /* ub = lb + size */    \
                                                          DT_FLAG_BASIC                         /* flags */             \
-                                                         );                                                            \
-  const MPI_Datatype name = &_XBT_CONCAT(mpi_, name);
+                                                         );
 
 // Predefined data types
-CREATE_MPI_DATATYPE_NULL(MPI_DATATYPE_NULL, -1)
-CREATE_MPI_DATATYPE(MPI_DOUBLE, 0, double)
-CREATE_MPI_DATATYPE(MPI_INT, 1, int)
-CREATE_MPI_DATATYPE(MPI_CHAR, 2, char)
-CREATE_MPI_DATATYPE(MPI_SHORT, 3, short)
-CREATE_MPI_DATATYPE(MPI_LONG, 4, long)
-CREATE_MPI_DATATYPE(MPI_FLOAT, 5, float)
-CREATE_MPI_DATATYPE(MPI_BYTE, 6, int8_t)
-CREATE_MPI_DATATYPE(MPI_LONG_LONG, 7, long long)
-CREATE_MPI_DATATYPE(MPI_SIGNED_CHAR, 8, signed char)
-CREATE_MPI_DATATYPE(MPI_UNSIGNED_CHAR, 9, unsigned char)
-CREATE_MPI_DATATYPE(MPI_UNSIGNED_SHORT, 10, unsigned short)
-CREATE_MPI_DATATYPE(MPI_UNSIGNED, 11, unsigned int)
-CREATE_MPI_DATATYPE(MPI_UNSIGNED_LONG, 12, unsigned long)
-CREATE_MPI_DATATYPE(MPI_UNSIGNED_LONG_LONG, 13, unsigned long long)
-CREATE_MPI_DATATYPE(MPI_LONG_DOUBLE, 14, long double)
-CREATE_MPI_DATATYPE(MPI_WCHAR, 15, wchar_t)
-CREATE_MPI_DATATYPE(MPI_C_BOOL, 16, bool)
-CREATE_MPI_DATATYPE(MPI_INT8_T, 17, int8_t)
-CREATE_MPI_DATATYPE(MPI_INT16_T, 18, int16_t)
-CREATE_MPI_DATATYPE(MPI_INT32_T, 19, int32_t)
-CREATE_MPI_DATATYPE(MPI_INT64_T, 20, int64_t)
-CREATE_MPI_DATATYPE(MPI_UINT8_T, 21, uint8_t)
-CREATE_MPI_DATATYPE(MPI_UINT16_T, 22, uint16_t)
-CREATE_MPI_DATATYPE(MPI_UINT32_T, 23, uint32_t)
-CREATE_MPI_DATATYPE(MPI_UINT64_T, 24, uint64_t)
-CREATE_MPI_DATATYPE(MPI_C_FLOAT_COMPLEX, 25, float _Complex)
-CREATE_MPI_DATATYPE(MPI_C_DOUBLE_COMPLEX, 26, double _Complex)
-CREATE_MPI_DATATYPE(MPI_C_LONG_DOUBLE_COMPLEX, 27, long double _Complex)
-CREATE_MPI_DATATYPE(MPI_AINT, 28, MPI_Aint)
-CREATE_MPI_DATATYPE(MPI_OFFSET, 29, MPI_Offset)
-
-CREATE_MPI_DATATYPE(MPI_FLOAT_INT, 30, float_int)
-CREATE_MPI_DATATYPE(MPI_LONG_INT, 31, long_int)
-CREATE_MPI_DATATYPE(MPI_DOUBLE_INT, 32, double_int)
-CREATE_MPI_DATATYPE(MPI_SHORT_INT, 33, short_int)
-CREATE_MPI_DATATYPE(MPI_2INT, 34, int_int)
-CREATE_MPI_DATATYPE(MPI_2FLOAT, 35, float_float)
-CREATE_MPI_DATATYPE(MPI_2DOUBLE, 36, double_double)
-CREATE_MPI_DATATYPE(MPI_2LONG, 37, long_long)
-
-CREATE_MPI_DATATYPE(MPI_REAL, 38, float)
-CREATE_MPI_DATATYPE(MPI_REAL4, 39, float)
-CREATE_MPI_DATATYPE(MPI_REAL8, 40, double)
-CREATE_MPI_DATATYPE(MPI_REAL16, 41, long double)
-CREATE_MPI_DATATYPE(MPI_COMPLEX8, 42, float_float)
-CREATE_MPI_DATATYPE(MPI_COMPLEX16, 43, double_double)
-CREATE_MPI_DATATYPE(MPI_COMPLEX32, 44, double_double)
-CREATE_MPI_DATATYPE(MPI_INTEGER1, 45, int)
-CREATE_MPI_DATATYPE(MPI_INTEGER2, 46, int16_t)
-CREATE_MPI_DATATYPE(MPI_INTEGER4, 47, int32_t)
-CREATE_MPI_DATATYPE(MPI_INTEGER8, 48, int64_t)
-CREATE_MPI_DATATYPE(MPI_INTEGER16, 49, integer128_t)
-
-CREATE_MPI_DATATYPE(MPI_LONG_DOUBLE_INT, 50, long_double_int)
-
-CREATE_MPI_DATATYPE_NULL(MPI_UB, 51)
-CREATE_MPI_DATATYPE_NULL(MPI_LB, 52)
-CREATE_MPI_DATATYPE(MPI_PACKED, 53, char)
+CREATE_MPI_DATATYPE_NULL(DATATYPE_NULL, -1)
+CREATE_MPI_DATATYPE(DOUBLE, 0, double)
+CREATE_MPI_DATATYPE(INT, 1, int)
+CREATE_MPI_DATATYPE(CHAR, 2, char)
+CREATE_MPI_DATATYPE(SHORT, 3, short)
+CREATE_MPI_DATATYPE(LONG, 4, long)
+CREATE_MPI_DATATYPE(FLOAT, 5, float)
+CREATE_MPI_DATATYPE(BYTE, 6, int8_t)
+CREATE_MPI_DATATYPE(LONG_LONG, 7, long long)
+CREATE_MPI_DATATYPE(SIGNED_CHAR, 8, signed char)
+CREATE_MPI_DATATYPE(UNSIGNED_CHAR, 9, unsigned char)
+CREATE_MPI_DATATYPE(UNSIGNED_SHORT, 10, unsigned short)
+CREATE_MPI_DATATYPE(UNSIGNED, 11, unsigned int)
+CREATE_MPI_DATATYPE(UNSIGNED_LONG, 12, unsigned long)
+CREATE_MPI_DATATYPE(UNSIGNED_LONG_LONG, 13, unsigned long long)
+CREATE_MPI_DATATYPE(LONG_DOUBLE, 14, long double)
+CREATE_MPI_DATATYPE(WCHAR, 15, wchar_t)
+CREATE_MPI_DATATYPE(C_BOOL, 16, bool)
+CREATE_MPI_DATATYPE(INT8_T, 17, int8_t)
+CREATE_MPI_DATATYPE(INT16_T, 18, int16_t)
+CREATE_MPI_DATATYPE(INT32_T, 19, int32_t)
+CREATE_MPI_DATATYPE(INT64_T, 20, int64_t)
+CREATE_MPI_DATATYPE(UINT8_T, 21, uint8_t)
+CREATE_MPI_DATATYPE(UINT16_T, 22, uint16_t)
+CREATE_MPI_DATATYPE(UINT32_T, 23, uint32_t)
+CREATE_MPI_DATATYPE(UINT64_T, 24, uint64_t)
+CREATE_MPI_DATATYPE(C_FLOAT_COMPLEX, 25, float _Complex)
+CREATE_MPI_DATATYPE(C_DOUBLE_COMPLEX, 26, double _Complex)
+CREATE_MPI_DATATYPE(C_LONG_DOUBLE_COMPLEX, 27, long double _Complex)
+CREATE_MPI_DATATYPE(AINT, 28, MPI_Aint)
+CREATE_MPI_DATATYPE(OFFSET, 29, MPI_Offset)
+
+CREATE_MPI_DATATYPE(FLOAT_INT, 30, float_int)
+CREATE_MPI_DATATYPE(LONG_INT, 31, long_int)
+CREATE_MPI_DATATYPE(DOUBLE_INT, 32, double_int)
+CREATE_MPI_DATATYPE(SHORT_INT, 33, short_int)
+CREATE_MPI_DATATYPE(2INT, 34, int_int)
+CREATE_MPI_DATATYPE(2FLOAT, 35, float_float)
+CREATE_MPI_DATATYPE(2DOUBLE, 36, double_double)
+CREATE_MPI_DATATYPE(2LONG, 37, long_long)
+
+CREATE_MPI_DATATYPE(REAL, 38, float)
+CREATE_MPI_DATATYPE(REAL4, 39, float)
+CREATE_MPI_DATATYPE(REAL8, 40, double)
+CREATE_MPI_DATATYPE(REAL16, 41, long double)
+CREATE_MPI_DATATYPE(COMPLEX8, 42, float_float)
+CREATE_MPI_DATATYPE(COMPLEX16, 43, double_double)
+CREATE_MPI_DATATYPE(COMPLEX32, 44, double_double)
+CREATE_MPI_DATATYPE(INTEGER1, 45, int)
+CREATE_MPI_DATATYPE(INTEGER2, 46, int16_t)
+CREATE_MPI_DATATYPE(INTEGER4, 47, int32_t)
+CREATE_MPI_DATATYPE(INTEGER8, 48, int64_t)
+CREATE_MPI_DATATYPE(INTEGER16, 49, integer128_t)
+
+CREATE_MPI_DATATYPE(LONG_DOUBLE_INT, 50, long_double_int)
+
+CREATE_MPI_DATATYPE_NULL(UB, 51)
+CREATE_MPI_DATATYPE_NULL(LB, 52)
+CREATE_MPI_DATATYPE(PACKED, 53, char)
 // Internal use only
-CREATE_MPI_DATATYPE(MPI_PTR, 54, void*)
-CREATE_MPI_DATATYPE(MPI_COUNT, 55, long long)
+CREATE_MPI_DATATYPE(PTR, 54, void*)
+CREATE_MPI_DATATYPE(COUNT, 55, long long)
+MPI_Datatype MPI_PTR = &smpi_MPI_PTR;
+
 
 namespace simgrid{
 namespace smpi{