X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/77b1286ea2fbc5c4dd502da81961599504f01000..4e5dc38df651b06e3ab5449db94c544281097f57:/src/smpi/smpi_pmpi.cpp diff --git a/src/smpi/smpi_pmpi.cpp b/src/smpi/smpi_pmpi.cpp index 5b41eb6c8d..c9d73c1f16 100644 --- a/src/smpi/smpi_pmpi.cpp +++ b/src/smpi/smpi_pmpi.cpp @@ -270,6 +270,17 @@ int PMPI_Op_free(MPI_Op * op) } } +int PMPI_Op_commutative(MPI_Op op, int* commute){ + if (op == MPI_OP_NULL) { + return MPI_ERR_OP; + } else if (commute==nullptr){ + return MPI_ERR_ARG; + } else { + *commute = op->is_commutative(); + return MPI_SUCCESS; + } +} + int PMPI_Group_free(MPI_Group * group) { if (group == nullptr) { @@ -2451,6 +2462,67 @@ int PMPI_Win_create( void *base, MPI_Aint size, int disp_unit, MPI_Info info, MP return retval; } +int PMPI_Win_allocate( MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, void *base, MPI_Win *win){ + int retval = 0; + smpi_bench_end(); + if (comm == MPI_COMM_NULL) { + retval= MPI_ERR_COMM; + }else if (disp_unit <= 0 || size < 0 ){ + retval= MPI_ERR_OTHER; + }else{ + void* ptr = xbt_malloc(size); + if(ptr==nullptr) + return MPI_ERR_NO_MEM; + *static_cast(base) = ptr; + *win = new simgrid::smpi::Win( ptr, size, disp_unit, info, comm,1); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_create_dynamic( 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{ + *win = new simgrid::smpi::Win(info, comm); + retval = MPI_SUCCESS; + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_attach(MPI_Win win, void *base, MPI_Aint size){ + int retval = 0; + smpi_bench_end(); + if(win == MPI_WIN_NULL){ + retval = MPI_ERR_WIN; + } else if ((base == nullptr && size != 0) || size < 0 ){ + retval= MPI_ERR_OTHER; + }else{ + retval = win->attach(base, size); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_detach(MPI_Win win, void *base){ + int retval = 0; + smpi_bench_end(); + if(win == MPI_WIN_NULL){ + retval = MPI_ERR_WIN; + } else if (base == nullptr){ + retval= MPI_ERR_OTHER; + }else{ + retval = win->detach(base); + } + smpi_bench_begin(); + return retval; +} + + int PMPI_Win_free( MPI_Win* win){ int retval = 0; smpi_bench_end(); @@ -2488,6 +2560,26 @@ int PMPI_Win_get_name(MPI_Win win, char * name, int* len) } } +int PMPI_Win_get_info(MPI_Win win, MPI_Info* info) +{ + if (win == MPI_WIN_NULL) { + return MPI_ERR_WIN; + } else { + *info = win->info(); + return MPI_SUCCESS; + } +} + +int PMPI_Win_set_info(MPI_Win win, MPI_Info info) +{ + if (win == MPI_WIN_NULL) { + return MPI_ERR_TYPE; + } else { + win->set_info(info); + return MPI_SUCCESS; + } +} + int PMPI_Win_get_group(MPI_Win win, MPI_Group * group){ if (win == MPI_WIN_NULL) { return MPI_ERR_WIN; @@ -2523,7 +2615,8 @@ int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, retval = MPI_SUCCESS; } else if (target_rank <0){ retval = MPI_ERR_RANK; - } else if (target_disp <0){ + } else if (win->dynamic()==0 && target_disp <0){ + //in case of dynamic window, target_disp can be mistakenly seen as negative, as it is an address retval = MPI_ERR_ARG; } else if ((origin_count < 0 || target_count < 0) || (origin_addr==nullptr && origin_count > 0)){ @@ -2556,7 +2649,8 @@ int PMPI_Put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, retval = MPI_SUCCESS; } else if (target_rank <0){ retval = MPI_ERR_RANK; - } else if (target_disp <0){ + } else if (win->dynamic()==0 && target_disp <0){ + //in case of dynamic window, target_disp can be mistakenly seen as negative, as it is an address retval = MPI_ERR_ARG; } else if ((origin_count < 0 || target_count < 0) || (origin_addr==nullptr && origin_count > 0)){ @@ -2590,7 +2684,8 @@ int PMPI_Accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_da retval = MPI_SUCCESS; } else if (target_rank <0){ retval = MPI_ERR_RANK; - } else if (target_disp <0){ + } else if (win->dynamic()==0 && target_disp <0){ + //in case of dynamic window, target_disp can be mistakenly seen as negative, as it is an address retval = MPI_ERR_ARG; } else if ((origin_count < 0 || target_count < 0) || (origin_addr==nullptr && origin_count > 0)){ @@ -2627,7 +2722,8 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){ retval = MPI_SUCCESS; } else if (target_rank <0){ retval = MPI_ERR_RANK; - } else if (target_disp <0){ + } else if (win->dynamic()==0 && target_disp <0){ + //in case of dynamic window, target_disp can be mistakenly seen as negative, as it is an address retval = MPI_ERR_ARG; } else if ((origin_count < 0 || target_count < 0 || result_count <0) || (origin_addr==nullptr && origin_count > 0) ||