int MPIR_Barrier(MPID_Comm *comm_ptr, MPIR_Errflag_t *errflag) { int mpi_errno = MPI_SUCCESS; if (comm_ptr->comm_kind == MPID_INTRACOMM) { /* intracommunicator */ mpi_errno = MPIR_Barrier_intra( comm_ptr, errflag ); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } else { /* intercommunicator */ mpi_errno = MPIR_Barrier_inter( comm_ptr, errflag ); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Barrier_impl(MPID_Comm *comm_ptr, int *errflag) { int mpi_errno = MPI_SUCCESS; int mpi_errno_ret = MPI_SUCCESS; if (comm_ptr->coll_fns != NULL && comm_ptr->coll_fns->Barrier != NULL) { mpi_errno = comm_ptr->coll_fns->Barrier(comm_ptr, errflag); if (mpi_errno) MPIU_ERR_POP(mpi_errno); } else { if (comm_ptr->comm_kind == MPID_INTRACOMM) { #if defined(USE_SMP_COLLECTIVES) if (MPIR_Comm_is_node_aware(comm_ptr)) { /* do the intranode barrier on all nodes */ if (comm_ptr->node_comm != NULL) { mpi_errno = MPIR_Barrier_or_coll_fn(comm_ptr->node_comm, errflag); if (mpi_errno) { /* for communication errors, just record the error but continue */ *errflag = TRUE; MPIU_ERR_SET(mpi_errno, MPI_ERR_OTHER, "**fail"); MPIU_ERR_ADD(mpi_errno_ret, mpi_errno); } } /* do the barrier across roots of all nodes */ if (comm_ptr->node_roots_comm != NULL) { mpi_errno = MPIR_Barrier_or_coll_fn(comm_ptr->node_roots_comm, errflag); if (mpi_errno) { /* for communication errors, just record the error but continue */ *errflag = TRUE; MPIU_ERR_SET(mpi_errno, MPI_ERR_OTHER, "**fail"); MPIU_ERR_ADD(mpi_errno_ret, mpi_errno); } } /* release the local processes on each node with a 1-byte broadcast (0-byte broadcast just returns without doing anything) */ if (comm_ptr->node_comm != NULL) { int i=0; mpi_errno = MPIR_Bcast_impl(&i, 1, MPI_BYTE, 0, comm_ptr->node_comm, errflag); if (mpi_errno) { /* for communication errors, just record the error but continue */ *errflag = TRUE; MPIU_ERR_SET(mpi_errno, MPI_ERR_OTHER, "**fail"); MPIU_ERR_ADD(mpi_errno_ret, mpi_errno); } } } else { mpi_errno = MPIR_Barrier_intra( comm_ptr, errflag ); if (mpi_errno) MPIU_ERR_POP(mpi_errno); } #else mpi_errno = MPIR_Barrier_intra( comm_ptr, errflag ); if (mpi_errno) MPIU_ERR_POP(mpi_errno); #endif } else { /* intercommunicator */ mpi_errno = MPIR_Barrier_inter( comm_ptr, errflag ); if (mpi_errno) MPIU_ERR_POP(mpi_errno); } } fn_exit: if (mpi_errno_ret) mpi_errno = mpi_errno_ret; else if (*errflag) MPIU_ERR_SET(mpi_errno, MPI_ERR_OTHER, "**coll_fail"); return mpi_errno; fn_fail: goto fn_exit; }