X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/77b1286ea2fbc5c4dd502da81961599504f01000..6e25b005a8667e37e9010b4462dd3480ee4e577c:/src/smpi/smpi_pmpi.cpp diff --git a/src/smpi/smpi_pmpi.cpp b/src/smpi/smpi_pmpi.cpp index 5b41eb6c8d..85fd0e5dfe 100644 --- a/src/smpi/smpi_pmpi.cpp +++ b/src/smpi/smpi_pmpi.cpp @@ -57,7 +57,6 @@ int PMPI_Finalize() TRACE_smpi_collective_out(rank, -1, __FUNCTION__); TRACE_smpi_finalize(smpi_process()->index()); - smpi_process()->destroy(); return MPI_SUCCESS; } @@ -113,7 +112,6 @@ int PMPI_Is_thread_main(int *flag) int PMPI_Abort(MPI_Comm comm, int errorcode) { smpi_bench_end(); - smpi_process()->destroy(); // FIXME: should kill all processes in comm instead simcall_process_kill(SIMIX_process_self()); return MPI_SUCCESS; @@ -270,6 +268,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) { @@ -1167,7 +1176,7 @@ int PMPI_Iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* statu int retval = 0; smpi_bench_end(); - if ((flag == nullptr) || (status == nullptr)) { + if (flag == nullptr) { retval = MPI_ERR_ARG; } else if (comm == MPI_COMM_NULL) { retval = MPI_ERR_COMM; @@ -2451,6 +2460,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 +2558,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 +2613,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)){ @@ -2546,6 +2637,43 @@ int PMPI_Get( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, return retval; } +int PMPI_Rget( 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, MPI_Request* request){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } 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)){ + retval = MPI_ERR_COUNT; + } else if ((!origin_datatype->is_valid()) || (!target_datatype->is_valid())) { + retval = MPI_ERR_TYPE; + } else if(request == nullptr){ + retval = MPI_ERR_REQUEST; + } else { + int rank = smpi_process()->index(); + MPI_Group group; + win->get_group(&group); + int src_traced = group->index(target_rank); + TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, nullptr); + + retval = win->get( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, + target_datatype, request); + + TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); + } + 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; @@ -2556,7 +2684,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)){ @@ -2580,6 +2709,44 @@ int PMPI_Put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, return retval; } +int PMPI_Rput( 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, MPI_Request* request){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } 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)){ + retval = MPI_ERR_COUNT; + } else if ((!origin_datatype->is_valid()) || (!target_datatype->is_valid())) { + retval = MPI_ERR_TYPE; + } else if(request == nullptr){ + retval = MPI_ERR_REQUEST; + } else { + int rank = smpi_process()->index(); + MPI_Group group; + win->get_group(&group); + int dst_traced = group->index(target_rank); + TRACE_smpi_ptp_in(rank, rank, dst_traced, __FUNCTION__, nullptr); + TRACE_smpi_send(rank, rank, dst_traced, SMPI_RMA_TAG, origin_count*origin_datatype->size()); + + retval = win->put( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, + target_datatype, request); + + TRACE_smpi_ptp_out(rank, rank, dst_traced, __FUNCTION__); + } + 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; @@ -2590,7 +2757,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)){ @@ -2616,6 +2784,46 @@ int PMPI_Accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_da return retval; } +int PMPI_Raccumulate( 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, MPI_Request* request){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } 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)){ + retval = MPI_ERR_COUNT; + } else if ((!origin_datatype->is_valid()) || + (!target_datatype->is_valid())) { + retval = MPI_ERR_TYPE; + } else if (op == MPI_OP_NULL) { + retval = MPI_ERR_OP; + } else if(request == nullptr){ + retval = MPI_ERR_REQUEST; + } else { + int rank = smpi_process()->index(); + MPI_Group group; + win->get_group(&group); + int src_traced = group->index(target_rank); + TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, nullptr); + + retval = win->accumulate( origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, + target_datatype, op, request); + + TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + int PMPI_Get_accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr, int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){ @@ -2627,13 +2835,14 @@ 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) || + (origin_addr==nullptr && origin_count > 0 && op != MPI_NO_OP) || (result_addr==nullptr && result_count > 0)){ retval = MPI_ERR_COUNT; - } else if ((!origin_datatype->is_valid()) || + } else if ((origin_datatype!=MPI_DATATYPE_NULL && !origin_datatype->is_valid()) || (!target_datatype->is_valid())|| (!result_datatype->is_valid())) { retval = MPI_ERR_TYPE; @@ -2656,6 +2865,89 @@ MPI_Datatype target_datatype, MPI_Op op, MPI_Win win){ return retval; } + +int PMPI_Rget_accumulate(void *origin_addr, int origin_count, MPI_Datatype origin_datatype, void *result_addr, +int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp, int target_count, +MPI_Datatype target_datatype, MPI_Op op, MPI_Win win, MPI_Request* request){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (target_rank == MPI_PROC_NULL) { + *request = MPI_REQUEST_NULL; + retval = MPI_SUCCESS; + } else if (target_rank <0){ + retval = MPI_ERR_RANK; + } 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 && op != MPI_NO_OP) || + (result_addr==nullptr && result_count > 0)){ + retval = MPI_ERR_COUNT; + } else if ((origin_datatype!=MPI_DATATYPE_NULL && !origin_datatype->is_valid()) || + (!target_datatype->is_valid())|| + (!result_datatype->is_valid())) { + retval = MPI_ERR_TYPE; + } else if (op == MPI_OP_NULL) { + retval = MPI_ERR_OP; + } else if(request == nullptr){ + retval = MPI_ERR_REQUEST; + } else { + int rank = smpi_process()->index(); + MPI_Group group; + win->get_group(&group); + int src_traced = group->index(target_rank); + TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, nullptr); + + retval = win->get_accumulate( origin_addr, origin_count, origin_datatype, result_addr, + result_count, result_datatype, target_rank, target_disp, + target_count, target_datatype, op, request); + + TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Fetch_and_op(void *origin_addr, void *result_addr, MPI_Datatype dtype, int target_rank, MPI_Aint target_disp, MPI_Op op, MPI_Win win){ + return PMPI_Get_accumulate(origin_addr, origin_addr==nullptr?0:1, dtype, result_addr, 1, dtype, target_rank, target_disp, 1, dtype, op, win); +} + +int PMPI_Compare_and_swap(void *origin_addr, void *compare_addr, + void *result_addr, MPI_Datatype datatype, int target_rank, + MPI_Aint target_disp, 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 (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_addr==nullptr || result_addr==nullptr || compare_addr==nullptr){ + retval = MPI_ERR_COUNT; + } else if (!datatype->is_valid()) { + retval = MPI_ERR_TYPE; + } else { + int rank = smpi_process()->index(); + MPI_Group group; + win->get_group(&group); + int src_traced = group->index(target_rank); + TRACE_smpi_ptp_in(rank, src_traced, rank, __FUNCTION__, nullptr); + + retval = win->compare_and_swap( origin_addr, compare_addr, result_addr, datatype, + target_rank, target_disp); + + TRACE_smpi_ptp_out(rank, src_traced, rank, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + int PMPI_Win_post(MPI_Group group, int assert, MPI_Win win){ int retval = 0; smpi_bench_end(); @@ -2761,6 +3053,100 @@ int PMPI_Win_unlock(int rank, MPI_Win win){ return retval; } +int PMPI_Win_lock_all(int assert, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else { + int myrank = smpi_process()->index(); + TRACE_smpi_collective_in(myrank, -1, __FUNCTION__, nullptr); + retval = win->lock_all(assert); + TRACE_smpi_collective_out(myrank, -1, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_unlock_all(MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else { + int myrank = smpi_process()->index(); + TRACE_smpi_collective_in(myrank, -1, __FUNCTION__, nullptr); + retval = win->unlock_all(); + TRACE_smpi_collective_out(myrank, -1, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_flush(int rank, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (rank == MPI_PROC_NULL){ + retval = MPI_SUCCESS; + } else { + int myrank = smpi_process()->index(); + TRACE_smpi_collective_in(myrank, -1, __FUNCTION__, nullptr); + retval = win->flush(rank); + TRACE_smpi_collective_out(myrank, -1, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_flush_local(int rank, MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else if (rank == MPI_PROC_NULL){ + retval = MPI_SUCCESS; + } else { + int myrank = smpi_process()->index(); + TRACE_smpi_collective_in(myrank, -1, __FUNCTION__, nullptr); + retval = win->flush_local(rank); + TRACE_smpi_collective_out(myrank, -1, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_flush_all(MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else { + int myrank = smpi_process()->index(); + TRACE_smpi_collective_in(myrank, -1, __FUNCTION__, nullptr); + retval = win->flush_all(); + TRACE_smpi_collective_out(myrank, -1, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + +int PMPI_Win_flush_local_all(MPI_Win win){ + int retval = 0; + smpi_bench_end(); + if (win == MPI_WIN_NULL) { + retval = MPI_ERR_WIN; + } else { + int myrank = smpi_process()->index(); + TRACE_smpi_collective_in(myrank, -1, __FUNCTION__, nullptr); + retval = win->flush_local_all(); + TRACE_smpi_collective_out(myrank, -1, __FUNCTION__); + } + smpi_bench_begin(); + return retval; +} + int PMPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr){ void *ptr = xbt_malloc(size); if(ptr==nullptr) @@ -2879,7 +3265,7 @@ int PMPI_Attr_delete(MPI_Comm comm, int keyval) { int PMPI_Attr_get(MPI_Comm comm, int keyval, void* attr_value, int* flag) { static int one = 1; static int zero = 0; - static int tag_ub = 1000000; + static int tag_ub = INT_MAX; static int last_used_code = MPI_ERR_LASTCODE; if (comm==MPI_COMM_NULL){