Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use enum class for smpi privatization strategies.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Fri, 30 Mar 2018 20:16:44 +0000 (22:16 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Sat, 31 Mar 2018 16:51:47 +0000 (18:51 +0200)
12 files changed:
src/mc/Session.cpp
src/mc/remote/Client.cpp
src/simix/smx_global.cpp
src/smpi/include/private.hpp
src/smpi/internals/smpi_bench.cpp
src/smpi/internals/smpi_global.cpp
src/smpi/internals/smpi_memory.cpp
src/smpi/internals/smpi_process.cpp
src/smpi/mpi/smpi_comm.cpp
src/smpi/mpi/smpi_datatype.cpp
src/smpi/mpi/smpi_op.cpp
src/smpi/mpi/smpi_request.cpp

index 97834f1..dcff662 100644 (file)
@@ -88,7 +88,7 @@ Session::Session(pid_t pid, int socket)
 {
   std::unique_ptr<simgrid::mc::RemoteClient> process(new simgrid::mc::RemoteClient(pid, socket));
   // TODO, automatic detection of the config from the process
-  process->privatized(smpi_privatize_global_variables != SMPI_PRIVATIZE_NONE);
+  process->privatized(smpi_privatize_global_variables != SmpiPrivStrategies::None);
   modelChecker_ = std::unique_ptr<ModelChecker>(
     new simgrid::mc::ModelChecker(std::move(process)));
   xbt_assert(mc_model_checker == nullptr);
index f515ae4..9c741c4 100644 (file)
@@ -258,7 +258,7 @@ void Client::declareStack(void* stack, size_t size, smx_actor_t process, ucontex
   region.size    = size;
   region.block   = ((char*)stack - (char*)heap->heapbase) / BLOCKSIZE + 1;
 #if HAVE_SMPI
-  if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP && process)
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap && process)
     region.process_index = process->pid - 1;
   else
 #endif
index be1826f..6664cfa 100644 (file)
@@ -103,7 +103,7 @@ static void segvhandler(int signum, siginfo_t* siginfo, void* /*context*/)
   } else  if (siginfo->si_signo == SIGSEGV) {
     fprintf(stderr, "Segmentation fault.\n");
 #if HAVE_SMPI
-    if (smpi_enabled() && smpi_privatize_global_variables == SMPI_PRIVATIZE_NONE) {
+    if (smpi_enabled() && smpi_privatize_global_variables == SmpiPrivStrategies::None) {
 #if HAVE_PRIVATIZATION
       fprintf(stderr, "Try to enable SMPI variable privatization with --cfg=smpi/privatization:yes.\n");
 #else
index 7eebf7a..b5edb7a 100644 (file)
@@ -437,13 +437,8 @@ extern "C" {
 XBT_PUBLIC smpi_trace_call_location_t* smpi_trace_get_call_location();
 }
 
-enum smpi_priv_strategies {
-  SMPI_PRIVATIZE_NONE    = 0,
-  SMPI_PRIVATIZE_MMAP    = 1,
-  SMPI_PRIVATIZE_DLOPEN  = 2,
-  SMPI_PRIVATIZE_DEFAULT = SMPI_PRIVATIZE_DLOPEN
-};
+enum class SmpiPrivStrategies { None = 0, Mmap = 1, Dlopen = 2, Default = Dlopen };
 
-extern XBT_PRIVATE int smpi_privatize_global_variables;
+extern XBT_PRIVATE SmpiPrivStrategies smpi_privatize_global_variables;
 
 #endif
index 5f8f451..54736a6 100644 (file)
@@ -79,7 +79,7 @@ void smpi_execute_benched(double duration)
 
 void smpi_bench_begin()
 {
-  if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
 
index b52f69a..99323b6 100644 (file)
@@ -189,7 +189,8 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b
   auto private_blocks = merge_private_blocks(src_private_blocks, dst_private_blocks);
   check_blocks(private_blocks, buff_size);
   void* tmpbuff=buff;
-  if ((smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) && (static_cast<char*>(buff) >= smpi_data_exe_start) &&
+  if ((smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) &&
+      (static_cast<char*>(buff) >= smpi_data_exe_start) &&
       (static_cast<char*>(buff) < smpi_data_exe_start + smpi_data_exe_size)) {
     XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
     smpi_switch_data_segment(comm->src_proc->iface());
@@ -197,7 +198,7 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b
     memcpy_private(tmpbuff, buff, private_blocks);
   }
 
-  if ((smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) && ((char*)comm->dst_buff >= smpi_data_exe_start) &&
+  if ((smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) && ((char*)comm->dst_buff >= smpi_data_exe_start) &&
       ((char*)comm->dst_buff < smpi_data_exe_start + smpi_data_exe_size)) {
     XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
     smpi_switch_data_segment(comm->dst_proc->iface());
@@ -355,7 +356,7 @@ void smpi_global_destroy()
     xbt_os_timer_free(global_timer);
   }
 
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP)
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap)
     smpi_destroy_global_memory_segments();
   smpi_free_static();
 }
@@ -371,21 +372,21 @@ static void smpi_init_options(){
   xbt_assert(smpi_host_speed >= 0, "You're trying to set the host_speed to a negative value (%f)", smpi_host_speed);
   std::string smpi_privatize_option                = xbt_cfg_get_string("smpi/privatization");
   if (smpi_privatize_option == "no" || smpi_privatize_option == "0")
-    smpi_privatize_global_variables = SMPI_PRIVATIZE_NONE;
+    smpi_privatize_global_variables = SmpiPrivStrategies::None;
   else if (smpi_privatize_option == "yes" || smpi_privatize_option == "1")
-    smpi_privatize_global_variables = SMPI_PRIVATIZE_DEFAULT;
+    smpi_privatize_global_variables = SmpiPrivStrategies::Default;
   else if (smpi_privatize_option == "mmap")
-    smpi_privatize_global_variables = SMPI_PRIVATIZE_MMAP;
+    smpi_privatize_global_variables = SmpiPrivStrategies::Mmap;
   else if (smpi_privatize_option == "dlopen")
-    smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
+    smpi_privatize_global_variables = SmpiPrivStrategies::Dlopen;
   else
     xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option.c_str());
 
 #if defined(__FreeBSD__)
-    if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) {
-      XBT_INFO("mmap privatization is broken on FreeBSD, switching to dlopen privatization instead.");
-      smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN;
-    }
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+    XBT_INFO("mmap privatization is broken on FreeBSD, switching to dlopen privatization instead.");
+    smpi_privatize_global_variables = SmpiPrivStrategies::Dlopen;
+  }
 #endif
 
     if (smpi_cpu_threshold < 0)
@@ -475,7 +476,7 @@ int smpi_main(const char* executable, int argc, char *argv[])
   SIMIX_comm_set_copy_data_callback(smpi_comm_copy_buffer_callback);
 
   smpi_init_options();
-  if (smpi_privatize_global_variables == SMPI_PRIVATIZE_DLOPEN) {
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Dlopen) {
 
     std::string executable_copy = executable;
 
@@ -619,7 +620,7 @@ void SMPI_init(){
   smpi_check_options();
   TRACE_smpi_alloc();
   simgrid::s4u::onSimulationEnd.connect(TRACE_smpi_release);
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP)
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap)
     smpi_backup_global_memory_segment();
 }
 
