Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Apply the default settings of 'smpi/buffering' too
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index 2019b2c..5621fb0 100644 (file)
 #include <fstream>
 #include <sys/stat.h>
 
+#if SIMGRID_HAVE_MC
+#include "src/mc/mc_config.hpp"
+#endif
+
 #if SG_HAVE_SENDFILE
 #include <sys/sendfile.h>
 #endif
@@ -118,6 +122,8 @@ simgrid::smpi::ActorExt* smpi_process()
 
 simgrid::smpi::ActorExt* smpi_process_remote(simgrid::s4u::ActorPtr actor)
 {
+  if (actor.get() == nullptr)
+    return nullptr;
   return process_data.at(actor.get());
 }
 
@@ -129,11 +135,6 @@ MPI_Info smpi_process_info_env(){
   return smpi_process()->info_env();
 }
 
-void smpi_process_init(int*, char***)
-{
-  simgrid::smpi::ActorExt::init();
-}
-
 void * smpi_process_get_user_data(){
   return simgrid::s4u::Actor::self()->get_impl()->get_user_data();
 }
@@ -227,9 +228,21 @@ void smpi_comm_null_copy_buffer_callback(simgrid::kernel::activity::CommImpl*, v
 
 static void smpi_check_options()
 {
-  //check correctness of MPI parameters
+#if SIMGRID_HAVE_MC
+  if (MC_is_active()) {
+    if (_sg_mc_buffering == "zero")
+      simgrid::config::set_value<int>("smpi/send-is-detached-thresh", 0);
+    else if (_sg_mc_buffering == "infty")
+      simgrid::config::set_value<int>("smpi/send-is-detached-thresh", INT_MAX);
+    else
+      THROW_IMPOSSIBLE;
+  }
+#endif
 
   xbt_assert(simgrid::config::get_value<int>("smpi/async-small-thresh") <=
+                 simgrid::config::get_value<int>("smpi/send-is-detached-thresh"),
+             "smpi/async-small-thresh (=%d) should be smaller or equal to smpi/send-is-detached-thresh (=%d)",
+             simgrid::config::get_value<int>("smpi/async-small-thresh"),
              simgrid::config::get_value<int>("smpi/send-is-detached-thresh"));
 
   if (simgrid::config::is_default("smpi/host-speed") && not MC_is_active()) {
@@ -247,37 +260,11 @@ static void smpi_check_options()
 }
 
 int smpi_enabled() {
-  return not process_data.empty();
+  return MPI_COMM_WORLD != MPI_COMM_UNINITIALIZED;
 }
 
-void smpi_global_init()
+static void smpi_init_papi()
 {
-  if (not MC_is_active()) {
-    global_timer = xbt_os_timer_new();
-    xbt_os_walltimer_start(global_timer);
-  }
-
-  std::string filename = simgrid::config::get_value<std::string>("smpi/comp-adjustment-file");
-  if (not filename.empty()) {
-    std::ifstream fstream(filename);
-    if (not fstream.is_open()) {
-      xbt_die("Could not open file %s. Does it exist?", filename.c_str());
-    }
-
-    std::string line;
-    typedef boost::tokenizer< boost::escaped_list_separator<char>> Tokenizer;
-    std::getline(fstream, line); // Skip the header line
-    while (std::getline(fstream, line)) {
-      Tokenizer tok(line);
-      Tokenizer::iterator it  = tok.begin();
-      Tokenizer::iterator end = std::next(tok.begin());
-
-      std::string location = *it;
-      boost::trim(location);
-      location2speedup.insert(std::pair<std::string, double>(location, std::stod(*end)));
-    }
-  }
-
 #if HAVE_PAPI
   // This map holds for each computation unit (such as "default" or "process1" etc.)
   // the configuration as given by the user (counter data as a pair of (counter_name, counter_counter))
@@ -343,27 +330,6 @@ void smpi_global_init()
 #endif
 }
 
-void smpi_global_destroy()
-{
-  smpi_bench_destroy();
-  smpi_shared_destroy();
-  smpi_deployment_cleanup_instances();
-
-  if (simgrid::smpi::Colls::smpi_coll_cleanup_callback != nullptr)
-    simgrid::smpi::Colls::smpi_coll_cleanup_callback();
-
-  MPI_COMM_WORLD = MPI_COMM_NULL;
-
-  if (not MC_is_active()) {
-    xbt_os_timer_free(global_timer);
-  }
-
-  if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
-    smpi_destroy_global_memory_segments();
-  if(simgrid::smpi::F2C::lookup() != nullptr)
-    simgrid::smpi::F2C::delete_lookup();
-}
-
 static void smpi_init_options(){
   // return if already called
   if (smpi_cpu_threshold > -1)
@@ -432,7 +398,6 @@ static int smpi_run_entry_point(const F& entry_point, const std::string& executa
   args4argv->push_back(nullptr);
   char** argv = args4argv->data();
 
-  simgrid::smpi::ActorExt::init();
 #if SMPI_IFORT
   for_rtl_init_ (&argc, argv);
 #elif SMPI_FLANG
@@ -602,9 +567,7 @@ static void smpi_init_privatization_dlopen(const std::string& executable)
           smpi_copy_file(libpath, target_lib, fdin_size2);
 
           std::string sedcommand = "sed -i -e 's/" + libname + "/" + target_lib + "/g' " + target_executable;
-          int ret                = system(sedcommand.c_str());
-          if (ret != 0)
-            xbt_die("error while applying sed command %s \n", sedcommand.c_str());
+          xbt_assert(system(sedcommand.c_str()) == 0, "error while applying sed command %s \n", sedcommand.c_str());
         }
       }
 
@@ -617,11 +580,11 @@ static void smpi_init_privatization_dlopen(const std::string& executable)
         for (const std::string& target_lib : target_libs)
           unlink(target_lib.c_str());
       }
-      if (handle == nullptr)
-        xbt_die("dlopen failed: %s (errno: %d -- %s)", dlerror(), saved_errno, strerror(saved_errno));
+      xbt_assert(handle != nullptr, "dlopen failed: %s (errno: %d -- %s)", dlerror(), saved_errno,
+                 strerror(saved_errno));
+
       smpi_entry_point_type entry_point = smpi_resolve_function(handle);
-      if (not entry_point)
-        xbt_die("Could not resolve entry point");
+      xbt_assert(entry_point, "Could not resolve entry point");
       smpi_run_entry_point(entry_point, executable, args);
     });
   };
