From 5422a5f5f25d733a237a88508ad66999c25b2839 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sat, 23 Nov 2019 18:15:08 +0100 Subject: [PATCH] smpi colls: use C++ containers instead of nul-terminted C vectors --- src/smpi/colls/smpi_automatic_selector.cpp | 21 +- src/smpi/colls/smpi_coll.cpp | 492 ++++++++++----------- src/smpi/include/smpi_coll.hpp | 4 +- 3 files changed, 244 insertions(+), 273 deletions(-) diff --git a/src/smpi/colls/smpi_automatic_selector.cpp b/src/smpi/colls/smpi_automatic_selector.cpp index 0f7ff3c3ea..8e816ca2f3 100644 --- a/src/smpi/colls/smpi_automatic_selector.cpp +++ b/src/smpi/colls/smpi_automatic_selector.cpp @@ -15,14 +15,12 @@ { \ double time1, time2, time_min = DBL_MAX; \ int min_coll = -1, global_coll = -1; \ - int i = 0; \ double buf_in, buf_out, max_min = DBL_MAX; \ - auto desc = simgrid::smpi::colls::get_smpi_coll_description(_XBT_STRINGIFY(cat), i); \ - while (not desc->name.empty()) { \ - if (desc->name == "automatic") \ - goto next_iteration; \ - if (desc->name == "default") \ - goto next_iteration; \ + auto descriptions = simgrid::smpi::colls::get_smpi_coll_descriptions(_XBT_STRINGIFY(cat)); \ + for (unsigned long i = 0; i < descriptions->size(); i++) { \ + auto desc = &descriptions->at(i); \ + if (desc->name == "automatic" || desc->name == "default") \ + continue; \ barrier__default(comm); \ if (TRACE_is_enabled()) { \ simgrid::instr::EventType* type = \ @@ -53,19 +51,14 @@ global_coll = i; \ } \ } \ - next_iteration: \ - i++; \ - desc = simgrid::smpi::colls::get_smpi_coll_description(_XBT_STRINGIFY(cat), i); \ } \ if (comm->rank() == 0) { \ XBT_WARN("For rank 0, the quickest was %s : %f , but global was %s : %f at max", \ - simgrid::smpi::colls::get_smpi_coll_description(_XBT_STRINGIFY(cat), min_coll)->name.c_str(), time_min, \ - simgrid::smpi::colls::get_smpi_coll_description(_XBT_STRINGIFY(cat), global_coll)->name.c_str(), \ + descriptions->at(min_coll).name.c_str(), time_min, descriptions->at(global_coll).name.c_str(), \ max_min); \ } else \ XBT_WARN("The quickest " _XBT_STRINGIFY(cat) " was %s on rank %d and took %f", \ - simgrid::smpi::colls::get_smpi_coll_description(_XBT_STRINGIFY(cat), min_coll)->name.c_str(), \ - comm->rank(), time_min); \ + descriptions->at(min_coll).name.c_str(), comm->rank(), time_min); \ return (min_coll != -1) ? MPI_SUCCESS : MPI_ERR_INTERN; \ } diff --git a/src/smpi/colls/smpi_coll.cpp b/src/smpi/colls/smpi_coll.cpp index 36fbd53e18..827d06d615 100644 --- a/src/smpi/colls/smpi_coll.cpp +++ b/src/smpi/colls/smpi_coll.cpp @@ -13,273 +13,253 @@ #include "smpi_request.hpp" #include "xbt/config.hpp" +#include + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, "Logging specific to SMPI collectives."); namespace simgrid { namespace smpi { -/* these arrays must be nullptr terminated */ -s_mpi_coll_description_t mpi_coll_gather_description[] = { - {"default","gather default collective", (void*)gather__default}, - {"ompi","gather ompi collective", (void*)gather__ompi}, - {"ompi_basic_linear","gather ompi_basic_linear collective", (void*)gather__ompi_basic_linear}, - {"ompi_binomial", "gather ompi_binomial collective", (void*)gather__ompi_binomial}, - {"ompi_linear_sync", "gather ompi_linear_sync collective", (void*)gather__ompi_linear_sync}, - {"mpich", "gather mpich collective", (void*)gather__mpich}, - {"mvapich2","gather mvapich2 collective", (void*)gather__mvapich2}, - {"mvapich2_two_level", "gather mvapich2_two_level collective", (void*)gather__mvapich2_two_level}, - {"impi","gather impi collective", (void*)gather__impi}, - {"automatic","gather automatic collective",(void*)gather__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_allgather_description[] = { - {"default", "allgather default collective", (void*)allgather__default}, - {"2dmesh", "allgather 2dmesh collective", (void*)allgather__2dmesh}, - {"3dmesh", "allgather 3dmesh collective", (void*)allgather__3dmesh}, - {"bruck", "allgather bruck collective", (void*)allgather__bruck}, - {"GB", "allgather GB collective", (void*)allgather__GB}, - {"loosely_lr", "allgather loosely_lr collective", (void*)allgather__loosely_lr}, - {"NTSLR", "allgather NTSLR collective", (void*)allgather__NTSLR}, - {"NTSLR_NB", "allgather NTSLR_NB collective", (void*)allgather__NTSLR_NB}, - {"pair", "allgather pair collective", (void*)allgather__pair}, - {"rdb", "allgather rdb collective", (void*)allgather__rdb}, - {"rhv", "allgather rhv collective", (void*)allgather__rhv}, - {"ring", "allgather ring collective", (void*)allgather__ring }, - {"SMP_NTS", "allgather SMP_NTS collective", (void*)allgather__SMP_NTS}, - {"smp_simple", "allgather smp_simple collective", (void*)allgather__smp_simple}, - {"spreading_simple", "allgather spreading_simple collective", (void*)allgather__spreading_simple}, - {"ompi", "allgather ompi collective", (void*)allgather__ompi}, - {"ompi_neighborexchange", "allgather ompi_neighborexchange collective", (void*)allgather__ompi_neighborexchange}, - {"mvapich2", "allgather mvapich2 collective", (void*)allgather__mvapich2}, - {"mvapich2_smp", "allgather mvapich2_smp collective", (void*)allgather__mvapich2_smp}, - {"mpich", "allgather mpich collective", (void*)allgather__mpich}, - {"impi", "allgather impi collective", (void*)allgather__impi}, - {"automatic", "allgather automatic collective", (void*)allgather__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_allgatherv_description[] = { - {"default", "allgatherv default collective", (void*)allgatherv__default}, - {"GB", "allgatherv GB collective", (void*)allgatherv__GB}, - {"pair", "allgatherv pair collective", (void*)allgatherv__pair}, - {"ring", "allgatherv ring collective", (void*)allgatherv__ring}, - {"ompi", "allgatherv ompi collective", (void*)allgatherv__ompi}, - {"ompi_neighborexchange", "allgatherv ompi_neighborexchange collective", (void*)allgatherv__ompi_neighborexchange}, - {"ompi_bruck", "allgatherv ompi_bruck collective", (void*)allgatherv__ompi_bruck}, - {"mpich", "allgatherv mpich collective", (void*)allgatherv__mpich}, - {"mpich_rdb", "allgatherv mpich_rdb collective", (void*)allgatherv__mpich_rdb}, - {"mpich_ring", "allgatherv mpich_ring collective", (void*)allgatherv__mpich_ring}, - {"mvapich2", "allgatherv mvapich2 collective", (void*)allgatherv__mvapich2}, - {"impi", "allgatherv impi collective", (void*)allgatherv__impi}, - {"automatic", "allgatherv automatic collective", (void*)allgatherv__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_allreduce_description[] = { - {"default", "allreduce default collective", (void*)allreduce__default}, - {"lr", "allreduce lr collective", (void*)allreduce__lr}, - {"rab1", "allreduce rab1 collective", (void*)allreduce__rab1}, - {"rab2", "allreduce rab2 collective", (void*)allreduce__rab2}, - {"rab_rdb", "allreduce rab_rdb collective", (void*)allreduce__rab_rdb}, - {"rdb", "allreduce rdb collective", (void*)allreduce__rdb}, - {"smp_binomial", "allreduce smp_binomial collective", (void*)allreduce__smp_binomial}, - {"smp_binomial_pipeline", "allreduce smp_binomial_pipeline collective", (void*)allreduce__smp_binomial_pipeline}, - {"smp_rdb", "allreduce smp_rdb collective", (void*)allreduce__smp_rdb}, - {"smp_rsag", "allreduce smp_rsag collective", (void*)allreduce__smp_rsag}, - {"smp_rsag_lr", "allreduce smp_rsag_lr collective", (void*)allreduce__smp_rsag_lr}, - {"smp_rsag_rab", "allreduce smp_rsag_rab collective", (void*)allreduce__smp_rsag_rab}, - {"redbcast", "allreduce redbcast collective", (void*)allreduce__redbcast}, - {"ompi", "allreduce ompi collective", (void*)allreduce__ompi}, - {"ompi_ring_segmented", "allreduce ompi_ring_segmented collective", (void*)allreduce__ompi_ring_segmented}, - {"mpich", "allreduce mpich collective", (void*)allreduce__mpich}, - {"mvapich2", "allreduce mvapich2 collective", (void*)allreduce__mvapich2}, - {"mvapich2_rs", "allreduce mvapich2_rs collective", (void*)allreduce__mvapich2_rs}, - {"mvapich2_two_level", "allreduce mvapich2_two_level collective", (void*)allreduce__mvapich2_two_level}, - {"impi", "allreduce impi collective", (void*)allreduce__impi}, - {"rab", "allreduce rab collective", (void*)allreduce__rab}, - {"automatic", "allreduce automatic collective", (void*)allreduce__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_reduce_scatter_description[] = { - {"default", "reduce_scatter default collective", (void*)reduce_scatter__default}, - {"ompi", "reduce_scatter ompi collective", (void*)reduce_scatter__ompi}, - {"ompi_basic_recursivehalving", "reduce_scatter ompi_basic_recursivehalving collective", (void*)reduce_scatter__ompi_basic_recursivehalving}, - {"ompi_ring", "reduce_scatter ompi_ring collective", (void*)reduce_scatter__ompi_ring}, - {"mpich", "reduce_scatter mpich collective", (void*)reduce_scatter__mpich}, - {"mpich_pair", "reduce_scatter mpich_pair collective", (void*)reduce_scatter__mpich_pair}, - {"mpich_rdb", "reduce_scatter mpich_rdb collective", (void*)reduce_scatter__mpich_rdb}, - {"mpich_noncomm", "reduce_scatter mpich_noncomm collective", (void*)reduce_scatter__mpich_noncomm}, - {"mvapich2", "reduce_scatter mvapich2 collective", (void*)reduce_scatter__mvapich2}, - {"impi", "reduce_scatter impi collective", (void*)reduce_scatter__impi}, - {"automatic", "reduce_scatter automatic collective", (void*)reduce_scatter__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_scatter_description[] = { - {"default", "scatter default collective", (void*)scatter__default}, - {"ompi", "scatter ompi collective", (void*)scatter__ompi}, - {"ompi_basic_linear", "scatter ompi_basic_linear collective", (void*)scatter__ompi_basic_linear}, - {"ompi_binomial", "scatter ompi_binomial collective", (void*)scatter__ompi_binomial}, - {"mpich", "scatter mpich collective", (void*)scatter__mpich}, - {"mvapich2", "scatter mvapich2 collective", (void*)scatter__mvapich2}, - {"mvapich2_two_level_binomial", "scatter mvapich2_two_level_binomial collective", (void*)scatter__mvapich2_two_level_binomial}, - {"mvapich2_two_level_direct", "scatter mvapich2_two_level_direct collective", (void*)scatter__mvapich2_two_level_direct}, - {"impi", "scatter impi collective", (void*)scatter__impi}, - {"automatic", "scatter automatic collective", (void*)scatter__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_barrier_description[] = { - {"default", "barrier default collective", (void*)barrier__default}, - {"ompi", "barrier ompi collective", (void*)barrier__ompi}, - {"ompi_basic_linear", "barrier ompi_basic_linear collective", (void*)barrier__ompi_basic_linear}, - {"ompi_two_procs", "barrier ompi_two_procs collective", (void*)barrier__ompi_two_procs}, - {"ompi_tree", "barrier ompi_tree collective", (void*)barrier__ompi_tree}, - {"ompi_bruck", "barrier ompi_bruck collective", (void*)barrier__ompi_bruck}, - {"ompi_recursivedoubling", "barrier ompi_recursivedoubling collective", (void*)barrier__ompi_recursivedoubling}, - {"ompi_doublering", "barrier ompi_doublering collective", (void*)barrier__ompi_doublering}, - {"mpich_smp", "barrier mpich_smp collective", (void*)barrier__mpich_smp}, - {"mpich", "barrier mpich collective", (void*)barrier__mpich}, - {"mvapich2_pair", "barrier mvapich2_pair collective", (void*)barrier__mvapich2_pair}, - {"mvapich2", "barrier mvapich2 collective", (void*)barrier__mvapich2}, - {"impi", "barrier impi collective", (void*)barrier__impi}, - {"automatic", "barrier automatic collective", (void*)barrier__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_alltoall_description[] = { - {"default", "alltoall default collective", (void*)alltoall__default}, - {"2dmesh", "alltoall 2dmesh collective", (void*)alltoall__2dmesh}, - {"3dmesh", "alltoall 3dmesh collective", (void*)alltoall__3dmesh}, - {"basic_linear", "alltoall basic_linear collective", (void*)alltoall__basic_linear}, - {"bruck", "alltoall bruck collective", (void*)alltoall__bruck}, - {"pair", "alltoall pair collective", (void*)alltoall__pair}, - {"pair_rma", "alltoall pair_rma collective", (void*)alltoall__pair_rma}, - {"pair_light_barrier", "alltoall pair_light_barrier collective", (void*)alltoall__pair_light_barrier}, - {"pair_mpi_barrier", "alltoall pair_mpi_barrier collective", (void*)alltoall__pair_mpi_barrier}, - {"pair_one_barrier", "alltoall pair_one_barrier collective", (void*)alltoall__pair_one_barrier}, - {"rdb", "alltoall rdb collective", (void*)alltoall__rdb}, - {"ring", "alltoall ring collective", (void*)alltoall__ring}, - {"ring_light_barrier", "alltoall ring_light_barrier collective", (void*)alltoall__ring_light_barrier}, - {"ring_mpi_barrier", "alltoall ring_mpi_barrier collective", (void*)alltoall__ring_mpi_barrier}, - {"ring_one_barrier", "alltoall ring_one_barrier collective", (void*)alltoall__ring_one_barrier}, - {"mvapich2", "alltoall mvapich2 collective", (void*)alltoall__mvapich2}, - {"mvapich2_scatter_dest", "alltoall mvapich2_scatter_dest collective", (void*)alltoall__mvapich2_scatter_dest}, - {"ompi", "alltoall ompi collective", (void*)alltoall__ompi}, - {"mpich", "alltoall mpich collective", (void*)alltoall__mpich}, - {"impi", "alltoall impi collective", (void*)alltoall__impi}, - {"automatic", "alltoall automatic collective", (void*)alltoall__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_alltoallv_description[] = { - {"default", "alltoallv default collective", (void*)alltoallv__default}, - {"bruck", "alltoallv bruck collective", (void*)alltoallv__bruck}, - {"pair", "alltoallv pair collective", (void*)alltoallv__pair}, - {"pair_light_barrier", "alltoallv pair_light_barrier collective", (void*)alltoallv__pair_light_barrier}, - {"pair_mpi_barrier", "alltoallv pair_mpi_barrier collective", (void*)alltoallv__pair_mpi_barrier}, - {"pair_one_barrier", "alltoallv pair_one_barrier collective", (void*)alltoallv__pair_one_barrier}, - {"ring", "alltoallv ring collective", (void*)alltoallv__ring}, - {"ring_light_barrier", "alltoallv ring_light_barrier collective", (void*)alltoallv__ring_light_barrier}, - {"ring_mpi_barrier", "alltoallv ring_mpi_barrier collective", (void*)alltoallv__ring_mpi_barrier}, - {"ring_one_barrier", "alltoallv ring_one_barrier collective", (void*)alltoallv__ring_one_barrier}, - {"ompi", "alltoallv ompi collective", (void*)alltoallv__ompi}, - {"mpich", "alltoallv mpich collective", (void*)alltoallv__mpich}, - {"ompi_basic_linear", "alltoallv ompi_basic_linear collective", (void*)alltoallv__ompi_basic_linear}, - {"mvapich2", "alltoallv mvapich2 collective", (void*)alltoallv__mvapich2}, - {"impi", "alltoallv impi collective", (void*)alltoallv__impi}, - {"automatic", "alltoallv automatic collective", (void*)alltoallv__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_bcast_description[] = { - {"default", "bcast default collective", (void*)bcast__default}, - {"arrival_pattern_aware", "bcast arrival_pattern_aware collective", (void*)bcast__arrival_pattern_aware}, - {"arrival_pattern_aware_wait", "bcast arrival_pattern_aware_wait collective", (void*)bcast__arrival_pattern_aware_wait}, - {"arrival_scatter", "bcast arrival_scatter collective", (void*)bcast__arrival_scatter}, - {"binomial_tree", "bcast binomial_tree collective", (void*)bcast__binomial_tree}, - {"flattree", "bcast flattree collective", (void*)bcast__flattree}, - {"flattree_pipeline", "bcast flattree_pipeline collective", (void*)bcast__flattree_pipeline}, - {"NTSB", "bcast NTSB collective", (void*)bcast__NTSB}, - {"NTSL", "bcast NTSL collective", (void*)bcast__NTSL}, - {"NTSL_Isend", "bcast NTSL_Isend collective", (void*)bcast__NTSL_Isend}, - {"scatter_LR_allgather", "bcast scatter_LR_allgather collective", (void*)bcast__scatter_LR_allgather}, - {"scatter_rdb_allgather", "bcast scatter_rdb_allgather collective", (void*)bcast__scatter_rdb_allgather}, - {"SMP_binary", "bcast SMP_binary collective", (void*)bcast__SMP_binary}, - {"SMP_binomial", "bcast SMP_binomial collective", (void*)bcast__SMP_binomial}, - {"SMP_linear", "bcast SMP_linear collective", (void*)bcast__SMP_linear}, - {"ompi", "bcast ompi collective", (void*)bcast__ompi}, - {"ompi_split_bintree", "bcast ompi_split_bintree collective", (void*)bcast__ompi_split_bintree}, - {"ompi_pipeline", "bcast ompi_pipeline collective", (void*)bcast__ompi_pipeline}, - {"mpich", "bcast mpich collective", (void*)bcast__mpich}, - {"mvapich2", "bcast mvapich2 collective", (void*)bcast__mvapich2}, - {"mvapich2_inter_node", "bcast mvapich2_inter_node collective", (void*)bcast__mvapich2_inter_node}, - {"mvapich2_intra_node", "bcast mvapich2_intra_node collective", (void*)bcast__mvapich2_intra_node}, - {"mvapich2_knomial_intra_node", "bcast mvapich2_knomial_intra_node collective", (void*)bcast__mvapich2_knomial_intra_node}, - {"impi", "bcast impi collective", (void*)bcast__impi}, - {"automatic", "bcast automatic collective", (void*)bcast__automatic}, - {"", "", nullptr}}; -s_mpi_coll_description_t mpi_coll_reduce_description[] = { - {"default", "reduce default collective", (void*)reduce__default}, - {"arrival_pattern_aware", "reduce arrival_pattern_aware collective", (void*)reduce__arrival_pattern_aware}, - {"binomial", "reduce binomial collective", (void*)reduce__binomial}, - {"flat_tree", "reduce flat_tree collective", (void*)reduce__flat_tree}, - {"NTSL", "reduce NTSL collective", (void*)reduce__NTSL}, - {"scatter_gather", "reduce scatter_gather collective", (void*)reduce__scatter_gather}, - {"ompi", "reduce ompi collective", (void*)reduce__ompi}, - {"ompi_chain", "reduce ompi_chain collective", (void*)reduce__ompi_chain}, - {"ompi_pipeline", "reduce ompi_pipeline collective", (void*)reduce__ompi_pipeline}, - {"ompi_basic_linear", "reduce ompi_basic_linear collective", (void*)reduce__ompi_basic_linear}, - {"ompi_in_order_binary", "reduce ompi_in_order_binary collective", (void*)reduce__ompi_in_order_binary}, - {"ompi_binary", "reduce ompi_binary collective", (void*)reduce__ompi_binary}, - {"ompi_binomial", "reduce ompi_binomial collective", (void*)reduce__ompi_binomial}, - {"mpich", "reduce mpich collective", (void*)reduce__mpich}, - {"mvapich2", "reduce mvapich2 collective", (void*)reduce__mvapich2}, - {"mvapich2_knomial", "reduce mvapich2_knomial collective", (void*)reduce__mvapich2_knomial}, - {"mvapich2_two_level", "reduce mvapich2_two_level collective", (void*)reduce__mvapich2_two_level}, - {"impi", "reduce impi collective", (void*)reduce__impi}, - {"rab", "reduce rab collective", (void*)reduce__rab}, - {"automatic", "reduce automatic collective", (void*)reduce__automatic}, - {"", "", nullptr}}; +std::map> smpi_coll_descriptions( + {{std::string("gather"), + {{"default", "gather default collective", (void*)gather__default}, + {"ompi", "gather ompi collective", (void*)gather__ompi}, + {"ompi_basic_linear", "gather ompi_basic_linear collective", (void*)gather__ompi_basic_linear}, + {"ompi_binomial", "gather ompi_binomial collective", (void*)gather__ompi_binomial}, + {"ompi_linear_sync", "gather ompi_linear_sync collective", (void*)gather__ompi_linear_sync}, + {"mpich", "gather mpich collective", (void*)gather__mpich}, + {"mvapich2", "gather mvapich2 collective", (void*)gather__mvapich2}, + {"mvapich2_two_level", "gather mvapich2_two_level collective", (void*)gather__mvapich2_two_level}, + {"impi", "gather impi collective", (void*)gather__impi}, + {"automatic", "gather automatic collective", (void*)gather__automatic}}}, + + {"allgather", + {{"default", "allgather default collective", (void*)allgather__default}, + {"2dmesh", "allgather 2dmesh collective", (void*)allgather__2dmesh}, + {"3dmesh", "allgather 3dmesh collective", (void*)allgather__3dmesh}, + {"bruck", "allgather bruck collective", (void*)allgather__bruck}, + {"GB", "allgather GB collective", (void*)allgather__GB}, + {"loosely_lr", "allgather loosely_lr collective", (void*)allgather__loosely_lr}, + {"NTSLR", "allgather NTSLR collective", (void*)allgather__NTSLR}, + {"NTSLR_NB", "allgather NTSLR_NB collective", (void*)allgather__NTSLR_NB}, + {"pair", "allgather pair collective", (void*)allgather__pair}, + {"rdb", "allgather rdb collective", (void*)allgather__rdb}, + {"rhv", "allgather rhv collective", (void*)allgather__rhv}, + {"ring", "allgather ring collective", (void*)allgather__ring}, + {"SMP_NTS", "allgather SMP_NTS collective", (void*)allgather__SMP_NTS}, + {"smp_simple", "allgather smp_simple collective", (void*)allgather__smp_simple}, + {"spreading_simple", "allgather spreading_simple collective", (void*)allgather__spreading_simple}, + {"ompi", "allgather ompi collective", (void*)allgather__ompi}, + {"ompi_neighborexchange", "allgather ompi_neighborexchange collective", (void*)allgather__ompi_neighborexchange}, + {"mvapich2", "allgather mvapich2 collective", (void*)allgather__mvapich2}, + {"mvapich2_smp", "allgather mvapich2_smp collective", (void*)allgather__mvapich2_smp}, + {"mpich", "allgather mpich collective", (void*)allgather__mpich}, + {"impi", "allgather impi collective", (void*)allgather__impi}, + {"automatic", "allgather automatic collective", (void*)allgather__automatic}}}, + + {"allgatherv", + {{"default", "allgatherv default collective", (void*)allgatherv__default}, + {"GB", "allgatherv GB collective", (void*)allgatherv__GB}, + {"pair", "allgatherv pair collective", (void*)allgatherv__pair}, + {"ring", "allgatherv ring collective", (void*)allgatherv__ring}, + {"ompi", "allgatherv ompi collective", (void*)allgatherv__ompi}, + {"ompi_neighborexchange", "allgatherv ompi_neighborexchange collective", + (void*)allgatherv__ompi_neighborexchange}, + {"ompi_bruck", "allgatherv ompi_bruck collective", (void*)allgatherv__ompi_bruck}, + {"mpich", "allgatherv mpich collective", (void*)allgatherv__mpich}, + {"mpich_rdb", "allgatherv mpich_rdb collective", (void*)allgatherv__mpich_rdb}, + {"mpich_ring", "allgatherv mpich_ring collective", (void*)allgatherv__mpich_ring}, + {"mvapich2", "allgatherv mvapich2 collective", (void*)allgatherv__mvapich2}, + {"impi", "allgatherv impi collective", (void*)allgatherv__impi}, + {"automatic", "allgatherv automatic collective", (void*)allgatherv__automatic}}}, + + {"allreduce", + {{"default", "allreduce default collective", (void*)allreduce__default}, + {"lr", "allreduce lr collective", (void*)allreduce__lr}, + {"rab1", "allreduce rab1 collective", (void*)allreduce__rab1}, + {"rab2", "allreduce rab2 collective", (void*)allreduce__rab2}, + {"rab_rdb", "allreduce rab_rdb collective", (void*)allreduce__rab_rdb}, + {"rdb", "allreduce rdb collective", (void*)allreduce__rdb}, + {"smp_binomial", "allreduce smp_binomial collective", (void*)allreduce__smp_binomial}, + {"smp_binomial_pipeline", "allreduce smp_binomial_pipeline collective", (void*)allreduce__smp_binomial_pipeline}, + {"smp_rdb", "allreduce smp_rdb collective", (void*)allreduce__smp_rdb}, + {"smp_rsag", "allreduce smp_rsag collective", (void*)allreduce__smp_rsag}, + {"smp_rsag_lr", "allreduce smp_rsag_lr collective", (void*)allreduce__smp_rsag_lr}, + {"smp_rsag_rab", "allreduce smp_rsag_rab collective", (void*)allreduce__smp_rsag_rab}, + {"redbcast", "allreduce redbcast collective", (void*)allreduce__redbcast}, + {"ompi", "allreduce ompi collective", (void*)allreduce__ompi}, + {"ompi_ring_segmented", "allreduce ompi_ring_segmented collective", (void*)allreduce__ompi_ring_segmented}, + {"mpich", "allreduce mpich collective", (void*)allreduce__mpich}, + {"mvapich2", "allreduce mvapich2 collective", (void*)allreduce__mvapich2}, + {"mvapich2_rs", "allreduce mvapich2_rs collective", (void*)allreduce__mvapich2_rs}, + {"mvapich2_two_level", "allreduce mvapich2_two_level collective", (void*)allreduce__mvapich2_two_level}, + {"impi", "allreduce impi collective", (void*)allreduce__impi}, + {"rab", "allreduce rab collective", (void*)allreduce__rab}, + {"automatic", "allreduce automatic collective", (void*)allreduce__automatic}}}, + + {"reduce_scatter", + {{"default", "reduce_scatter default collective", (void*)reduce_scatter__default}, + {"ompi", "reduce_scatter ompi collective", (void*)reduce_scatter__ompi}, + {"ompi_basic_recursivehalving", "reduce_scatter ompi_basic_recursivehalving collective", + (void*)reduce_scatter__ompi_basic_recursivehalving}, + {"ompi_ring", "reduce_scatter ompi_ring collective", (void*)reduce_scatter__ompi_ring}, + {"mpich", "reduce_scatter mpich collective", (void*)reduce_scatter__mpich}, + {"mpich_pair", "reduce_scatter mpich_pair collective", (void*)reduce_scatter__mpich_pair}, + {"mpich_rdb", "reduce_scatter mpich_rdb collective", (void*)reduce_scatter__mpich_rdb}, + {"mpich_noncomm", "reduce_scatter mpich_noncomm collective", (void*)reduce_scatter__mpich_noncomm}, + {"mvapich2", "reduce_scatter mvapich2 collective", (void*)reduce_scatter__mvapich2}, + {"impi", "reduce_scatter impi collective", (void*)reduce_scatter__impi}, + {"automatic", "reduce_scatter automatic collective", (void*)reduce_scatter__automatic}}}, + + {"scatter", + {{"default", "scatter default collective", (void*)scatter__default}, + {"ompi", "scatter ompi collective", (void*)scatter__ompi}, + {"ompi_basic_linear", "scatter ompi_basic_linear collective", (void*)scatter__ompi_basic_linear}, + {"ompi_binomial", "scatter ompi_binomial collective", (void*)scatter__ompi_binomial}, + {"mpich", "scatter mpich collective", (void*)scatter__mpich}, + {"mvapich2", "scatter mvapich2 collective", (void*)scatter__mvapich2}, + {"mvapich2_two_level_binomial", "scatter mvapich2_two_level_binomial collective", + (void*)scatter__mvapich2_two_level_binomial}, + {"mvapich2_two_level_direct", "scatter mvapich2_two_level_direct collective", + (void*)scatter__mvapich2_two_level_direct}, + {"impi", "scatter impi collective", (void*)scatter__impi}, + {"automatic", "scatter automatic collective", (void*)scatter__automatic}}}, + + {"barrier", + {{"default", "barrier default collective", (void*)barrier__default}, + {"ompi", "barrier ompi collective", (void*)barrier__ompi}, + {"ompi_basic_linear", "barrier ompi_basic_linear collective", (void*)barrier__ompi_basic_linear}, + {"ompi_two_procs", "barrier ompi_two_procs collective", (void*)barrier__ompi_two_procs}, + {"ompi_tree", "barrier ompi_tree collective", (void*)barrier__ompi_tree}, + {"ompi_bruck", "barrier ompi_bruck collective", (void*)barrier__ompi_bruck}, + {"ompi_recursivedoubling", "barrier ompi_recursivedoubling collective", (void*)barrier__ompi_recursivedoubling}, + {"ompi_doublering", "barrier ompi_doublering collective", (void*)barrier__ompi_doublering}, + {"mpich_smp", "barrier mpich_smp collective", (void*)barrier__mpich_smp}, + {"mpich", "barrier mpich collective", (void*)barrier__mpich}, + {"mvapich2_pair", "barrier mvapich2_pair collective", (void*)barrier__mvapich2_pair}, + {"mvapich2", "barrier mvapich2 collective", (void*)barrier__mvapich2}, + {"impi", "barrier impi collective", (void*)barrier__impi}, + {"automatic", "barrier automatic collective", (void*)barrier__automatic}}}, + + {"alltoall", + {{"default", "alltoall default collective", (void*)alltoall__default}, + {"2dmesh", "alltoall 2dmesh collective", (void*)alltoall__2dmesh}, + {"3dmesh", "alltoall 3dmesh collective", (void*)alltoall__3dmesh}, + {"basic_linear", "alltoall basic_linear collective", (void*)alltoall__basic_linear}, + {"bruck", "alltoall bruck collective", (void*)alltoall__bruck}, + {"pair", "alltoall pair collective", (void*)alltoall__pair}, + {"pair_rma", "alltoall pair_rma collective", (void*)alltoall__pair_rma}, + {"pair_light_barrier", "alltoall pair_light_barrier collective", (void*)alltoall__pair_light_barrier}, + {"pair_mpi_barrier", "alltoall pair_mpi_barrier collective", (void*)alltoall__pair_mpi_barrier}, + {"pair_one_barrier", "alltoall pair_one_barrier collective", (void*)alltoall__pair_one_barrier}, + {"rdb", "alltoall rdb collective", (void*)alltoall__rdb}, + {"ring", "alltoall ring collective", (void*)alltoall__ring}, + {"ring_light_barrier", "alltoall ring_light_barrier collective", (void*)alltoall__ring_light_barrier}, + {"ring_mpi_barrier", "alltoall ring_mpi_barrier collective", (void*)alltoall__ring_mpi_barrier}, + {"ring_one_barrier", "alltoall ring_one_barrier collective", (void*)alltoall__ring_one_barrier}, + {"mvapich2", "alltoall mvapich2 collective", (void*)alltoall__mvapich2}, + {"mvapich2_scatter_dest", "alltoall mvapich2_scatter_dest collective", (void*)alltoall__mvapich2_scatter_dest}, + {"ompi", "alltoall ompi collective", (void*)alltoall__ompi}, + {"mpich", "alltoall mpich collective", (void*)alltoall__mpich}, + {"impi", "alltoall impi collective", (void*)alltoall__impi}, + {"automatic", "alltoall automatic collective", (void*)alltoall__automatic}}}, + + {"alltoallv", + {{"default", "alltoallv default collective", (void*)alltoallv__default}, + {"bruck", "alltoallv bruck collective", (void*)alltoallv__bruck}, + {"pair", "alltoallv pair collective", (void*)alltoallv__pair}, + {"pair_light_barrier", "alltoallv pair_light_barrier collective", (void*)alltoallv__pair_light_barrier}, + {"pair_mpi_barrier", "alltoallv pair_mpi_barrier collective", (void*)alltoallv__pair_mpi_barrier}, + {"pair_one_barrier", "alltoallv pair_one_barrier collective", (void*)alltoallv__pair_one_barrier}, + {"ring", "alltoallv ring collective", (void*)alltoallv__ring}, + {"ring_light_barrier", "alltoallv ring_light_barrier collective", (void*)alltoallv__ring_light_barrier}, + {"ring_mpi_barrier", "alltoallv ring_mpi_barrier collective", (void*)alltoallv__ring_mpi_barrier}, + {"ring_one_barrier", "alltoallv ring_one_barrier collective", (void*)alltoallv__ring_one_barrier}, + {"ompi", "alltoallv ompi collective", (void*)alltoallv__ompi}, + {"mpich", "alltoallv mpich collective", (void*)alltoallv__mpich}, + {"ompi_basic_linear", "alltoallv ompi_basic_linear collective", (void*)alltoallv__ompi_basic_linear}, + {"mvapich2", "alltoallv mvapich2 collective", (void*)alltoallv__mvapich2}, + {"impi", "alltoallv impi collective", (void*)alltoallv__impi}, + {"automatic", "alltoallv automatic collective", (void*)alltoallv__automatic}}}, + + {"bcast", + {{"default", "bcast default collective", (void*)bcast__default}, + {"arrival_pattern_aware", "bcast arrival_pattern_aware collective", (void*)bcast__arrival_pattern_aware}, + {"arrival_pattern_aware_wait", "bcast arrival_pattern_aware_wait collective", + (void*)bcast__arrival_pattern_aware_wait}, + {"arrival_scatter", "bcast arrival_scatter collective", (void*)bcast__arrival_scatter}, + {"binomial_tree", "bcast binomial_tree collective", (void*)bcast__binomial_tree}, + {"flattree", "bcast flattree collective", (void*)bcast__flattree}, + {"flattree_pipeline", "bcast flattree_pipeline collective", (void*)bcast__flattree_pipeline}, + {"NTSB", "bcast NTSB collective", (void*)bcast__NTSB}, + {"NTSL", "bcast NTSL collective", (void*)bcast__NTSL}, + {"NTSL_Isend", "bcast NTSL_Isend collective", (void*)bcast__NTSL_Isend}, + {"scatter_LR_allgather", "bcast scatter_LR_allgather collective", (void*)bcast__scatter_LR_allgather}, + {"scatter_rdb_allgather", "bcast scatter_rdb_allgather collective", (void*)bcast__scatter_rdb_allgather}, + {"SMP_binary", "bcast SMP_binary collective", (void*)bcast__SMP_binary}, + {"SMP_binomial", "bcast SMP_binomial collective", (void*)bcast__SMP_binomial}, + {"SMP_linear", "bcast SMP_linear collective", (void*)bcast__SMP_linear}, + {"ompi", "bcast ompi collective", (void*)bcast__ompi}, + {"ompi_split_bintree", "bcast ompi_split_bintree collective", (void*)bcast__ompi_split_bintree}, + {"ompi_pipeline", "bcast ompi_pipeline collective", (void*)bcast__ompi_pipeline}, + {"mpich", "bcast mpich collective", (void*)bcast__mpich}, + {"mvapich2", "bcast mvapich2 collective", (void*)bcast__mvapich2}, + {"mvapich2_inter_node", "bcast mvapich2_inter_node collective", (void*)bcast__mvapich2_inter_node}, + {"mvapich2_intra_node", "bcast mvapich2_intra_node collective", (void*)bcast__mvapich2_intra_node}, + {"mvapich2_knomial_intra_node", "bcast mvapich2_knomial_intra_node collective", + (void*)bcast__mvapich2_knomial_intra_node}, + {"impi", "bcast impi collective", (void*)bcast__impi}, + {"automatic", "bcast automatic collective", (void*)bcast__automatic}}}, + + {"reduce", + {{"default", "reduce default collective", (void*)reduce__default}, + {"arrival_pattern_aware", "reduce arrival_pattern_aware collective", (void*)reduce__arrival_pattern_aware}, + {"binomial", "reduce binomial collective", (void*)reduce__binomial}, + {"flat_tree", "reduce flat_tree collective", (void*)reduce__flat_tree}, + {"NTSL", "reduce NTSL collective", (void*)reduce__NTSL}, + {"scatter_gather", "reduce scatter_gather collective", (void*)reduce__scatter_gather}, + {"ompi", "reduce ompi collective", (void*)reduce__ompi}, + {"ompi_chain", "reduce ompi_chain collective", (void*)reduce__ompi_chain}, + {"ompi_pipeline", "reduce ompi_pipeline collective", (void*)reduce__ompi_pipeline}, + {"ompi_basic_linear", "reduce ompi_basic_linear collective", (void*)reduce__ompi_basic_linear}, + {"ompi_in_order_binary", "reduce ompi_in_order_binary collective", (void*)reduce__ompi_in_order_binary}, + {"ompi_binary", "reduce ompi_binary collective", (void*)reduce__ompi_binary}, + {"ompi_binomial", "reduce ompi_binomial collective", (void*)reduce__ompi_binomial}, + {"mpich", "reduce mpich collective", (void*)reduce__mpich}, + {"mvapich2", "reduce mvapich2 collective", (void*)reduce__mvapich2}, + {"mvapich2_knomial", "reduce mvapich2_knomial collective", (void*)reduce__mvapich2_knomial}, + {"mvapich2_two_level", "reduce mvapich2_two_level collective", (void*)reduce__mvapich2_two_level}, + {"impi", "reduce impi collective", (void*)reduce__impi}, + {"rab", "reduce rab collective", (void*)reduce__rab}, + {"automatic", "reduce automatic collective", (void*)reduce__automatic}}}}); // Needed by the automatic selector weird implementation -s_mpi_coll_description_t* colls::get_smpi_coll_description(const char* name, int rank) -{ - if (strcmp(name, "gather") == 0) - return &mpi_coll_gather_description[rank]; - if (strcmp(name, "allgather") == 0) - return &mpi_coll_allgather_description[rank]; - if (strcmp(name, "allgatherv") == 0) - return &mpi_coll_allgatherv_description[rank]; - if (strcmp(name, "allreduce") == 0) - return &mpi_coll_allreduce_description[rank]; - if (strcmp(name, "reduce_scatter") == 0) - return &mpi_coll_reduce_scatter_description[rank]; - if (strcmp(name, "scatter") == 0) - return &mpi_coll_scatter_description[rank]; - if (strcmp(name, "barrier") == 0) - return &mpi_coll_barrier_description[rank]; - if (strcmp(name, "alltoall") == 0) - return &mpi_coll_alltoall_description[rank]; - if (strcmp(name, "alltoallv") == 0) - return &mpi_coll_alltoallv_description[rank]; - if (strcmp(name, "bcast") == 0) - return &mpi_coll_bcast_description[rank]; - if (strcmp(name, "reduce") == 0) - return &mpi_coll_reduce_description[rank]; - XBT_INFO("You requested an unknown collective: %s", name); - return nullptr; -} - -/** Displays the long description of all registered models, and quit */ -void colls::coll_help(const char* category, s_mpi_coll_description_t* table) +std::vector* colls::get_smpi_coll_descriptions(const std::string& name) { - XBT_WARN("Long description of the %s models accepted by this simulator:\n", category); - for (int i = 0; not table[i].name.empty(); i++) - XBT_WARN(" %s: %s\n", table[i].name.c_str(), table[i].description.c_str()); + if (smpi_coll_descriptions.find(name) == smpi_coll_descriptions.end()) + xbt_die("No collective named %s. This is a bug.", name.c_str()); + return &smpi_coll_descriptions[name]; } -int colls::find_coll_description(s_mpi_coll_description_t* table, const std::string& name, const char* desc) +static s_mpi_coll_description_t* find_coll_description(const std::string& collective, const std::string& algo) { - for (int i = 0; not table[i].name.empty(); i++) - if (name == table[i].name) { - if (table[i].name != "default") - XBT_INFO("Switch to algorithm %s for collective %s",table[i].name.c_str(),desc); - return i; + std::vector* table = colls::get_smpi_coll_descriptions(collective); + if (table->empty()) + xbt_die("No registered algorithm for collective '%s'! This is a bug.", collective.c_str()); + + for (unsigned long i = 0; i < table->size(); i++) { + auto desc = &table->at(i); + if (algo == desc->name) { + if (desc->name != "default") + XBT_INFO("Switch to algorithm %s for collective %s", desc->name.c_str(), collective.c_str()); + return desc; } + } - if (table[0].name.empty()) - xbt_die("No collective is valid for '%s'! This is a bug.", name.c_str()); - std::string name_list = table[0].name; - for (int i = 1; not table[i].name.empty(); i++) - name_list = name_list + ", " + table[i].name; - - xbt_die("Collective '%s' is invalid! Valid collectives are: %s.", name.c_str(), name_list.c_str()); - return -1; + std::string name_list = table->at(0).name; + for (unsigned long i = 1; i < table->size(); i++) + name_list = name_list + ", " + table->at(i).name; + xbt_die("Collective '%s' has no algorithm '%s'! Valid algorithms: %s.", collective.c_str(), algo.c_str(), name_list.c_str()); } int (*colls::gather)(const void* send_buff, int send_count, MPI_Datatype send_type, void* recv_buff, int recv_count, @@ -307,8 +287,8 @@ void (*colls::smpi_coll_cleanup_callback)(); #define COLL_SETTER(cat, ret, args, args2) \ void colls::_XBT_CONCAT(set_, cat)(const std::string& name) \ { \ - int id = find_coll_description(_XBT_CONCAT3(mpi_coll_, cat, _description), name, _XBT_STRINGIFY(cat)); \ - cat = reinterpret_cast(_XBT_CONCAT3(mpi_coll_, cat, _description)[id].coll); \ + auto desc = find_coll_description(_XBT_STRINGIFY(cat), name); \ + cat = reinterpret_cast(desc->coll); \ if (cat == nullptr) \ xbt_die("Collective " _XBT_STRINGIFY(cat) " set to nullptr!"); \ } diff --git a/src/smpi/include/smpi_coll.hpp b/src/smpi/include/smpi_coll.hpp index dd8faa759c..b5e2479622 100644 --- a/src/smpi/include/smpi_coll.hpp +++ b/src/smpi/include/smpi_coll.hpp @@ -58,10 +58,8 @@ struct s_mpi_coll_description_t { }; namespace colls { -XBT_PUBLIC void coll_help(const char* category, s_mpi_coll_description_t* table); -XBT_PUBLIC int find_coll_description(s_mpi_coll_description_t* table, const std::string& name, const char* desc); void set_collectives(); -XBT_PUBLIC s_mpi_coll_description_t* get_smpi_coll_description(const char* name, int rank); +XBT_PUBLIC std::vector* get_smpi_coll_descriptions(const std::string& name); void set_gather(const std::string& name); void set_allgather(const std::string& name); -- 2.20.1