Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
enforce a scatter error in some cases
[simgrid.git] / src / smpi / smpi_pmpi.c
index 4a9a8d2..d0d8b4b 100644 (file)
@@ -127,15 +127,7 @@ int PMPI_Abort(MPI_Comm comm, int errorcode)
 
 double PMPI_Wtime(void)
 {
-  double time;
-  if (smpi_process_initialized() && !smpi_process_finalized() && !smpi_process_get_sampling()) {
-    smpi_bench_end();
-    time = SIMIX_get_clock();
-    smpi_bench_begin();
-  } else {
-    time = SIMIX_get_clock();
-  }
-  return time;
+  return smpi_mpi_wtime();
 }
 
 extern double sg_maxmin_precision;
@@ -255,6 +247,18 @@ int PMPI_Type_ub(MPI_Datatype datatype, MPI_Aint * disp)
   return retval;
 }
 
+int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){
+  int retval = 0;
+
+  if (datatype == MPI_DATATYPE_NULL) {
+    retval = MPI_ERR_TYPE;
+  } else {
+    *newtype = smpi_datatype_dup(datatype);
+    retval = MPI_SUCCESS;
+  }
+  return retval;
+}
+
 int PMPI_Op_create(MPI_User_function * function, int commute, MPI_Op * op)
 {
   int retval = 0;
@@ -992,7 +996,7 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,
     *request = MPI_REQUEST_NULL;
     retval = MPI_SUCCESS;
   } else if (src!=MPI_ANY_SOURCE && (src >= smpi_group_size(smpi_comm_group(comm)) || src <0)){
-    retval = MPI_ERR_COMM;
+    retval = MPI_ERR_RANK;
   } else if (count < 0) {
     retval = MPI_ERR_COUNT;
   } else if (buf==NULL && count > 0) {
@@ -1955,7 +1959,10 @@ int PMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
   } else if (((smpi_comm_rank(comm)==root) && (sendtype == MPI_DATATYPE_NULL))
              || ((recvbuf !=MPI_IN_PLACE) && (recvtype == MPI_DATATYPE_NULL))) {
     retval = MPI_ERR_TYPE;
-  } else {
+  } else if ((sendbuf == recvbuf) ||
+      ((smpi_comm_rank(comm)==root) && sendcount>0 && (sendbuf == NULL))){
+    retval = MPI_ERR_BUFFER;
+  }else {
 
     if (recvbuf == MPI_IN_PLACE) {
         recvtype=sendtype;
@@ -2697,28 +2704,184 @@ int PMPI_Type_create_resized(MPI_Datatype oldtype,MPI_Aint lb, MPI_Aint extent,
 }
 
 
-/* The following calls are not yet implemented and will fail at runtime. */
-/* Once implemented, please move them above this notice. */
 
-#define NOT_YET_IMPLEMENTED {                                           \
-    XBT_WARN("Not yet implemented : %s. Please contact the Simgrid team if support is needed", __FUNCTION__); \
-    return MPI_SUCCESS;                                                 \
+int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win){
+  int retval = 0;
+  smpi_bench_end();
+  if (comm == MPI_COMM_NULL) {
+    retval= MPI_ERR_COMM;
+  }else if ((base == NULL && size != 0)
+            || disp_unit <= 0 || size < 0 ){
+    retval= MPI_ERR_OTHER;
+  }else{
+    *win = smpi_mpi_win_create( base, size, disp_unit, info, comm);
+    retval = MPI_SUCCESS;
   }
+  smpi_bench_begin();
+  return retval;
+}
 
-int PMPI_Type_dup(MPI_Datatype datatype, MPI_Datatype *newtype){
-  NOT_YET_IMPLEMENTED
+int PMPI_Win_free( MPI_Win* win){
+  int retval = 0;
+  smpi_bench_end();
+  if (win == NULL || *win == MPI_WIN_NULL) {
+    retval = MPI_ERR_WIN;
+  }else{
+    retval=smpi_mpi_win_free(win);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+
+int PMPI_Win_fence( int assert,  MPI_Win win){
+  int retval = 0;
+  smpi_bench_end();
+  if (win == MPI_WIN_NULL) {
+    retval = MPI_ERR_WIN;
+  } else {
+    retval = smpi_mpi_win_fence(assert, win);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+              MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){
+  int retval = 0;
+  smpi_bench_end();
+  if (win == MPI_WIN_NULL) {
+    retval = MPI_ERR_WIN;
+  } else if (target_rank == MPI_PROC_NULL) {
+    retval = MPI_SUCCESS;
+  } else if (target_rank <0){
+    retval = MPI_ERR_RANK;
+  } else if (target_disp <0){
+      retval = MPI_ERR_ARG;
+  } else if (origin_count < 0 || target_count < 0) {
+    retval = MPI_ERR_COUNT;
+  } else if (origin_addr==NULL && origin_count > 0){
+    retval = MPI_ERR_COUNT;
+  } else if ((!is_datatype_valid(origin_datatype)) ||
+            (!is_datatype_valid(target_datatype))) {
+    retval = MPI_ERR_TYPE;
+  } else {
+    retval = smpi_mpi_get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+int PMPI_Put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+              MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){
+  int retval = 0;
+  smpi_bench_end();
+  if (win == MPI_WIN_NULL) {
+    retval = MPI_ERR_WIN;
+  } else if (target_rank == MPI_PROC_NULL) {
+    retval = MPI_SUCCESS;
+  } else if (target_rank <0){
+    retval = MPI_ERR_RANK;
+  } else if (target_disp <0){
+    retval = MPI_ERR_ARG;
+  } else if (origin_count < 0 || target_count < 0) {
+    retval = MPI_ERR_COUNT;
+  } else if (origin_addr==NULL && origin_count > 0){
+    retval = MPI_ERR_COUNT;
+  } else if ((!is_datatype_valid(origin_datatype)) ||
+            (!is_datatype_valid(target_datatype))) {
+    retval = MPI_ERR_TYPE;
+  } else {
+    retval = smpi_mpi_put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+
+int PMPI_Accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+              MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){
+  int retval = 0;
+  smpi_bench_end();
+  if (win == MPI_WIN_NULL) {
+    retval = MPI_ERR_WIN;
+  } else if (target_rank == MPI_PROC_NULL) {
+    retval = MPI_SUCCESS;
+  } else if (target_rank <0){
+    retval = MPI_ERR_RANK;
+  } else if (target_disp <0){
+    retval = MPI_ERR_ARG;
+  } else if (origin_count < 0 || target_count < 0) {
+    retval = MPI_ERR_COUNT;
+  } else if (origin_addr==NULL && origin_count > 0){
+    retval = MPI_ERR_COUNT;
+  } else if ((!is_datatype_valid(origin_datatype)) ||
+            (!is_datatype_valid(target_datatype))) {
+    retval = MPI_ERR_TYPE;
+  } else if (op == MPI_OP_NULL) {
+    retval = MPI_ERR_OP;
+  } else {
+    retval = smpi_mpi_accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, op, win);
+  }
+  smpi_bench_begin();
+  return retval;
+}
+
+
+int PMPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr){
+  void *ptr = xbt_malloc(size);
+  if(!ptr)
+    return MPI_ERR_NO_MEM;
+  else {
+    *(void **)baseptr = ptr;
+    return MPI_SUCCESS;
+  }
+}
+
+int PMPI_Free_mem(void *baseptr){
+  xbt_free(baseptr);
+  return MPI_SUCCESS;
 }
 
 int PMPI_Type_set_name(MPI_Datatype  datatype, char * name)
 {
-  NOT_YET_IMPLEMENTED
+  int retval = 0;
+  if (datatype == MPI_DATATYPE_NULL)  {
+    retval = MPI_ERR_TYPE;
+  } else if (name == NULL)  {
+    retval = MPI_ERR_ARG;
+  } else {
+    smpi_datatype_set_name(datatype, name);
+    retval = MPI_SUCCESS;
+  }
+  return retval;
 }
 
 int PMPI_Type_get_name(MPI_Datatype  datatype, char * name, int* len)
 {
-  NOT_YET_IMPLEMENTED
+  int retval = 0;
+
+  if (datatype == MPI_DATATYPE_NULL)  {
+    retval = MPI_ERR_TYPE;
+  } else if (name == NULL)  {
+    retval = MPI_ERR_ARG;
+  } else {
+    smpi_datatype_get_name(datatype, name, len);
+    retval = MPI_SUCCESS;
+  }
+  return retval;
 }
 
+/* The following calls are not yet implemented and will fail at runtime. */
+/* Once implemented, please move them above this notice. */
+
+#define NOT_YET_IMPLEMENTED {                                           \
+    XBT_WARN("Not yet implemented : %s. Please contact the Simgrid team if support is needed", __FUNCTION__); \
+    return MPI_SUCCESS;                                                 \
+  }
+
+
+
 int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) {
   NOT_YET_IMPLEMENTED
 }
@@ -2781,6 +2944,10 @@ int PMPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler) {
   NOT_YET_IMPLEMENTED
 }
 
+int PMPI_Win_set_errhandler(MPI_Win win, MPI_Errhandler errhandler) {
+  NOT_YET_IMPLEMENTED
+}
+
 int PMPI_Comm_get_errhandler(MPI_Comm comm, MPI_Errhandler* errhandler) {
   NOT_YET_IMPLEMENTED
 }
@@ -2942,18 +3109,6 @@ int PMPI_Get_elements(MPI_Status* status, MPI_Datatype datatype, int* elements)
   NOT_YET_IMPLEMENTED
 }
 
-int PMPI_Win_fence( int assert,  MPI_Win win){
-  NOT_YET_IMPLEMENTED
-}
-
-int PMPI_Win_free( MPI_Win* win){
-  NOT_YET_IMPLEMENTED
-}
-
-int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, MPI_Win *win){
-  NOT_YET_IMPLEMENTED
-}
-
 int PMPI_Info_create( MPI_Info *info){
   NOT_YET_IMPLEMENTED
 }
@@ -2966,11 +3121,6 @@ int PMPI_Info_free( MPI_Info *info){
   NOT_YET_IMPLEMENTED
 }
 
-int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
-              MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Win win){
-  NOT_YET_IMPLEMENTED
-}
-
 int PMPI_Type_get_envelope( MPI_Datatype datatype, int *num_integers,
                             int *num_addresses, int *num_datatypes, int *combiner){
   NOT_YET_IMPLEMENTED