Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merging changes done by Steven, Samuel and Luka, regarding simulation of StarPU-MPI
[simgrid.git] / src / smpi / smpi_pmpi.c
index 99fdf8a..0583cfb 100644 (file)
@@ -25,16 +25,21 @@ void TRACE_smpi_set_category(const char *category)
 
 int PMPI_Init(int *argc, char ***argv)
 {
-  smpi_process_init(argc, argv);
-  smpi_process_mark_as_initialized();
-  int rank = smpi_process_index();
-  TRACE_smpi_init(rank);
-  TRACE_smpi_computing_init(rank);
-  instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
-  extra->type = TRACING_INIT;
-  TRACE_smpi_collective_in(rank, -1, __FUNCTION__, extra);
-  TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
-  smpi_bench_begin();
+  // PMPI_Init is call only one time by only by SMPI process
+  int already_init;
+  MPI_Initialized(&already_init);
+  if(!(already_init)){
+    smpi_process_init(argc, argv);
+    smpi_process_mark_as_initialized();
+    int rank = smpi_process_index();
+    TRACE_smpi_init(rank);
+    TRACE_smpi_computing_init(rank);
+    instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1);
+    extra->type = TRACING_INIT;
+    TRACE_smpi_collective_in(rank, -1, __FUNCTION__, extra);
+    TRACE_smpi_collective_out(rank, -1, __FUNCTION__);
+    smpi_bench_begin();
+  }
   return MPI_SUCCESS;
 }
 
@@ -1820,10 +1825,11 @@ int PMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
   int dt_size_recv = 1;
   if(!known)
     dt_size_recv = smpi_datatype_size(recvtype);
+  if((smpi_comm_rank(comm)==root)){
   extra->recvcounts= xbt_malloc(size*sizeof(int));
   for(i=0; i< size; i++)//copy data to avoid bad free
     extra->recvcounts[i] = recvcounts[i]*dt_size_recv;
-
+  }
   TRACE_smpi_collective_in(rank, root_traced, __FUNCTION__,extra);
 
   smpi_mpi_gatherv(sendtmpbuf, sendtmpcount, sendtmptype, recvbuf, recvcounts,
@@ -2023,9 +2029,11 @@ int PMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs,
   int dt_size_send = 1;
   if(!known)
     dt_size_send = smpi_datatype_size(sendtype);
+  if((smpi_comm_rank(comm)==root)){
   extra->sendcounts= xbt_malloc(size*sizeof(int));
   for(i=0; i< size; i++)//copy data to avoid bad free
     extra->sendcounts[i] = sendcounts[i]*dt_size_send;
+  }
   extra->datatype2 = encode_datatype(recvtype, &known);
   int dt_size_recv = 1;
   if(!known)