int MPID_Rput(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPIR_Win * win_ptr, MPIR_Request ** request) { int mpi_errno = MPI_SUCCESS; int dt_contig ATTRIBUTE((unused)); MPIR_Datatype*dtp; MPI_Aint dt_true_lb ATTRIBUTE((unused)); intptr_t data_sz; MPIR_Request *ureq; MPIR_FUNC_VERBOSE_STATE_DECL(MPID_STATE_MPID_RPUT); MPIR_FUNC_VERBOSE_ENTER(MPID_STATE_MPID_RPUT); /* request-based RMA operations are only valid within a passive epoch */ MPIR_ERR_CHKANDJUMP(win_ptr->states.access_state != MPIDI_RMA_PER_TARGET && win_ptr->states.access_state != MPIDI_RMA_LOCK_ALL_CALLED && win_ptr->states.access_state != MPIDI_RMA_LOCK_ALL_ISSUED && win_ptr->states.access_state != MPIDI_RMA_LOCK_ALL_GRANTED, mpi_errno, MPI_ERR_RMA_SYNC, "**rmasync"); MPIDI_Datatype_get_info(origin_count, origin_datatype, dt_contig, data_sz, dtp, dt_true_lb); /* Create user request, initially cc=1, ref=1 */ ureq = MPIR_Request_create(MPIR_REQUEST_KIND__RMA); MPIR_ERR_CHKANDJUMP(ureq == NULL, mpi_errno, MPI_ERR_OTHER, "**nomemreq"); /* This request is referenced by user and ch3 by default. */ MPIR_Object_set_ref(ureq, 2); /* Enqueue or perform the RMA operation */ if (target_rank != MPI_PROC_NULL && data_sz != 0) { mpi_errno = MPIDI_CH3I_Put(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win_ptr, ureq); if (mpi_errno != MPI_SUCCESS) { MPIR_ERR_POP(mpi_errno); } } else { mpi_errno = MPID_Request_complete(ureq); if (mpi_errno != MPI_SUCCESS) { MPIR_ERR_POP(mpi_errno); } } *request = ureq; fn_exit: MPIR_FUNC_VERBOSE_EXIT(MPID_STATE_MPID_RPUT); return mpi_errno; fn_fail: goto fn_exit; }
int MPID_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPID_Win * win_ptr) { int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPID_PUT); MPIDI_RMA_FUNC_ENTER(MPID_STATE_MPID_PUT); mpi_errno = MPIDI_CH3I_Put(origin_addr, origin_count, origin_datatype, target_rank, target_disp, target_count, target_datatype, win_ptr, NULL); fn_exit: MPIDI_RMA_FUNC_EXIT(MPID_STATE_MPID_PUT); return mpi_errno; /* --BEGIN ERROR HANDLING-- */ fn_fail: goto fn_exit; /* --END ERROR HANDLING-- */ }