Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[DOC] Fixed even more errors.
[simgrid.git] / src / smpi / smpi_global.c
index 61a3437..7b47526 100644 (file)
@@ -7,12 +7,13 @@
 #include "private.h"
 #include "smpi_mpi_dt_private.h"
 #include "mc/mc.h"
-#include "mc/mc_record.h"
+#include "src/mc/mc_record.h"
 #include "xbt/replay.h"
 #include "surf/surf.h"
-#include "simix/smx_private.h"
+#include "src/simix/smx_private.h"
 #include "simgrid/sg_config.h"
-#include "mc/mc_replay.h"
+#include "src/mc/mc_replay.h"
+#include "src/msg/msg_private.h"
 
 #include <float.h>              /* DBL_MAX */
 #include <stdint.h>
@@ -79,7 +80,7 @@ void smpi_process_init(int *argc, char ***argv)
   if (argc && argv) {
     proc = SIMIX_process_self();
     //FIXME: dirty cleanup method to avoid using msg cleanup functions on these processes when using MSG+SMPI
-    proc->context->cleanup_func=SIMIX_process_cleanup;
+    SIMIX_process_set_cleanup_function(proc, SIMIX_process_cleanup);
     char* instance_id = (*argv)[1];
     int rank = atoi((*argv)[2]);
     index = smpi_process_index_of_smx_process(proc);
@@ -87,6 +88,14 @@ void smpi_process_init(int *argc, char ***argv)
     if(!index_to_process_data){
       index_to_process_data=(int*)xbt_malloc(SIMIX_process_count()*sizeof(int));
     }
+
+    if(smpi_privatize_global_variables){
+      /* Now using segment index of the process  */
+      index = proc->segment_index;
+      /* Done at the process's creation */
+      SMPI_switch_data_segment(index);
+    }
+
     MPI_Comm* temp_comm_world;
     xbt_bar_t temp_bar;
     smpi_deployment_register_process(instance_id, rank, index, &temp_comm_world ,&temp_bar);
@@ -96,8 +105,11 @@ void smpi_process_init(int *argc, char ***argv)
     data->index = index;
     data->instance_id = instance_id;
     data->replaying = 0;
-    xbt_free(simcall_process_get_data(proc));
-    simcall_process_set_data(proc, data);
+    //xbt_free(simcall_process_get_data(proc));
+
+  simdata_process_t simdata = simcall_process_get_data(proc);
+  simdata->data = data;
+
     if (*argc > 3) {
       free((*argv)[1]);
       memmove(&(*argv)[0], &(*argv)[2], sizeof(char *) * (*argc - 2));
@@ -111,10 +123,6 @@ void smpi_process_init(int *argc, char ***argv)
     simcall_rdv_set_receiver(data->mailbox_small, proc);
     XBT_DEBUG("<%d> New process in the game: %p", index, proc);
 
-    if(smpi_privatize_global_variables){
-      smpi_switch_data_segment(index);
-    }
-
   }
   if (smpi_process_data() == NULL)
     xbt_die("smpi_process_data() returned NULL. You probably gave a NULL parameter to MPI_Init. Although it's required by MPI-2, this is currently not supported by SMPI.");
@@ -162,9 +170,14 @@ int smpi_process_finalized()
  */
 int smpi_process_initialized(void)
 {
-  int index = smpi_process_index();
-  return ( (index != MPI_UNDEFINED)
-          && (process_data[index_to_process_data[index]]->state == SMPI_INITIALIZED));
+  if (!index_to_process_data){
+    return false;
+  }
+  else{
+    int index = smpi_process_index();
+    return ( (index != MPI_UNDEFINED)
+             && (process_data[index_to_process_data[index]]->state == SMPI_INITIALIZED));
+  }
 }
 
 /**
@@ -205,7 +218,8 @@ int smpi_global_size(void)
 
 smpi_process_data_t smpi_process_data(void)
 {
-  return SIMIX_process_self_get_data(SIMIX_process_self());
+  simdata_process_t simdata = SIMIX_process_self_get_data(SIMIX_process_self());
+  return simdata->data;
 }
 
 smpi_process_data_t smpi_process_remote_data(int index)
@@ -355,7 +369,7 @@ void smpi_comm_copy_buffer_callback(smx_synchro_t comm,
       && ((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(((smpi_process_data_t)SIMIX_process_get_data(comm->comm.src_proc))->index);
+       smpi_switch_data_segment(((smpi_process_data_t)(((simdata_process_t)SIMIX_process_get_data(comm->comm.src_proc))->data))->index);
        tmpbuff = (void*)xbt_malloc(buff_size);
        memcpy(tmpbuff, buff, buff_size);
   }
@@ -366,7 +380,7 @@ void smpi_comm_copy_buffer_callback(smx_synchro_t comm,
       && ((char*)comm->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(((smpi_process_data_t)SIMIX_process_get_data(comm->comm.dst_proc))->index);
+       smpi_switch_data_segment(((smpi_process_data_t)(((simdata_process_t)SIMIX_process_get_data(comm->comm.dst_proc))->data))->index);
   }
 
 
@@ -396,7 +410,7 @@ void smpi_comm_null_copy_buffer_callback(smx_synchro_t comm,
 static void smpi_check_options(){
   //check correctness of MPI parameters
 
-   xbt_assert(sg_cfg_get_int("smpi/async_small_thres") <=
+   xbt_assert(sg_cfg_get_int("smpi/async_small_thresh") <=
               sg_cfg_get_int("smpi/send_is_detached_thres"));
 
    if (sg_cfg_is_default_value("smpi/running_power")) {
@@ -431,20 +445,20 @@ void smpi_global_init(void)
   for (i = 0; i < process_count; i++) {
     process_data[i] = xbt_new(s_smpi_process_data_t, 1);
     //process_data[i]->index = i;
-    process_data[i]->argc = NULL;
-    process_data[i]->argv = NULL;
+    process_data[i]->argc    = NULL;
+    process_data[i]->argv    = NULL;
     process_data[i]->mailbox = simcall_rdv_create(get_mailbox_name(name, i));
     process_data[i]->mailbox_small =
         simcall_rdv_create(get_mailbox_name_small(name, i));
-    process_data[i]->mailboxes_mutex=xbt_mutex_init();
-    process_data[i]->timer = xbt_os_timer_new();
+    process_data[i]->mailboxes_mutex = xbt_mutex_init();
+    process_data[i]->timer           = xbt_os_timer_new();
     if (MC_is_active())
       MC_ignore_heap(process_data[i]->timer, xbt_os_timer_size());
-    process_data[i]->comm_self = MPI_COMM_NULL;
-    process_data[i]->comm_intra = MPI_COMM_NULL;
-    process_data[i]->comm_world = NULL;
-    process_data[i]->state = SMPI_UNINITIALIZED;
-    process_data[i]->sampling = 0;
+    process_data[i]->comm_self            = MPI_COMM_NULL;
+    process_data[i]->comm_intra           = MPI_COMM_NULL;
+    process_data[i]->comm_world           = NULL;
+    process_data[i]->state                = SMPI_UNINITIALIZED;
+    process_data[i]->sampling             = 0;
     process_data[i]->finalization_barrier = NULL;
   }
   //if the process was launched through smpirun script
@@ -647,6 +661,9 @@ int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[])
   TRACE_add_end_function(TRACE_smpi_release);
 
   SIMIX_global_init(&argc, argv);
+  MSG_init(&argc,argv);
+
+  SMPI_switch_data_segment = smpi_switch_data_segment;
 
   smpi_init_options();
 
@@ -676,7 +693,7 @@ int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[])
     xbt_os_walltimer_stop(global_timer);
     if (sg_cfg_get_boolean("smpi/display_timing")){
       double global_time = xbt_os_timer_elapsed(global_timer);
-      XBT_INFO("Simulated time: %g seconds. \n "
+      XBT_INFO("Simulated time: %g seconds. \n\n"
           "The simulation took %g seconds (after parsing and platform setup)\n"
           "%g seconds were actual computation of the application"
           , SIMIX_get_clock(), global_time , smpi_total_benched_time);