@@ -631,13 +594,14 @@ static void smpi_init_privatization_no_dlopen(const std::string& executable)
 {
   if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
     smpi_prepare_global_memory_segment();
+
   // Load the dynamic library and resolve the entry point:
   void* handle = dlopen(executable.c_str(), RTLD_LAZY | RTLD_LOCAL);
-  if (handle == nullptr)
-    xbt_die("dlopen failed for %s: %s (errno: %d -- %s)", executable.c_str(), dlerror(), errno, strerror(errno));
+  xbt_assert(handle != nullptr, "dlopen failed for %s: %s (errno: %d -- %s)", executable.c_str(), dlerror(), errno,
+             strerror(errno));
   smpi_entry_point_type entry_point = smpi_resolve_function(handle);
-  if (not entry_point)
-    xbt_die("main not found in %s", executable.c_str());
+  xbt_assert(entry_point, "main not found in %s", executable.c_str());
+
   if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
     smpi_backup_global_memory_segment();
 
@@ -700,7 +664,7 @@ int smpi_main(const char* executable, int argc, char* argv[])
       "You may want to use sampling functions or trace replay to reduce this.");
     }
   }
-  smpi_global_destroy();
+  SMPI_finalize();
 
   return smpi_exit_status;
 }
@@ -709,10 +673,11 @@ int smpi_main(const char* executable, int argc, char* argv[])
 void SMPI_init(){
   simgrid::s4u::Actor::on_creation.connect([](simgrid::s4u::Actor& actor) {
     if (not actor.is_daemon()) {
-      process_data.insert({&actor, new simgrid::smpi::ActorExt(&actor, nullptr)});
+      process_data.insert({&actor, new simgrid::smpi::ActorExt(&actor)});
     }
   });
   simgrid::s4u::Actor::on_destruction.connect([](simgrid::s4u::Actor const& actor) {
+    XBT_DEBUG("Delete the extension of actor %s", actor.get_cname());
     auto it = process_data.find(&actor);
     if (it != process_data.end()) {
       delete it->second;
@@ -723,16 +688,56 @@ void SMPI_init(){
       [](simgrid::s4u::Host& host) { host.extension_set(new simgrid::smpi::Host(&host)); });
 
   smpi_init_options();
-  smpi_global_init();
+  if (not MC_is_active()) {
+    global_timer = xbt_os_timer_new();
+    xbt_os_walltimer_start(global_timer);
+  }
+
+  std::string filename = simgrid::config::get_value<std::string>("smpi/comp-adjustment-file");
+  if (not filename.empty()) {
+    std::ifstream fstream(filename);
+    xbt_assert(fstream.is_open(), "Could not open file %s. Does it exist?", filename.c_str());
+
+    std::string line;
+    typedef boost::tokenizer<boost::escaped_list_separator<char>> Tokenizer;
+    std::getline(fstream, line); // Skip the header line
+    while (std::getline(fstream, line)) {
+      Tokenizer tok(line);
+      Tokenizer::iterator it  = tok.begin();
+      Tokenizer::iterator end = std::next(tok.begin());
+
+      std::string location = *it;
+      boost::trim(location);
+      location2speedup.insert(std::pair<std::string, double>(location, std::stod(*end)));
+    }
+  }
+  smpi_init_papi();
   smpi_check_options();
 }
 
-void SMPI_finalize(){
-  smpi_global_destroy();
+void SMPI_finalize()
+{
+  smpi_bench_destroy();
+  smpi_shared_destroy();
+  smpi_deployment_cleanup_instances();
+
+  if (simgrid::smpi::Colls::smpi_coll_cleanup_callback != nullptr)
+    simgrid::smpi::Colls::smpi_coll_cleanup_callback();
+
+  MPI_COMM_WORLD = MPI_COMM_NULL;
+
+  if (not MC_is_active()) {
+    xbt_os_timer_free(global_timer);
+  }
+
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP)
+    smpi_destroy_global_memory_segments();
+  if (simgrid::smpi::F2C::lookup() != nullptr)
+    simgrid::smpi::F2C::delete_lookup();
 }
 
 void smpi_mpi_init() {
   smpi_init_fortran_types();
   if(smpi_init_sleep > 0)
-    simcall_process_sleep(smpi_init_sleep);
+    simgrid::s4u::this_actor::sleep_for(smpi_init_sleep);
 }