diff --git a/src/mpi/coll/barrier/barrier_intra_k_dissemination.c b/src/mpi/coll/barrier/barrier_intra_k_dissemination.c index 2d006c162ba..d37d94963df 100644 --- a/src/mpi/coll/barrier/barrier_intra_k_dissemination.c +++ b/src/mpi/coll/barrier/barrier_intra_k_dissemination.c @@ -84,6 +84,8 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k, nphases++; } + MPIR_Request **rreqs = recv_reqs; + MPIR_Request **prev_rreqs = recv_reqs + (k - 1); shift = 1; for (i = 0; i < nphases; i++) { for (j = 1; j < k; j++) { @@ -95,14 +97,12 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k, MPIR_Assert(to >= 0 && to < nranks); /* recv from (k-1) nbrs */ - mpi_errno = - MPIC_Irecv(NULL, 0, MPI_BYTE, from, MPIR_BARRIER_TAG, comm, coll_group, - &recv_reqs[(j - 1) + ((k - 1) * (i & 1))]); + mpi_errno = MPIC_Irecv(NULL, 0, MPI_BYTE, from, MPIR_BARRIER_TAG, comm, coll_group, + &rreqs[j - 1]); MPIR_ERR_COLL_CHECKANDCONT(mpi_errno, errflag, mpi_errno_ret); /* wait on recvs from prev phase */ if (i > 0 && j == 1) { - mpi_errno = - MPIC_Waitall(k - 1, &recv_reqs[((k - 1) * ((i - 1) & 1))], MPI_STATUSES_IGNORE); + mpi_errno = MPIC_Waitall(k - 1, prev_rreqs, MPI_STATUSES_IGNORE); MPIR_ERR_COLL_CHECKANDCONT(mpi_errno, errflag, mpi_errno_ret); } @@ -114,10 +114,13 @@ int MPIR_Barrier_intra_k_dissemination(MPIR_Comm * comm, int coll_group, int k, mpi_errno = MPIC_Waitall(k - 1, send_reqs, MPI_STATUSES_IGNORE); MPIR_ERR_COLL_CHECKANDCONT(mpi_errno, errflag, mpi_errno_ret); shift *= k; + + MPIR_Request **tmp = rreqs; + rreqs = prev_rreqs; + prev_rreqs = tmp; } - mpi_errno = - MPIC_Waitall(k - 1, recv_reqs + ((k - 1) * ((nphases - 1) & 1)), MPI_STATUSES_IGNORE); + mpi_errno = MPIC_Waitall(k - 1, prev_rreqs, MPI_STATUSES_IGNORE); MPIR_ERR_COLL_CHECKANDCONT(mpi_errno, errflag, mpi_errno_ret); fn_exit: