Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix tests for shared and partial-shared.
[simgrid.git] / src / smpi / smpi_global.cpp
index db497bf..0acc0d4 100644 (file)
@@ -105,40 +105,48 @@ void smpi_comm_set_copy_data_callback(void (*callback) (smx_activity_t, void*, s
 
 void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t buff_size)
 {
-  XBT_DEBUG("Copy the data over");
-  void* tmpbuff=buff;
+
   simgrid::kernel::activity::Comm *comm = dynamic_cast<simgrid::kernel::activity::Comm*>(synchro);
 
-  if((smpi_privatize_global_variables) && (static_cast<char*>(buff) >= smpi_start_data_exe)
-      && (static_cast<char*>(buff) < smpi_start_data_exe + smpi_size_data_exe )
-    ){
-       XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
+  XBT_DEBUG("Copy the data over");
+  if(smpi_is_shared(buff)){
+    XBT_DEBUG("Sender %p is shared. Let's ignore it.", buff);
+  }else if(smpi_is_shared((char*)comm->dst_buff)){
+    XBT_DEBUG("Receiver %p is shared. Let's ignore it.", (char*)comm->dst_buff);
+  }else{
+    void* tmpbuff=buff;
+    if((smpi_privatize_global_variables) && (static_cast<char*>(buff) >= smpi_start_data_exe)
+        && (static_cast<char*>(buff) < smpi_start_data_exe + smpi_size_data_exe )
+      ){
+         XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !");
+
+         smpi_switch_data_segment(
+             (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->src_proc->data)->data))->index()));
+         tmpbuff = static_cast<void*>(xbt_malloc(buff_size));
+         memcpy(tmpbuff, buff, buff_size);
+    }
 
-       smpi_switch_data_segment(
-           (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->src_proc->data)->data))->index()));
-       tmpbuff = static_cast<void*>(xbt_malloc(buff_size));
-       memcpy(tmpbuff, buff, buff_size);
-  }
+    if((smpi_privatize_global_variables) && ((char*)comm->dst_buff >= smpi_start_data_exe)
+        && ((char*)comm->dst_buff < smpi_start_data_exe + smpi_size_data_exe )){
+         XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
+         smpi_switch_data_segment(
+             (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->dst_proc->data)->data))->index()));
+    }
 
-  if((smpi_privatize_global_variables) && ((char*)comm->dst_buff >= smpi_start_data_exe)
-      && ((char*)comm->dst_buff < smpi_start_data_exe + smpi_size_data_exe )){
-       XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment");
-       smpi_switch_data_segment(
-           (static_cast<simgrid::smpi::Process*>((static_cast<simgrid::MsgActorExt*>(comm->dst_proc->data)->data))->index()));
-  }
+    XBT_DEBUG("Copying %zu bytes from %p to %p", buff_size, tmpbuff,comm->dst_buff);
+    memcpy(comm->dst_buff, tmpbuff, buff_size);
 
-  XBT_DEBUG("Copying %zu bytes from %p to %p", buff_size, tmpbuff,comm->dst_buff);
-  memcpy(comm->dst_buff, tmpbuff, buff_size);
-  if (comm->detached) {
-    // if this is a detached send, the source buffer was duplicated by SMPI
-    // sender to make the original buffer available to the application ASAP
-    xbt_free(buff);
-    //It seems that the request is used after the call there this should be free somewhere else but where???
-    //xbt_free(comm->comm.src_data);// inside SMPI the request is kept inside the user data and should be free
-    comm->src_buff = nullptr;
+    if (comm->detached) {
+      // if this is a detached send, the source buffer was duplicated by SMPI
+      // sender to make the original buffer available to the application ASAP
+      xbt_free(buff);
+      //It seems that the request is used after the call there this should be free somewhere else but where???
+      //xbt_free(comm->comm.src_data);// inside SMPI the request is kept inside the user data and should be free
+      comm->src_buff = nullptr;
+    }
+    if(tmpbuff!=buff)xbt_free(tmpbuff);
   }
 
-  if(tmpbuff!=buff)xbt_free(tmpbuff);
 }
 
 void smpi_comm_null_copy_buffer_callback(smx_activity_t comm, void *buff, size_t buff_size)
@@ -297,6 +305,7 @@ void smpi_global_destroy()
   int count = smpi_process_count();
 
   smpi_bench_destroy();
+  smpi_shared_destroy();
   if (MPI_COMM_WORLD != MPI_COMM_UNINITIALIZED){
       delete MPI_COMM_WORLD->group();
       MSG_barrier_destroy(process_data[0]->finalization_barrier());
@@ -391,6 +400,7 @@ static void smpi_init_logs(){
   XBT_LOG_CONNECT(smpi_request);
   XBT_LOG_CONNECT(smpi_replay);
   XBT_LOG_CONNECT(smpi_rma);
+  XBT_LOG_CONNECT(smpi_shared);
   XBT_LOG_CONNECT(smpi_utils);
 }
 }