/* * barrier_intra_dec * * Function: - seletects barrier algorithm to use * Accepts: - same arguments as MPI_Barrier() * Returns: - MPI_SUCCESS or error code (passed from the barrier implementation) */ int ompi_coll_tuned_barrier_intra_dec_fixed(struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { int communicator_size = ompi_comm_size(comm); OPAL_OUTPUT((ompi_coll_tuned_stream, "ompi_coll_tuned_barrier_intra_dec_fixed com_size %d", communicator_size)); if( 2 == communicator_size ) return ompi_coll_tuned_barrier_intra_two_procs(comm, module); /** * Basic optimisation. If we have a power of 2 number of nodes * the use the recursive doubling algorithm, otherwise * bruck is the one we want. */ { bool has_one = false; for( ; communicator_size > 0; communicator_size >>= 1 ) { if( communicator_size & 0x1 ) { if( has_one ) return ompi_coll_tuned_barrier_intra_bruck(comm, module); has_one = true; } } } return ompi_coll_tuned_barrier_intra_recursivedoubling(comm, module); /* return ompi_coll_tuned_barrier_intra_linear(comm); */ /* return ompi_coll_tuned_barrier_intra_doublering(comm); */ }
int ompi_coll_tuned_barrier_intra_do_forced(struct ompi_communicator_t *comm, mca_coll_base_module_t *module) { mca_coll_tuned_module_t *tuned_module = (mca_coll_tuned_module_t*) module; mca_coll_tuned_comm_t *data = tuned_module->tuned_data; OPAL_OUTPUT((ompi_coll_tuned_stream, "coll:tuned:barrier_intra_do_forced selected algorithm %d", data->user_forced[BARRIER].algorithm)); switch (data->user_forced[BARRIER].algorithm) { case (0): return ompi_coll_tuned_barrier_intra_dec_fixed (comm, module); case (1): return ompi_coll_tuned_barrier_intra_basic_linear (comm, module); case (2): return ompi_coll_tuned_barrier_intra_doublering (comm, module); case (3): return ompi_coll_tuned_barrier_intra_recursivedoubling (comm, module); case (4): return ompi_coll_tuned_barrier_intra_bruck (comm, module); case (5): return ompi_coll_tuned_barrier_intra_two_procs (comm, module); case (6): return ompi_coll_tuned_barrier_intra_tree (comm, module); default: OPAL_OUTPUT((ompi_coll_tuned_stream,"coll:tuned:barrier_intra_do_forced attempt to select algorithm %d when only 0-%d is valid?", data->user_forced[BARRIER].algorithm, ompi_coll_tuned_forced_max_algorithms[BARRIER])); return (MPI_ERR_ARG); } /* switch */ }
int ompi_coll_tuned_barrier_intra_do_this (struct ompi_communicator_t *comm, mca_coll_base_module_t *module, int algorithm, int faninout, int segsize) { OPAL_OUTPUT((ompi_coll_tuned_stream,"coll:tuned:barrier_intra_do_this selected algorithm %d topo fanin/out%d", algorithm, faninout)); switch (algorithm) { case (0): return ompi_coll_tuned_barrier_intra_dec_fixed (comm, module); case (1): return ompi_coll_tuned_barrier_intra_basic_linear (comm, module); case (2): return ompi_coll_tuned_barrier_intra_doublering (comm, module); case (3): return ompi_coll_tuned_barrier_intra_recursivedoubling (comm, module); case (4): return ompi_coll_tuned_barrier_intra_bruck (comm, module); case (5): return ompi_coll_tuned_barrier_intra_two_procs (comm, module); case (6): return ompi_coll_tuned_barrier_intra_tree (comm, module); default: OPAL_OUTPUT((ompi_coll_tuned_stream,"coll:tuned:barrier_intra_do_this attempt to select algorithm %d when only 0-%d is valid?", algorithm, ompi_coll_tuned_forced_max_algorithms[BARRIER])); return (MPI_ERR_ARG); } /* switch */ }