Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove explicit conversion to std::string when it's not required.
[simgrid.git] / src / smpi / colls / smpi_coll.cpp
index 827d06d..973dd0b 100644 (file)
@@ -1,6 +1,6 @@
 /* smpi_coll.c -- various optimized routing for collectives                 */
 
-/* Copyright (c) 2009-2019. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2009-2022. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, "Logging specific to SMPI collectives.");
 
-namespace simgrid {
-namespace smpi {
+namespace simgrid::smpi {
 
-std::map<std::string, std::vector<s_mpi_coll_description_t>> smpi_coll_descriptions(
-    {{std::string("gather"),
+std::map<std::string, std::vector<s_mpi_coll_description_t>, std::less<>> smpi_coll_descriptions(
+    {{"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},
@@ -103,6 +102,7 @@ std::map<std::string, std::vector<s_mpi_coll_description_t>> smpi_coll_descripti
        {"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},
+       {"ompi_butterfly", "reduce_scatter ompi_butterfly collective", (void*)reduce_scatter__ompi_butterfly},
        {"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},
@@ -115,6 +115,7 @@ std::map<std::string, std::vector<s_mpi_coll_description_t>> smpi_coll_descripti
       {{"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_linear_nb", "scatter ompi_linear nonblocking collective", (void*)scatter__ompi_linear_nb},
        {"ompi_binomial", "scatter ompi_binomial collective", (void*)scatter__ompi_binomial},
        {"mpich", "scatter mpich collective", (void*)scatter__mpich},
        {"mvapich2", "scatter mvapich2 collective", (void*)scatter__mvapich2},
@@ -236,23 +237,21 @@ std::map<std::string, std::vector<s_mpi_coll_description_t>> smpi_coll_descripti
 // Needed by the automatic selector weird implementation
 std::vector<s_mpi_coll_description_t>* colls::get_smpi_coll_descriptions(const std::string& name)
 {
-  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];
+  auto iter = smpi_coll_descriptions.find(name);
+  xbt_assert(iter != smpi_coll_descriptions.end(), "No collective named %s. This is a bug.", name.c_str());
+  return &iter->second;
 }
 
 static s_mpi_coll_description_t* find_coll_description(const std::string& collective, const std::string& algo)
 {
   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;
+  xbt_assert(not table->empty(), "No registered algorithm for collective '%s'! This is a bug.", collective.c_str());
+
+  for (auto& desc : *table) {
+    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;
     }
   }
 
@@ -289,8 +288,7 @@ void (*colls::smpi_coll_cleanup_callback)();
   {                                                                                                                    \
     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!");                                                   \
+    xbt_assert(cat != nullptr, "Collective " _XBT_STRINGIFY(cat) " set to nullptr!");                                  \
   }
 COLL_APPLY(COLL_SETTER, COLL_GATHER_SIG, "")
 COLL_APPLY(COLL_SETTER,COLL_ALLGATHER_SIG,"")
@@ -360,8 +358,8 @@ int colls::scan(const void* sendbuf, void* recvbuf, int count, MPI_Datatype data
   Datatype::copy(sendbuf, count, datatype, recvbuf, count, datatype);
 
   // Send/Recv buffers to/from others
-  MPI_Request* requests = new MPI_Request[size - 1];
-  unsigned char** tmpbufs = new unsigned char*[rank];
+  auto* requests = new MPI_Request[size - 1];
+  auto** tmpbufs = new unsigned char*[rank];
   int index = 0;
   for (int other = 0; other < rank; other++) {
     tmpbufs[index] = smpi_get_tmp_sendbuffer(count * dataext);
@@ -382,7 +380,7 @@ int colls::scan(const void* sendbuf, void* recvbuf, int count, MPI_Datatype data
         break;
       }
       if(index < rank) {
-        // #Request is below rank: it's a irecv
+        // #Request is below rank: it's an irecv
         op->apply( tmpbufs[index], recvbuf, &count, datatype);
       }
     }
@@ -418,8 +416,8 @@ int colls::exscan(const void* sendbuf, void* recvbuf, int count, MPI_Datatype da
   datatype->extent(&lb, &dataext);
 
   // Send/Recv buffers to/from others
-  MPI_Request* requests = new MPI_Request[size - 1];
-  unsigned char** tmpbufs = new unsigned char*[rank];
+  auto* requests = new MPI_Request[size - 1];
+  auto** tmpbufs = new unsigned char*[rank];
   int index = 0;
   for (int other = 0; other < rank; other++) {
     tmpbufs[index] = smpi_get_tmp_sendbuffer(count * dataext);
@@ -444,7 +442,7 @@ int colls::exscan(const void* sendbuf, void* recvbuf, int count, MPI_Datatype da
           Datatype::copy(tmpbufs[index], count, datatype, recvbuf, count, datatype);
           recvbuf_is_empty=0;
         } else
-          // #Request is below rank: it's a irecv
+          // #Request is below rank: it's an irecv
           op->apply( tmpbufs[index], recvbuf, &count, datatype);
       }
     }
@@ -483,5 +481,4 @@ int colls::alltoallw(const void* sendbuf, const int* sendcounts, const int* send
   return Request::wait(&request, MPI_STATUS_IGNORE);
 }
 
-}
-}
+} // namespace simgrid::smpi