int ompi_comm_neighbors(MPI_Comm comm, int maxindegree, int sources[], int sourceweights[], int maxoutdegree, int destinations[], int destweights[]) { int res; int index = 0; int indeg, outdeg, wgtd; res = ompi_comm_neighbors_count(comm, &indeg, &outdeg, &wgtd); if (MPI_SUCCESS != res) { return res; } if(indeg > maxindegree && outdeg > maxoutdegree) return MPI_ERR_TRUNCATE; /* we want to return *all* neighbors */ if (OMPI_COMM_IS_CART(comm)) { int ndims, i, rpeer, speer; res = MPI_Cartdim_get(comm, &ndims); if (MPI_SUCCESS != res) { return res; } for(i = 0; i<ndims; i++) { res = MPI_Cart_shift(comm, i, 1, &rpeer, &speer); if (MPI_SUCCESS != res) { return res; } sources[index] = destinations[index] = rpeer; index++; sources[index] = destinations[index] = speer; index++; } } else if (OMPI_COMM_IS_GRAPH(comm)) { int rank = ompi_comm_rank ((ompi_communicator_t *) comm); res = MPI_Graph_neighbors(comm, rank, maxindegree, sources); if (MPI_SUCCESS != res) { return res; } for(int i=0; i<maxindegree; i++) destinations[i] = sources[i]; } else if (OMPI_COMM_IS_DIST_GRAPH(comm)) { res = MPI_Dist_graph_neighbors(comm, maxindegree, sources, sourceweights, maxoutdegree, destinations, destweights); if (MPI_SUCCESS != res) { return res; } } else { return MPI_ERR_ARG; } return MPI_SUCCESS; }
int MPI_Neighbor_alltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[], MPI_Datatype sendtype, void *recvbuf, const int recvcounts[], const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm) { int i, err; int indegree, outdegree, weighted; size_t sendtype_size, recvtype_size; bool zerosend=true, zerorecv=true; MEMCHECKER( ptrdiff_t recv_ext; ptrdiff_t send_ext; memchecker_comm(comm); if (MPI_IN_PLACE != sendbuf) { memchecker_datatype(sendtype); ompi_datatype_type_extent(recvtype, &recv_ext); } memchecker_datatype(recvtype); ompi_datatype_type_extent(sendtype, &send_ext); err = ompi_comm_neighbors_count(comm, &indegree, &outdegree, &weighted); if (MPI_SUCCESS == err) { if (MPI_IN_PLACE != sendbuf) { for ( i = 0; i < outdegree; i++ ) { /* check if send chunks are defined. */ memchecker_call(&opal_memchecker_base_isdefined, (char *)(sendbuf)+sdispls[i]*send_ext, sendcounts[i], sendtype); } } for ( i = 0; i < indegree; i++ ) { /* check if receive chunks are addressable. */ memchecker_call(&opal_memchecker_base_isaddressable, (char *)(recvbuf)+rdispls[i]*recv_ext, recvcounts[i], recvtype); } } );
int MPI_Neighbor_alltoallw(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[], MPI_Comm comm) { int i, err; int indegree, outdegree, weighted; MEMCHECKER( ptrdiff_t recv_ext; ptrdiff_t send_ext; memchecker_comm(comm); err = ompi_comm_neighbors_count(comm, &indegree, &outdegree, &weighted); if (MPI_SUCCESS == err) { if (MPI_IN_PLACE != sendbuf) { for ( i = 0; i < outdegree; i++ ) { memchecker_datatype(sendtypes[i]); ompi_datatype_type_extent(sendtypes[i], &send_ext); memchecker_call(&opal_memchecker_base_isdefined, (char *)(sendbuf)+sdispls[i]*send_ext, sendcounts[i], sendtypes[i]); } } for ( i = 0; i < indegree; i++ ) { memchecker_datatype(recvtypes[i]); ompi_datatype_type_extent(recvtypes[i], &recv_ext); memchecker_call(&opal_memchecker_base_isaddressable, (char *)(recvbuf)+sdispls[i]*recv_ext, recvcounts[i], recvtypes[i]); } } );