Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
smpi colls: use C++ containers instead of nul-terminted C vectors
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Sat, 23 Nov 2019 17:15:08 +0000 (18:15 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Sat, 23 Nov 2019 18:43:59 +0000 (19:43 +0100)
src/smpi/colls/smpi_automatic_selector.cpp
src/smpi/colls/smpi_coll.cpp
src/smpi/include/smpi_coll.hpp

index 0f7ff3c..8e816ca 100644 (file)
   {                                                                                                                    \
     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 =                                                                              \
           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;                                                            \
   }
 
index 36fbd53..827d06d 100644 (file)
 #include "smpi_request.hpp"
 #include "xbt/config.hpp"
 
+#include <map>
+
 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<std::string, std::vector<s_mpi_coll_description_t>> 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<s_mpi_coll_description_t>* 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<s_mpi_coll_description_t>* 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<ret(*) args>(_XBT_CONCAT3(mpi_coll_, cat, _description)[id].coll);                       \
+    auto desc = find_coll_description(_XBT_STRINGIFY(cat), name);                                                      \
+    cat       = reinterpret_cast<ret(*) args>(desc->coll);                                                             \
     if (cat == nullptr)                                                                                                \
       xbt_die("Collective " _XBT_STRINGIFY(cat) " set to nullptr!");                                                   \
   }
index dd8faa7..b5e2479 100644 (file)
@@ -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<s_mpi_coll_description_t>* get_smpi_coll_descriptions(const std::string& name);
 
 void set_gather(const std::string& name);
 void set_allgather(const std::string& name);