int MPIR_Bcast_impl(void *buffer, int count, MPI_Datatype datatype, int root, MPIR_Comm * comm_ptr, MPIR_Errflag_t * errflag) { int mpi_errno = MPI_SUCCESS; if (comm_ptr->comm_kind == MPIR_COMM_KIND__INTRACOMM) { /* intracommunicator */ switch (MPIR_CVAR_BCAST_INTRA_ALGORITHM) { case MPIR_CVAR_BCAST_INTRA_ALGORITHM_binomial: mpi_errno = MPIR_Bcast_intra_binomial(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_CVAR_BCAST_INTRA_ALGORITHM_scatter_recursive_doubling_allgather: mpi_errno = MPIR_Bcast_intra_scatter_recursive_doubling_allgather(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_CVAR_BCAST_INTRA_ALGORITHM_scatter_ring_allgather: mpi_errno = MPIR_Bcast_intra_scatter_ring_allgather(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_CVAR_BCAST_INTRA_ALGORITHM_nb: mpi_errno = MPIR_Bcast_allcomm_nb(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_CVAR_BCAST_INTRA_ALGORITHM_auto: MPL_FALLTHROUGH; default: mpi_errno = MPIR_Bcast_intra_auto(buffer, count, datatype, root, comm_ptr, errflag); break; } } else { /* intercommunicator */ switch (MPIR_CVAR_BCAST_INTER_ALGORITHM) { case MPIR_CVAR_BCAST_INTER_ALGORITHM_remote_send_local_bcast: mpi_errno = MPIR_Bcast_inter_remote_send_local_bcast(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_CVAR_BCAST_INTER_ALGORITHM_nb: mpi_errno = MPIR_Bcast_allcomm_nb(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_CVAR_BCAST_INTER_ALGORITHM_auto: MPL_FALLTHROUGH; default: mpi_errno = MPIR_Bcast_inter_auto(buffer, count, datatype, root, comm_ptr, errflag); break; } } if (mpi_errno) MPIR_ERR_POP(mpi_errno); fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Bcast_impl(void *buffer, int count, MPI_Datatype datatype, int root, MPIR_Comm * comm_ptr, MPIR_Errflag_t * errflag) { int mpi_errno = MPI_SUCCESS; if (comm_ptr->comm_kind == MPIR_COMM_KIND__INTRACOMM) { /* intracommunicator */ switch (MPIR_Bcast_intra_algo_choice) { case MPIR_BCAST_INTRA_ALGO_BINOMIAL: mpi_errno = MPIR_Bcast_intra_binomial(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_BCAST_INTRA_ALGO_SCATTER_RECURSIVE_DOUBLING_ALLGATHER: mpi_errno = MPIR_Bcast_intra_scatter_recursive_doubling_allgather(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_BCAST_INTRA_ALGO_SCATTER_RING_ALLGATHER: mpi_errno = MPIR_Bcast_intra_scatter_ring_allgather(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_BCAST_INTRA_ALGO_NB: mpi_errno = MPIR_Bcast_allcomm_nb(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_BCAST_INTRA_ALGO_AUTO: MPL_FALLTHROUGH; default: mpi_errno = MPIR_Bcast_intra_auto(buffer, count, datatype, root, comm_ptr, errflag); break; } } else { /* intercommunicator */ switch (MPIR_Bcast_inter_algo_choice) { case MPIR_BCAST_INTER_ALGO_REMOTE_SEND_LOCAL_BCAST: mpi_errno = MPIR_Bcast_inter_remote_send_local_bcast(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_BCAST_INTER_ALGO_NB: mpi_errno = MPIR_Bcast_allcomm_nb(buffer, count, datatype, root, comm_ptr, errflag); break; case MPIR_BCAST_INTER_ALGO_AUTO: MPL_FALLTHROUGH; default: mpi_errno = MPIR_Bcast_inter_auto(buffer, count, datatype, root, comm_ptr, errflag); break; } } if (mpi_errno) MPIR_ERR_POP(mpi_errno); fn_exit: return mpi_errno; fn_fail: goto fn_exit; }
int MPIR_Bcast_intra_auto(void *buffer, int count, MPI_Datatype datatype, int root, MPIR_Comm * comm_ptr, MPIR_Errflag_t * errflag) { int mpi_errno = MPI_SUCCESS; int mpi_errno_ret = MPI_SUCCESS; int comm_size; MPI_Aint nbytes = 0; MPI_Aint type_size; MPIR_FUNC_TERSE_STATE_DECL(MPID_STATE_MPIR_BCAST); MPIR_FUNC_TERSE_ENTER(MPID_STATE_MPIR_BCAST); if (count == 0) goto fn_exit; MPIR_Datatype_get_size_macro(datatype, type_size); nbytes = MPIR_CVAR_MAX_SMP_BCAST_MSG_SIZE ? type_size * count : 0; if (MPIR_CVAR_ENABLE_SMP_COLLECTIVES && MPIR_CVAR_ENABLE_SMP_BCAST && nbytes <= MPIR_CVAR_MAX_SMP_BCAST_MSG_SIZE && MPIR_Comm_is_node_aware(comm_ptr)) { mpi_errno = MPIR_Bcast_intra_smp(buffer, count, datatype, root, comm_ptr, errflag); if (mpi_errno) { /* for communication errors, just record the error but continue */ *errflag = MPIX_ERR_PROC_FAILED == MPIR_ERR_GET_CLASS(mpi_errno) ? MPIR_ERR_PROC_FAILED : MPIR_ERR_OTHER; MPIR_ERR_SET(mpi_errno, *errflag, "**fail"); MPIR_ERR_ADD(mpi_errno_ret, mpi_errno); } goto fn_exit; } comm_size = comm_ptr->local_size; MPIR_Datatype_get_size_macro(datatype, type_size); nbytes = type_size * count; if (nbytes == 0) goto fn_exit; /* nothing to do */ if ((nbytes < MPIR_CVAR_BCAST_SHORT_MSG_SIZE) || (comm_size < MPIR_CVAR_BCAST_MIN_PROCS)) { mpi_errno = MPIR_Bcast_intra_binomial(buffer, count, datatype, root, comm_ptr, errflag); } else { /* (nbytes >= MPIR_CVAR_BCAST_SHORT_MSG_SIZE) && (comm_size >= MPIR_CVAR_BCAST_MIN_PROCS) */ if ((nbytes < MPIR_CVAR_BCAST_LONG_MSG_SIZE) && (MPL_is_pof2(comm_size, NULL))) { mpi_errno = MPIR_Bcast_intra_scatter_recursive_doubling_allgather(buffer, count, datatype, root, comm_ptr, errflag); } else { /* (nbytes >= MPIR_CVAR_BCAST_LONG_MSG_SIZE) || !(comm_size_is_pof2) */ mpi_errno = MPIR_Bcast_intra_scatter_ring_allgather(buffer, count, datatype, root, comm_ptr, errflag); } } if (mpi_errno) { /* for communication errors, just record the error but continue */ *errflag = MPIX_ERR_PROC_FAILED == MPIR_ERR_GET_CLASS(mpi_errno) ? MPIR_ERR_PROC_FAILED : MPIR_ERR_OTHER; MPIR_ERR_SET(mpi_errno, *errflag, "**fail"); MPIR_ERR_ADD(mpi_errno_ret, mpi_errno); } fn_exit: MPIR_FUNC_TERSE_EXIT(MPID_STATE_MPIR_BCAST); /* --BEGIN ERROR HANDLING-- */ if (mpi_errno_ret) mpi_errno = mpi_errno_ret; else if (*errflag != MPIR_ERR_NONE) MPIR_ERR_SET(mpi_errno, *errflag, "**coll_fail"); /* --END ERROR HANDLING-- */ return mpi_errno; }