Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
better handling of some datatypes in fortran
authorAugustin Degomme <adegomme@users.noreply.github.com>
Mon, 22 Jul 2019 11:43:05 +0000 (13:43 +0200)
committerAugustin Degomme <adegomme@users.noreply.github.com>
Mon, 22 Jul 2019 13:44:51 +0000 (15:44 +0200)
include/smpi/mpif.h.in
include/smpi/smpi.h
src/smpi/bindings/smpi_f77.cpp
src/smpi/mpi/smpi_datatype.cpp
src/smpi/mpi/smpi_op.cpp
teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt

index d30387a..d795cca 100644 (file)
       integer MPI_DOUBLE_PRECISION, MPI_COMPLEX, MPI_DOUBLE_COMPLEX
       integer MPI_2INTEGER, MPI_LOGICAL1, MPI_LOGICAL2, MPI_LOGICAL4
       integer MPI_LOGICAL8, MPI_2REAL, MPI_2DOUBLE_PRECISION
-      integer MPI_AINT, MPI_OFFSET, MPI_COUNT
-      integer MPI_REAL16, MPI_PACKED
+      integer MPI_AINT, MPI_OFFSET, MPI_COUNT, MPI_REAL16
+      integer MPI_PACKED, MPI_COMPLEX8, MPI_COMPLEX16, MPI_COMPLEX32
 
       integer MPI_MAX, MPI_MIN, MPI_MAXLOC, MPI_MINLOC
       integer MPI_SUM, MPI_PROD, MPI_LAND, MPI_LOR, MPI_LXOR, MPI_BAND
       parameter(MPI_COUNT=24)
       parameter(MPI_REAL16=25)
       parameter(MPI_PACKED=26)
-
-      parameter(MPI_MAX=27)
-      parameter(MPI_MIN=28)
-      parameter(MPI_MAXLOC=29)
-      parameter(MPI_MINLOC=30)
-      parameter(MPI_SUM=31)
-      parameter(MPI_PROD=32)
-      parameter(MPI_LAND=33)
-      parameter(MPI_LOR=34)
-      parameter(MPI_LXOR=35)
-      parameter(MPI_BAND=36)
-      parameter(MPI_BOR=37)
-      parameter(MPI_BXOR=38)
+      parameter(MPI_COMPLEX8=27)
+      parameter(MPI_COMPLEX16=28)
+      parameter(MPI_COMPLEX32=29)
+      parameter(MPI_MAX=30)
+      parameter(MPI_MIN=31)
+      parameter(MPI_MAXLOC=32)
+      parameter(MPI_MINLOC=33)
+      parameter(MPI_SUM=34)
+      parameter(MPI_PROD=35)
+      parameter(MPI_LAND=36)
+      parameter(MPI_LOR=37)
+      parameter(MPI_LXOR=38)
+      parameter(MPI_BAND=39)
+      parameter(MPI_BOR=40)
+      parameter(MPI_BXOR=41)
 
       INTEGER MPI_ADDRESS_KIND, MPI_OFFSET_KIND
       PARAMETER (MPI_ADDRESS_KIND=@CMAKE_SIZEOF_VOID_P@)
index 8332ad9..30a9ebe 100644 (file)
@@ -234,6 +234,7 @@ typedef SMPI_Info* MPI_Info;
 
 #define MPI_STATUS_IGNORE ((MPI_Status*)NULL)
 #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;