index e704823..a6ea8dd 100644 (file)
@@ -30,7 +30,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_memory, smpi, "Memory layout support for SM
 int smpi_loaded_page      = -1;
 char* smpi_data_exe_start = nullptr;
 int smpi_data_exe_size    = 0;
-int smpi_privatize_global_variables;
+SmpiPrivStrategies smpi_privatize_global_variables;
 static void* smpi_data_exe_copy;
 
 // We keep a copy of all the privatization regions: We can then delete everything easily by iterating over this
@@ -148,7 +148,7 @@ void smpi_backup_global_memory_segment()
   XBT_DEBUG("bss+data segment found : size %d starting at %p", smpi_data_exe_size, smpi_data_exe_start);
 
   if (smpi_data_exe_size == 0) { // no need to do anything as global variables don't exist
-    smpi_privatize_global_variables=false;
+    smpi_privatize_global_variables = SmpiPrivStrategies::None;
     return;
   }
 
@@ -157,7 +157,7 @@ void smpi_backup_global_memory_segment()
   // of the simulation and can be used to initialize a dynamically added, new process.
   asan_safe_memcpy(smpi_data_exe_copy, TOPAGE(smpi_data_exe_start), smpi_data_exe_size);
 #else /* ! HAVE_PRIVATIZATION */
