From: Gabriel Corona Date: Thu, 3 Apr 2014 16:18:46 +0000 (+0200) Subject: [mc] Make snapshots compatible with SMPI privatization of global variables X-Git-Tag: v3_11~134^2~1 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f4782c312dc48a0fdce1934a03f8392ae4f9ce5e [mc] Make snapshots compatible with SMPI privatization of global variables Not handled yet: * State comparaison is not handled in this commit; * Address process/snapshot translation support. Still to do: make a clean API for the privatization. --- diff --git a/src/mc/mc_checkpoint.c b/src/mc/mc_checkpoint.c index e482c42aa4..92d7616849 100644 --- a/src/mc/mc_checkpoint.c +++ b/src/mc/mc_checkpoint.c @@ -12,6 +12,7 @@ #include "mc_private.h" #include "xbt/module.h" #include +#include "../smpi/private.h" #include "xbt/mmalloc/mmprivate.h" @@ -65,6 +66,13 @@ void MC_free_snapshot(mc_snapshot_t snapshot){ xbt_free(snapshot->stack_sizes); xbt_dynar_free(&(snapshot->stacks)); xbt_dynar_free(&(snapshot->to_ignore)); + + size_t n = snapshot->nb_processes; + for(i=0; i!=n; ++i) { + MC_region_destroy(snapshot->privatization_regions[i]); + } + xbt_free(snapshot->privatization_regions); + xbt_free(snapshot); } @@ -102,6 +110,7 @@ static void MC_snapshot_add_region(mc_snapshot_t snapshot, int type, void *start } static void MC_get_memory_regions(mc_snapshot_t snapshot){ + size_t i; void* start_heap = ((xbt_mheap_t)std_heap)->base; void* end_heap = ((xbt_mheap_t)std_heap)->breakval; @@ -109,7 +118,17 @@ static void MC_get_memory_regions(mc_snapshot_t snapshot){ snapshot->heap_bytes_used = mmalloc_get_bytes_used(std_heap); MC_snapshot_add_region(snapshot, 1, mc_libsimgrid_info->start_rw, mc_libsimgrid_info->end_rw - mc_libsimgrid_info->start_rw); - MC_snapshot_add_region(snapshot, 2, mc_binary_info->start_rw, mc_binary_info->end_rw - mc_binary_info->start_rw); + if(!smpi_privatize_global_variables) { + MC_snapshot_add_region(snapshot, 2, mc_binary_info->start_rw, mc_binary_info->end_rw - mc_binary_info->start_rw); + snapshot->privatization_regions = NULL; + snapshot->privatization_index = -1; + } else { + snapshot->privatization_regions = xbt_new(mc_mem_region_t, SIMIX_process_count()); + for (i=0; i< SIMIX_process_count(); i++){ + snapshot->privatization_regions[i] = MC_region_new(-1, mappings[i], size_data_exe); + } + snapshot->privatization_index = loaded_page; + } } /** @brief Finds the range of the different memory segments and binary paths */ @@ -479,9 +498,19 @@ mc_snapshot_t MC_take_snapshot(int num_state){ void MC_restore_snapshot(mc_snapshot_t snapshot){ unsigned int i; for(i=0; i < NB_REGIONS; i++){ - MC_region_restore(snapshot->regions[i]); + // For privatized, variables we decided it was not necessary to take the snapshot: + if(snapshot->regions[i]) + MC_region_restore(snapshot->regions[i]); } + if(snapshot->privatization_regions) { + for (i=0; i< SIMIX_process_count(); i++){ + if(snapshot->privatization_regions[i]) { + MC_region_restore(snapshot->privatization_regions[i]); + } + } + switch_data_segment(snapshot->privatization_index); + } } void* mc_translate_address(uintptr_t addr, mc_snapshot_t snapshot) { diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index 20e4ab832f..0de75609ec 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -48,6 +48,8 @@ typedef struct s_mc_snapshot{ size_t heap_bytes_used; mc_mem_region_t regions[NB_REGIONS]; int nb_processes; + mc_mem_region_t* privatization_regions; + int privatization_index; size_t *stack_sizes; xbt_dynar_t stacks; xbt_dynar_t to_ignore; diff --git a/src/smpi/private.h b/src/smpi/private.h index e692c3898e..74ee1b6a32 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -589,5 +589,8 @@ void TRACE_smpi_finalize(int rank); const char* encode_datatype(MPI_Datatype datatype); +// TODO, make this static and expose it more cleanly +extern void** mappings; +extern int loaded_page; #endif