| 809 | | #else /* This case is retained as its more tested; we should eventually discard it */ |
| 810 | | else { /* long message or medium-size message and non-power-of-two |
| 811 | | * no. of processes. Use ring algorithm. */ |
| 812 | | int jnext; |
| 813 | | |
| 814 | | if (sendbuf != MPI_IN_PLACE) { |
| 815 | | /* First, load the "local" version in the recvbuf. */ |
| 816 | | mpi_errno = MPIR_Localcopy(sendbuf, sendcount, sendtype, |
| 817 | | ((char *)recvbuf + displs[rank]*recvtype_extent), |
| 818 | | recvcounts[rank], recvtype); |
| 819 | | /* --BEGIN ERROR HANDLING-- */ |
| 820 | | if (mpi_errno) |
| 821 | | { |
| 822 | | mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", 0); |
| 823 | | return mpi_errno; |
| 824 | | } |
| 825 | | /* --END ERROR HANDLING-- */ |
| 826 | | } |
| 827 | | |
| 828 | | left = (comm_size + rank - 1) % comm_size; |
| 829 | | right = (rank + 1) % comm_size; |
| 830 | | |
| 831 | | j = rank; |
| 832 | | jnext = left; |
| 833 | | for (i=1; i<comm_size; i++) { |
| 834 | | mpi_errno = MPIC_Sendrecv(((char *)recvbuf+displs[j]*recvtype_extent), |
| 835 | | recvcounts[j], recvtype, right, |
| 836 | | MPIR_ALLGATHERV_TAG, |
| 837 | | ((char *)recvbuf + displs[jnext]*recvtype_extent), |
| 838 | | recvcounts[jnext], recvtype, left, |
| 839 | | MPIR_ALLGATHERV_TAG, comm, &status ); |
| 840 | | /* --BEGIN ERROR HANDLING-- */ |
| 841 | | if (mpi_errno) |
| 842 | | { |
| 843 | | mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", 0); |
| 844 | | return mpi_errno; |
| 845 | | } |
| 846 | | /* --END ERROR HANDLING-- */ |
| 847 | | j = jnext; |
| 848 | | jnext = (comm_size + jnext - 1) % comm_size; |
| 849 | | } |
| 850 | | } |
| 851 | | #endif /* USE_PIPE_COLLECTIVES */ |