int MPIR_Igatherv_impl(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root, MPID_Comm *comm_ptr, MPI_Request *request) { int mpi_errno = MPI_SUCCESS; int tag = -1; MPID_Request *reqp = NULL; MPID_Sched_t s = MPID_SCHED_NULL; *request = MPI_REQUEST_NULL; mpi_errno = MPID_Sched_next_tag(comm_ptr, &tag); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_create(&s); if (mpi_errno) MPIU_ERR_POP(mpi_errno); MPIU_Assert(comm_ptr->coll_fns != NULL); MPIU_Assert(comm_ptr->coll_fns->Igatherv != NULL); mpi_errno = comm_ptr->coll_fns->Igatherv(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, root, comm_ptr, s); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_start(&s, comm_ptr, tag, &reqp); if (reqp) *request = reqp->handle; if (mpi_errno) MPIU_ERR_POP(mpi_errno); fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Iexscan_impl(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPID_Comm *comm_ptr, MPI_Request *request) { int mpi_errno = MPI_SUCCESS; int tag = -1; MPID_Request *reqp = NULL; MPID_Sched_t s = MPID_SCHED_NULL; *request = MPI_REQUEST_NULL; mpi_errno = MPID_Sched_next_tag(comm_ptr, &tag); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_create(&s); if (mpi_errno) MPIU_ERR_POP(mpi_errno); MPIU_Assert(comm_ptr->coll_fns != NULL); MPIU_Assert(comm_ptr->coll_fns->Iexscan != NULL); mpi_errno = comm_ptr->coll_fns->Iexscan(sendbuf, recvbuf, count, datatype, op, comm_ptr, s); if (mpi_errno) MPIU_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_start(&s, comm_ptr, tag, &reqp); if (reqp) *request = reqp->handle; if (mpi_errno) MPIU_ERR_POP(mpi_errno); fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Iscatterv_impl(const void *sendbuf, const int sendcounts[], const int displs[], MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPID_Comm *comm_ptr, MPI_Request *request) { int mpi_errno = MPI_SUCCESS; MPID_Request *reqp = NULL; int tag = -1; MPID_Sched_t s = MPID_SCHED_NULL; *request = MPI_REQUEST_NULL; MPIU_Assert(comm_ptr->coll_fns != NULL); if (comm_ptr->coll_fns->Iscatterv_req != NULL) { /* --BEGIN USEREXTENSION-- */ mpi_errno = comm_ptr->coll_fns->Iscatterv_req(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm_ptr, &reqp); if (reqp) { *request = reqp->handle; if (mpi_errno) MPIR_ERR_POP(mpi_errno); goto fn_exit; } /* --END USEREXTENSION-- */ } mpi_errno = MPID_Sched_next_tag(comm_ptr, &tag); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_create(&s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); MPIU_Assert(comm_ptr->coll_fns->Iscatterv_sched != NULL); mpi_errno = comm_ptr->coll_fns->Iscatterv_sched(sendbuf, sendcounts, displs, sendtype, recvbuf, recvcount, recvtype, root, comm_ptr, s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_start(&s, comm_ptr, tag, &reqp); if (reqp) *request = reqp->handle; if (mpi_errno) MPIR_ERR_POP(mpi_errno); fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Get_intercomm_contextid_nonblock(MPID_Comm * comm_ptr, MPID_Comm * newcommp, MPID_Request ** req) { int mpi_errno = MPI_SUCCESS; int tag; MPID_Sched_t s; MPID_MPI_STATE_DECL(MPID_STATE_MPIR_GET_INTERCOMM_CONTEXTID_NONBLOCK); MPID_MPI_FUNC_ENTER(MPID_STATE_MPIR_GET_INTERCOMM_CONTEXTID_NONBLOCK); /* do as much local setup as possible */ if (!comm_ptr->local_comm) { mpi_errno = MPIR_Setup_intercomm_localcomm(comm_ptr); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } /* now create a schedule */ mpi_errno = MPID_Sched_next_tag(comm_ptr, &tag); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_create(&s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); /* add some entries to it */ /* first get a context ID over the local comm */ mpi_errno = sched_get_cid_nonblock(comm_ptr, newcommp, &newcommp->recvcontext_id, &newcommp->context_id, s, MPID_INTERCOMM); if (mpi_errno) MPIR_ERR_POP(mpi_errno); /* finally, kick off the schedule and give the caller a request */ mpi_errno = MPID_Sched_start(&s, comm_ptr, tag, req); if (mpi_errno) MPIR_ERR_POP(mpi_errno); fn_fail: MPID_MPI_FUNC_EXIT(MPID_STATE_MPIR_GET_INTERCOMM_CONTEXTID_NONBLOCK); return mpi_errno; }
int MPIR_Ibarrier_impl(MPID_Comm *comm_ptr, MPI_Request *request) { int mpi_errno = MPI_SUCCESS; MPID_Request *reqp = NULL; int tag = -1; MPID_Sched_t s = MPID_SCHED_NULL; *request = MPI_REQUEST_NULL; MPIU_Assert(comm_ptr->coll_fns != NULL); if (comm_ptr->coll_fns->Ibarrier_req != NULL) { /* FG:NBC Double-check */ /* --BEGIN USEREXTENSION-- */ mpi_errno = comm_ptr->coll_fns->Ibarrier_req(comm_ptr, &reqp); if (reqp) { *request = reqp->handle; if (mpi_errno) MPIR_ERR_POP(mpi_errno); goto fn_exit; } /* --END USEREXTENSION-- */ } if (comm_ptr->local_size != 1 || comm_ptr->comm_kind == MPID_INTERCOMM) { mpi_errno = MPID_Sched_next_tag(comm_ptr, &tag); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_create(&s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); MPIU_Assert(comm_ptr->coll_fns->Ibarrier_sched != NULL); mpi_errno = comm_ptr->coll_fns->Ibarrier_sched(comm_ptr, s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_start(&s, comm_ptr, tag, &reqp); if (reqp) *request = reqp->handle; if (mpi_errno) MPIR_ERR_POP(mpi_errno); } fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Get_contextid_nonblock(MPID_Comm * comm_ptr, MPID_Comm * newcommp, MPID_Request ** req) { int mpi_errno = MPI_SUCCESS; int tag; MPID_Sched_t s; MPID_MPI_STATE_DECL(MPID_STATE_MPIR_GET_CONTEXTID_NONBLOCK); MPID_MPI_FUNC_ENTER(MPID_STATE_MPIR_GET_CONTEXTID_NONBLOCK); /* now create a schedule */ mpi_errno = MPID_Sched_next_tag(comm_ptr, &tag); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_Sched_create(&s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); /* add some entries to it */ mpi_errno = sched_get_cid_nonblock(comm_ptr, newcommp, &newcommp->context_id, &newcommp->recvcontext_id, s, MPID_INTRACOMM); if (mpi_errno) MPIR_ERR_POP(mpi_errno); /* finally, kick off the schedule and give the caller a request */ mpi_errno = MPID_Sched_start(&s, comm_ptr, tag, req); if (mpi_errno) MPIR_ERR_POP(mpi_errno); fn_exit: MPID_MPI_FUNC_EXIT(MPID_STATE_MPIR_GET_CONTEXTID_NONBLOCK); return mpi_errno; /* --BEGIN ERROR HANDLING-- */ fn_fail: goto fn_exit; /* --END ERROR HANDLING-- */ }