- 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 (((target_datatype == MPI_DATATYPE_NULL) || (result_datatype == MPI_DATATYPE_NULL)) ||
- (((origin_datatype != MPI_DATATYPE_NULL) && (not origin_datatype->is_valid())) || (not target_datatype->is_valid()) || (not 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);
- TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::Pt2PtTIData("Rget_accumulate", target_rank,
- target_datatype->is_basic() ? target_count : target_count * target_datatype->size(),
- encode_datatype(target_datatype)));
-
- 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_comm_out(rank);
- }
- smpi_bench_begin();
+ if (op != MPI_NO_OP){
+ CHECK_BUFFER(1, origin_addr, origin_count, origin_datatype)
+ CHECK_COUNT(2, origin_count)
+ if(origin_count>0)
+ CHECK_TYPE(3, origin_datatype)
+ }
+ CHECK_COUNT(5, result_count)
+ CHECK_TYPE(6, result_datatype)
+ CHECK_BUFFER(4, result_addr, result_count, result_datatype)
+ CHECK_WIN(12, win)
+ CHECK_PROC_RMA(7, target_rank, win)
+ CHECK_COUNT(9, target_count)
+ CHECK_TYPE(10, target_datatype)
+ CHECK_MPI_NULL(11, MPI_OP_NULL, MPI_ERR_OP, op)
+ CHECK_TARGET_DISP(8)
+ CHECK_NULL(10, MPI_ERR_ARG, request)
+ int retval = 0;
+ const SmpiBenchGuard suspend_bench;
+
+ aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
+ MPI_Group group;
+ win->get_group(&group);
+ TRACE_smpi_comm_in(my_proc_id, __func__,
+ new simgrid::instr::Pt2PtTIData(
+ "Rget_accumulate", target_rank, target_count,
+ simgrid::smpi::Datatype::encode(target_datatype)));
+
+ 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_comm_out(my_proc_id);
+