index 7af3039..1be6ec2 100644 (file)
@@ -33,8 +33,8 @@ void smpi_init_fortran_types(){
      MPI_REAL4->add_f();//MPI_REAL4
      MPI_REAL8->add_f();//MPI_REAL8
      MPI_DOUBLE->add_f();//MPI_DOUBLE_PRECISION
-     MPI_C_FLOAT_COMPLEX->add_f();//MPI_COMPLEX
-     MPI_C_DOUBLE_COMPLEX->add_f();//MPI_DOUBLE_COMPLEX
+     MPI_COMPLEX8->add_f();//MPI_COMPLEX
+     MPI_COMPLEX16->add_f();//MPI_DOUBLE_COMPLEX
 #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
      MPI_2INT->add_f();//MPI_2INTEGER
 #else
@@ -51,6 +51,9 @@ void smpi_init_fortran_types(){
      MPI_AINT->add_f();//MPI_COUNT
      MPI_REAL16->add_f();//MPI_REAL16
      MPI_PACKED->add_f();//MPI_PACKED
+     MPI_COMPLEX8->add_f();//MPI_COMPLEX8
+     MPI_COMPLEX16->add_f();//MPI_COMPLEX16
+     MPI_COMPLEX32->add_f();//MPI_COMPLEX32
 
      MPI_MAX->add_f();
      MPI_MIN->add_f();
index 2e79a32..a4b307f 100644 (file)
@@ -79,9 +79,9 @@ 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_NULL(MPI_DATATYPE_NULL, -1);
-CREATE_MPI_DATATYPE_NULL(MPI_COMPLEX8, 42);
-CREATE_MPI_DATATYPE_NULL(MPI_COMPLEX16, 43);
-CREATE_MPI_DATATYPE_NULL(MPI_COMPLEX32, 44);
+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);
index 3e5bace..008839b 100644 (file)
@@ -13,7 +13,9 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)");
 #define MAX_OP(a, b)  (b) = (a) < (b) ? (b) : (a)
 #define MIN_OP(a, b)  (b) = (a) < (b) ? (a) : (b)
 #define SUM_OP(a, b)  (b) += (a)
+#define SUM_OP_COMPLEX(a, b) {(b.value) += (a.value);(b.index) += (a.index);}
 #define PROD_OP(a, b) (b) *= (a)
+#define PROD_OP_COMPLEX(a, b) {(b.value) *= (a.value);(b.index) *= (a.index);}
 #define LAND_OP(a, b) (b) = (a) && (b)
 #define LOR_OP(a, b)  (b) = (a) || (b)
 #define LXOR_OP(a, b) (b) = (not(a) && (b)) || ((a) && not(b))
@@ -96,7 +98,10 @@ APPLY_OP_LOOP(MPI_2INT, int_int,op)\
 APPLY_OP_LOOP(MPI_2FLOAT, float_float,op)\
 APPLY_OP_LOOP(MPI_2DOUBLE, double_double,op)\
 APPLY_OP_LOOP(MPI_LONG_DOUBLE_INT, long_double_int,op)\
-APPLY_OP_LOOP(MPI_2LONG, long_long,op)
+APPLY_OP_LOOP(MPI_2LONG, long_long,op)\
+APPLY_OP_LOOP(MPI_COMPLEX8, float_float,op)\
+APPLY_OP_LOOP(MPI_COMPLEX16, double_double,op)\
+APPLY_OP_LOOP(MPI_COMPLEX32, double_double,op)
 
 #define APPLY_END_OP_LOOP(op)                                                                                          \
   {                                                                                                                    \
@@ -122,6 +127,7 @@ static void sum_func(void *a, void *b, int *length, MPI_Datatype * datatype)
   APPLY_BASIC_OP_LOOP(SUM_OP)
   APPLY_FLOAT_OP_LOOP(SUM_OP)
   APPLY_COMPLEX_OP_LOOP(SUM_OP)
+  APPLY_PAIR_OP_LOOP(SUM_OP_COMPLEX)
   APPLY_END_OP_LOOP(SUM_OP)
 }
 
@@ -130,6 +136,7 @@ static void prod_func(void *a, void *b, int *length, MPI_Datatype * datatype)
   APPLY_BASIC_OP_LOOP(PROD_OP)
   APPLY_FLOAT_OP_LOOP(PROD_OP)
   APPLY_COMPLEX_OP_LOOP(PROD_OP)
+  APPLY_PAIR_OP_LOOP(PROD_OP_COMPLEX)
   APPLY_END_OP_LOOP(PROD_OP)
 }
 
index ea62837..5132564 100644 (file)
@@ -12,8 +12,8 @@ if(enable_smpi AND enable_smpi_MPICH3_testsuite AND SMPI_FORTRAN)
   configure_file(${CMAKE_CURRENT_SOURCE_DIR}/typeaints.h.in typeaints.h @ONLY)
 
   foreach(test gaddressf
-             allctypesf hindex1f hindexed_blockf packef typecntsf
-             typem2f typename3f typenamef typesnamef
+             allctypesf hindex1f hindexed_blockf packef typecntsf
+             typem2f typename3f typenamef typesnamef
               typesubf)
     add_executable(${test} EXCLUDE_FROM_ALL ${test}.f)
     add_dependencies(tests ${test})