Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change way replay is handled, to allow cohabitation between replay and "classic"...
[simgrid.git] / src / smpi / smpi_comm.c
index 3cf01de..cfc23cd 100644 (file)
@@ -12,6 +12,7 @@
 #include "simix/smx_private.h"
 #include "colls/colls.h"
 
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_comm, smpi,
                                 "Logging specific to SMPI (comm)");
 
@@ -125,6 +126,8 @@ void smpi_comm_get_name (MPI_Comm comm, char* name, int* len)
 }
 
 void smpi_comm_set_leaders_comm(MPI_Comm comm, MPI_Comm leaders){
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
   comm->leaders_comm=leaders;
 }
 
@@ -133,27 +136,38 @@ void smpi_comm_set_intra_comm(MPI_Comm comm, MPI_Comm leaders){
 }
 
 int* smpi_comm_get_non_uniform_map(MPI_Comm comm){
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
   return comm->non_uniform_map;
 }
 
 int* smpi_comm_get_leaders_map(MPI_Comm comm){
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
   return comm->leaders_map;
 }
 
 MPI_Comm smpi_comm_get_leaders_comm(MPI_Comm comm){
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
   return comm->leaders_comm;
 }
 
 MPI_Comm smpi_comm_get_intra_comm(MPI_Comm comm){
-  if(comm==MPI_COMM_WORLD) return smpi_process_get_comm_intra();
+  if (comm == MPI_COMM_UNINITIALIZED || comm==MPI_COMM_WORLD) 
+    return smpi_process_get_comm_intra();
   else return comm->intra_comm;
 }
 
 int smpi_comm_is_uniform(MPI_Comm comm){
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
   return comm->is_uniform;
 }
 
 int smpi_comm_is_blocked(MPI_Comm comm){
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
   return comm->is_blocked;
 }
 
@@ -274,11 +288,23 @@ compare_ints (const void *a, const void *b)
 
 void smpi_comm_init_smp(MPI_Comm comm){
   int leader = -1;
+
+  if (comm == MPI_COMM_UNINITIALIZED)
+    comm = smpi_process_comm_world();
+
   int comm_size =smpi_comm_size(comm);
+  
+  // If we are in replay - perform an ugly hack  
+  // say to SimGrid that we are not in replay for a while, because we need 
+  // the buffers to be copied for the following calls
+  int replaying = 0; //cache data to set it back again after
+  if(smpi_process_get_replaying()){
+   replaying=1;
+   smpi_process_set_replaying(0);
+  }
 
   if(smpi_privatize_global_variables){ //we need to switch here, as the called function may silently touch global variables
-     XBT_VERB("Applying operation, switch to the right data frame ");
-     switch_data_segment(smpi_process_index());
+     smpi_switch_data_segment(smpi_process_index());
    }
   //identify neighbours in comm
   //get the indexes of all processes sharing the same simix host
@@ -291,7 +317,7 @@ void smpi_comm_init_smp(MPI_Comm comm){
 //      smpi_process_set_comm_intra(MPI_COMM_SELF);
 //      return;
 //  }
-  XBT_DEBUG("number of processes deployed on my node : %d", intra_comm_size);
+
 
   int i =0;
   int min_index=INT_MAX;//the minimum index will be the leader
@@ -308,7 +334,7 @@ void smpi_comm_init_smp(MPI_Comm comm){
       i++;
     }
   }
-
+  XBT_DEBUG("number of processes deployed on my node : %d", intra_comm_size);
   MPI_Group group_intra = smpi_group_new(intra_comm_size);
   i=0;
   process = NULL;
@@ -338,6 +364,10 @@ void smpi_comm_init_smp(MPI_Comm comm){
 
   smpi_coll_tuned_allgather_mpich(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, comm);
 
+  if(smpi_privatize_global_variables){ //we need to switch here, as the called function may silently touch global variables
+     smpi_switch_data_segment(smpi_process_index());
+   }
+   
   if(!comm->leaders_map){
     comm->leaders_map= leaders_map;
   }else{
@@ -363,7 +393,7 @@ void smpi_comm_init_smp(MPI_Comm comm){
 
 
   MPI_Comm leader_comm = MPI_COMM_NULL;
-  if(comm!=MPI_COMM_WORLD){
+  if(MPI_COMM_WORLD!=MPI_COMM_UNINITIALIZED && comm!=MPI_COMM_WORLD){
     //create leader_communicator
     for (i=0; i< leader_group_size;i++)
       smpi_group_set_mapping(leaders_group, leader_list[i], i);
@@ -388,7 +418,7 @@ void smpi_comm_init_smp(MPI_Comm comm){
   // Are the nodes uniform ? = same number of process/node
   int my_local_size=smpi_comm_size(comm_intra);
   if(smpi_comm_rank(comm_intra)==0) {
-    int* non_uniform_map = xbt_malloc(sizeof(int)*leader_group_size);
+    int* non_uniform_map = xbt_malloc0(sizeof(int)*leader_group_size);
     smpi_coll_tuned_allgather_mpich(&my_local_size, 1, MPI_INT,
         non_uniform_map, 1, MPI_INT, leader_comm);
     for(i=0; i < leader_group_size; i++) {
@@ -406,7 +436,9 @@ void smpi_comm_init_smp(MPI_Comm comm){
   }
   smpi_coll_tuned_bcast_mpich(&(comm->is_uniform),1, MPI_INT, 0, comm_intra );
 
-
+  if(smpi_privatize_global_variables){ //we need to switch here, as the called function may silently touch global variables
+     smpi_switch_data_segment(smpi_process_index());
+   }
   // Are the ranks blocked ? = allocated contiguously on the SMP nodes
   int is_blocked=1;
   int prev=smpi_group_rank(smpi_comm_group(comm), smpi_group_index(smpi_comm_group(comm_intra), 0));
@@ -423,7 +455,7 @@ void smpi_comm_init_smp(MPI_Comm comm){
   smpi_mpi_allreduce(&is_blocked, &(global_blocked), 1,
             MPI_INT, MPI_LAND, comm);
 
-  if(comm==MPI_COMM_WORLD){
+  if(MPI_COMM_WORLD==SMPI_UNINITIALIZED || comm==MPI_COMM_WORLD){
     if(smpi_comm_rank(comm)==0){
         comm->is_blocked=global_blocked;
     }
@@ -431,5 +463,8 @@ void smpi_comm_init_smp(MPI_Comm comm){
     comm->is_blocked=global_blocked;
   }
   xbt_free(leader_list);
+  
+  if(replaying==1)
+    smpi_process_set_replaying(1); 
 }