int MPIR_Ineighbor_alltoallw_sched_allcomm_linear(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[], const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[], const MPI_Datatype recvtypes[], MPIR_Comm * comm_ptr, MPIR_Sched_t s) { int mpi_errno = MPI_SUCCESS; int indegree, outdegree, weighted; int k, l; int *srcs, *dsts; MPIR_CHKLMEM_DECL(2); mpi_errno = MPIR_Topo_canon_nhb_count(comm_ptr, &indegree, &outdegree, &weighted); if (mpi_errno) MPIR_ERR_POP(mpi_errno); MPIR_CHKLMEM_MALLOC(srcs, int *, indegree * sizeof(int), mpi_errno, "srcs", MPL_MEM_COMM); MPIR_CHKLMEM_MALLOC(dsts, int *, outdegree * sizeof(int), mpi_errno, "dsts", MPL_MEM_COMM); mpi_errno = MPIR_Topo_canon_nhb(comm_ptr, indegree, srcs, MPI_UNWEIGHTED, outdegree, dsts, MPI_UNWEIGHTED); if (mpi_errno) MPIR_ERR_POP(mpi_errno); for (k = 0; k < outdegree; ++k) { char *sb; MPIR_Ensure_Aint_fits_in_pointer(MPIR_VOID_PTR_CAST_TO_MPI_AINT sendbuf + sdispls[k]); sb = ((char *) sendbuf) + sdispls[k]; mpi_errno = MPIR_Sched_send(sb, sendcounts[k], sendtypes[k], dsts[k], comm_ptr, s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } for (l = 0; l < indegree; ++l) { char *rb; MPIR_Ensure_Aint_fits_in_pointer(MPIR_VOID_PTR_CAST_TO_MPI_AINT recvbuf + rdispls[l]); rb = ((char *) recvbuf) + rdispls[l]; mpi_errno = MPIR_Sched_recv(rb, recvcounts[l], recvtypes[l], srcs[l], comm_ptr, s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } MPIR_SCHED_BARRIER(s); fn_exit: MPIR_CHKLMEM_FREEALL(); return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Ineighbor_allgatherv_sched_allcomm_linear(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPIR_Comm * comm_ptr, MPIR_Sched_t s) { int mpi_errno = MPI_SUCCESS; int indegree, outdegree, weighted; int k, l; int *srcs, *dsts; MPI_Aint recvtype_extent; MPIR_CHKLMEM_DECL(2); MPIR_Datatype_get_extent_macro(recvtype, recvtype_extent); mpi_errno = MPIR_Topo_canon_nhb_count(comm_ptr, &indegree, &outdegree, &weighted); if (mpi_errno) MPIR_ERR_POP(mpi_errno); MPIR_CHKLMEM_MALLOC(srcs, int *, indegree * sizeof(int), mpi_errno, "srcs", MPL_MEM_COMM); MPIR_CHKLMEM_MALLOC(dsts, int *, outdegree * sizeof(int), mpi_errno, "dsts", MPL_MEM_COMM); mpi_errno = MPIR_Topo_canon_nhb(comm_ptr, indegree, srcs, MPI_UNWEIGHTED, outdegree, dsts, MPI_UNWEIGHTED); if (mpi_errno) MPIR_ERR_POP(mpi_errno); for (k = 0; k < outdegree; ++k) { mpi_errno = MPIR_Sched_send(sendbuf, sendcount, sendtype, dsts[k], comm_ptr, s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } for (l = 0; l < indegree; ++l) { char *rb = ((char *) recvbuf) + displs[l] * recvtype_extent; mpi_errno = MPIR_Sched_recv(rb, recvcounts[l], recvtype, srcs[l], comm_ptr, s); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } MPIR_SCHED_BARRIER(s); fn_exit: MPIR_CHKLMEM_FREEALL(); return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Ineighbor_allgatherv_default(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int displs[], MPI_Datatype recvtype, MPID_Comm *comm_ptr, MPID_Sched_t s) { int mpi_errno = MPI_SUCCESS; int indegree, outdegree, weighted; int i, k,l; int *srcs, *dsts; int comm_size; MPI_Aint recvtype_extent; MPIU_CHKLMEM_DECL(2); comm_size = comm_ptr->local_size; MPID_Datatype_get_extent_macro(recvtype, recvtype_extent); for (i = 0; i < comm_size; ++i) { MPID_Ensure_Aint_fits_in_pointer(MPI_VOID_PTR_CAST_TO_MPI_AINT recvbuf + (displs[i] * recvtype_extent)); } mpi_errno = MPIR_Topo_canon_nhb_count(comm_ptr, &indegree, &outdegree, &weighted); if (mpi_errno) MPIU_ERR_POP(mpi_errno); MPIU_CHKLMEM_MALLOC(srcs, int *, indegree*sizeof(int), mpi_errno, "srcs"); MPIU_CHKLMEM_MALLOC(dsts, int *, outdegree*sizeof(int), mpi_errno, "dsts"); mpi_errno = MPIR_Topo_canon_nhb(comm_ptr, indegree, srcs, MPI_UNWEIGHTED, outdegree, dsts, MPI_UNWEIGHTED); if (mpi_errno) MPIU_ERR_POP(mpi_errno); for (k = 0; k < outdegree; ++k) { mpi_errno = MPID_Sched_send(sendbuf, sendcount, sendtype, dsts[k], comm_ptr, s); if (mpi_errno) MPIU_ERR_POP(mpi_errno); } for (l = 0; l < indegree; ++l) { char *rb = ((char *)recvbuf) + displs[l] * recvtype_extent; mpi_errno = MPID_Sched_recv(rb, recvcounts[l], recvtype, srcs[l], comm_ptr, s); if (mpi_errno) MPIU_ERR_POP(mpi_errno); } MPID_SCHED_BARRIER(s); fn_exit: MPIU_CHKLMEM_FREEALL(); return mpi_errno; fn_fail: goto fn_exit; }