Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[smpi] Change parallel arrays into array of structs
[simgrid.git] / src / smpi / smpi_bench.c
index e33d659..d35c50c 100644 (file)
@@ -73,13 +73,13 @@ xbt_dict_t calls = NULL;           /* Allocated on first use */
 double smpi_cpu_threshold;
 double smpi_running_power;
 
-int* fds;
-void** mappings;
-int loaded_page = -1;
+int smpi_loaded_page = -1;
 char* start_data_exe = NULL;
 int size_data_exe = 0;
 int smpi_privatize_global_variables;
 
+smpi_privatisation_region_t smpi_privatisation_regions;
+
 typedef struct {
   int fd;
   int count;
@@ -185,11 +185,11 @@ void smpi_execute(double duration)
   }
 }
 
-void switch_data_segment(int dest);
+void smpi_switch_data_segment(int dest);
 
 void smpi_bench_begin(void)
 {
-  switch_data_segment(smpi_process_index());
+  smpi_switch_data_segment(smpi_process_index());
   xbt_os_threadtimer_start(smpi_process_timer());
 }
 
@@ -197,7 +197,7 @@ void smpi_bench_end(void)
 {
   xbt_os_timer_t timer = smpi_process_timer();
   xbt_os_threadtimer_stop(timer);
-//  switch_data_segment(smpi_process_count());
+//  smpi_switch_data_segment(smpi_process_count());
   if (smpi_process_get_sampling()) {
     XBT_CRITICAL("Cannot do recursive benchmarks.");
     XBT_CRITICAL("Are you trying to make a call to MPI within a SMPI_SAMPLE_ block?");
@@ -504,7 +504,7 @@ void smpi_shared_free(void *ptr)
   shared_metadata_t* meta;
   shared_data_t* data;
   if (sg_cfg_get_boolean("smpi/use_shared_malloc")){
-  
+
     if (!allocs) {
       XBT_WARN("Cannot free: nothing was allocated");
       return;
@@ -602,28 +602,27 @@ void* smpi_shared_set_call(const char* func, const char* input, void* data) {
 
 
 
-void switch_data_segment(int dest){
+void smpi_switch_data_segment(int dest){
 
   if(size_data_exe == 0)//no need to switch
     return;
 
-  if (loaded_page==dest)//no need to switch either
+  if (smpi_loaded_page==dest)//no need to switch either
     return;
 
-
 #ifdef HAVE_MMAP
   int i;
-  if(loaded_page==-1){//initial switch, do the copy from the real page here
+  if(smpi_loaded_page==-1){//initial switch, do the copy from the real page here
     for (i=0; i< SIMIX_process_count(); i++){
-      memcpy(mappings[i],TOPAGE(start_data_exe),size_data_exe);
+      memcpy(smpi_privatisation_regions[i].address,TOPAGE(start_data_exe),size_data_exe);
     }
   }
-  int current= fds[dest];
+  int current = smpi_privatisation_regions[dest].file_descriptor;
   XBT_VERB("Switching data frame to the one of process %d", dest);
   void* tmp = mmap (TOPAGE(start_data_exe), size_data_exe, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, current, 0);
   if (tmp != TOPAGE(start_data_exe))
     xbt_die("Couldn't map the new region");
-  loaded_page=dest;
+  smpi_loaded_page=dest;
 #endif
 }
 
@@ -684,7 +683,7 @@ void smpi_get_executable_global_size(){
         found++;
       }else if(strcmp(lfields[1], ".bss") == 0){
         //the beginning of bss is not exactly the end of data if not aligned, grow bss reported size accordingly
-        //TODO : check if this is OK, as some segments may be inserted between them.. 
+        //TODO : check if this is OK, as some segments may be inserted between them..
         size_bss_binary = ((char*) strtoul(lfields[4], NULL, 16) - (start_data_exe + size_data_binary))
                           + strtoul(lfields[2], NULL, 16);
         found++;
@@ -718,18 +717,19 @@ void smpi_initialize_global_memory_segments(){
     return;
   }
 
-  fds= (int*)xbt_malloc((smpi_process_count())*sizeof(int));
-  mappings= (void**)xbt_malloc((smpi_process_count())*sizeof(void*));
-
+  smpi_privatisation_regions = (smpi_privatisation_region_t) malloc(
+    sizeof(struct s_smpi_privatisation_region) * sizeof(int));
 
   for (i=0; i< SIMIX_process_count(); i++){
       //create SIMIX_process_count() mappings of this size with the same data inside
-      void *address = NULL, *tmp = NULL;
+      void *address = NULL;
       char path[] = "/dev/shm/my-buffer-XXXXXX";
       int status;
+
       int file_descriptor= mkstemp (path);
       if (file_descriptor < 0)
         xbt_die("Impossible to create temporary file for memory mapping");
+
       status = unlink (path);
       if (status)
         xbt_die("Impossible to unlink temporary file for memory mapping");
@@ -739,21 +739,16 @@ void smpi_initialize_global_memory_segments(){
         xbt_die("Impossible to set the size of the temporary file for memory mapping");
 
       /* Ask for a free region */
-      address = mmap (NULL, size_data_exe, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-
+      address = mmap (NULL, size_data_exe, PROT_READ | PROT_WRITE, MAP_SHARED, file_descriptor, 0);
       if (address == MAP_FAILED)
         xbt_die("Couldn't find a free region for memory mapping");
 
-      tmp = mmap (address, size_data_exe, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, file_descriptor, 0);
-
-      if (tmp != address)
-        xbt_die("Couldn't obtain the right address");
       //initialize the values
       memcpy(address,TOPAGE(start_data_exe),size_data_exe);
 
       //store the address of the mapping for further switches
-      fds[i]=file_descriptor;
-      mappings[i]= address;
+      smpi_privatisation_regions[i].file_descriptor = file_descriptor;
+      smpi_privatisation_regions[i].address = address;
   }
 
 #endif
@@ -766,15 +761,13 @@ void smpi_destroy_global_memory_segments(){
 #ifdef HAVE_MMAP
   int i;
   for (i=0; i< smpi_process_count(); i++){
-    if(munmap(mappings[i],size_data_exe) < 0) {
-      XBT_WARN("Unmapping of fd %d failed: %s", fds[i], strerror(errno));
+    if(munmap(smpi_privatisation_regions[i].address,size_data_exe) < 0) {
+      XBT_WARN("Unmapping of fd %d failed: %s",
+        smpi_privatisation_regions[i].file_descriptor, strerror(errno));
     }
-    close(fds[i]);
+    close(smpi_privatisation_regions[i].file_descriptor);
   }
-  xbt_free(mappings);
-  xbt_free(fds);
-
+  xbt_free(smpi_privatisation_regions);
 #endif
 
 }
-