-  smpi_privatize_global_variables = false;
+  smpi_privatize_global_variables = SmpiPrivStrategies::None;
   xbt_die("You are trying to use privatization on a system that does not support it. Don't.");
   return;
 #endif
index dc1c516..b4f2dd8 100644 (file)
@@ -262,7 +262,7 @@ void Process::init(int *argc, char ***argv){
     // cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved
     // this up here so that I can set the privatized region before the switch.
     Process* process = smpi_process_remote(proc);
-    if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){
+    if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
       /* Now using the segment index of this process  */
       process->set_privatized_region(smpi_init_global_memory_segment_process());
       /* Done at the process's creation */
index c256f12..1183cac 100644 (file)
@@ -56,7 +56,8 @@ void Comm::destroy(Comm* comm)
 }
 
 int Comm::dup(MPI_Comm* newcomm){
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+    // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
   MPI_Group cp = new  Group(this->group());
@@ -299,7 +300,8 @@ void Comm::init_smp(){
     smpi_process()->set_replaying(false);
   }
 
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+    // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
   //identify neighbours in comm
@@ -335,7 +337,8 @@ void Comm::init_smp(){
 
   Coll_allgather_mpich::allgather(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
 
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+    // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
 
@@ -407,7 +410,8 @@ void Comm::init_smp(){
   }
   Coll_bcast_mpich::bcast(&(is_uniform_),1, MPI_INT, 0, comm_intra );
 
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+    // we need to switch as the called function may silently touch global variables
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
   // Are the ranks blocked ? = allocated contiguously on the SMP nodes
index de11260..a17f42e 100644 (file)
@@ -294,7 +294,7 @@ int Datatype::copy(void *sendbuf, int sendcount, MPI_Datatype sendtype,
 
 // FIXME Handle the case of a partial shared malloc.
 
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
   /* First check if we really have something to do */
index 521f9b0..0cc6659 100644 (file)
@@ -240,7 +240,8 @@ void Op::set_fortran_op()
 
 void Op::apply(void *invec, void *inoutvec, int *len, MPI_Datatype datatype)
 {
-  if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){//we need to switch as the called function may silently touch global variables
+  if (smpi_privatize_global_variables == SmpiPrivStrategies::Mmap) {
+    // we need to switch as the called function may silently touch global variables
     XBT_DEBUG("Applying operation, switch to the right data frame ");
     smpi_switch_data_segment(simgrid::s4u::Actor::self());
   }
index cff18d4..b2e9be6 100644 (file)
@@ -410,7 +410,8 @@ void Request::start()
       if (not(old_type_->flags() & DT_FLAG_DERIVED)) {
         oldbuf = buf_;
         if (not process->replaying() && oldbuf != nullptr && size_ != 0) {
-          if ((smpi_privatize_global_variables != 0) && (static_cast<char*>(buf_) >= smpi_data_exe_start) &&
+          if ((smpi_privatize_global_variables != SmpiPrivStrategies::None) &&
+              (static_cast<char*>(buf_) >= smpi_data_exe_start) &&
               (static_cast<char*>(buf_) < smpi_data_exe_start + smpi_data_exe_size)) {
             XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment ");
             smpi_switch_data_segment(simgrid::s4u::Actor::byPid(src_));
@@ -704,7 +705,7 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status)
     if (((req->flags_ & ACCUMULATE) != 0) ||
         (datatype->flags() & DT_FLAG_DERIVED)) { // && (not smpi_is_shared(req->old_buf_))){
 
-      if (not smpi_process()->replaying() && smpi_privatize_global_variables != 0 &&
+      if (not smpi_process()->replaying() && smpi_privatize_global_variables != SmpiPrivStrategies::None &&
           static_cast<char*>(req->old_buf_) >= smpi_data_exe_start &&
           static_cast<char*>(req->old_buf_) < smpi_data_exe_start + smpi_data_exe_size) {
         XBT_VERB("Privatization : We are unserializing to a zone in global memory  Switch data segment ");