X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/55a9b9fe5663cb2fe2398c14f0e9b11d4a31e3b3..f9e6853d2c5b7b867211700bc12f0ee57f640b30:/src/smpi/smpi_global.c diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 0ff30a4c9c..60e550f84d 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -7,6 +7,7 @@ #include "private.h" #include "smpi_mpi_dt_private.h" #include "mc/mc.h" +#include "xbt/replay.h" #include "surf/surf.h" #include "simix/smx_private.h" #include "simgrid/sg_config.h" @@ -85,6 +86,8 @@ 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_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."); } void smpi_process_destroy(void) @@ -99,11 +102,44 @@ void smpi_process_destroy(void) */ void smpi_process_finalize(void) { +#if 0 // wait for all pending asynchronous comms to finish - if(!MC_is_active()) while (SIMIX_process_has_pending_comms(SIMIX_process_self())) { simcall_process_sleep(0.01); } +#else + int i; + int size = smpi_comm_size(MPI_COMM_WORLD); + int rank = smpi_comm_rank(MPI_COMM_WORLD); + /* All non-root send & receive zero-length message. */ + if (rank > 0) { + smpi_mpi_ssend (NULL, 0, MPI_BYTE, 0, + COLL_TAG_BARRIER, + MPI_COMM_WORLD); + smpi_mpi_recv (NULL, 0, MPI_BYTE, 0, + COLL_TAG_BARRIER, + MPI_COMM_WORLD, MPI_STATUS_IGNORE); + } + /* The root collects and broadcasts the messages. */ + else { + MPI_Request* requests; + requests = (MPI_Request*)malloc( size * sizeof(MPI_Request) ); + for (i = 1; i < size; ++i) { + requests[i] = smpi_mpi_irecv(NULL, 0, MPI_BYTE, MPI_ANY_SOURCE, + COLL_TAG_BARRIER, MPI_COMM_WORLD + ); + } + smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE ); + for (i = 1; i < size; ++i) { + requests[i] = smpi_mpi_issend(NULL, 0, MPI_BYTE, i, + COLL_TAG_BARRIER, + MPI_COMM_WORLD + ); + } + smpi_mpi_waitall( size-1, requests+1, MPI_STATUSES_IGNORE ); + free( requests ); + } +#endif } /** @@ -291,7 +327,30 @@ static void smpi_comm_copy_buffer_callback(smx_action_t comm, void *buff, size_t buff_size) { XBT_DEBUG("Copy the data over"); - memcpy(comm->comm.dst_buff, buff, buff_size); + if(_xbt_replay_is_active()) return; + void* tmpbuff=buff; + + if((smpi_privatize_global_variables) + && ((char*)buff >= start_data_exe) + && ((char*)buff < start_data_exe + size_data_exe ) + ){ + XBT_WARN("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !"); + switch_data_segment(((smpi_process_data_t)SIMIX_process_get_data(comm->comm.src_proc))->index); + tmpbuff = (void*)xbt_malloc(buff_size); + memcpy(tmpbuff, buff, buff_size); + } + + + if((smpi_privatize_global_variables) + && ((char*)comm->comm.dst_buff >= start_data_exe) + && ((char*)comm->comm.dst_buff < start_data_exe + size_data_exe ) + ){ + XBT_WARN("Privatization : We are copying to a zone inside global memory - Switch data segment"); + switch_data_segment(((smpi_process_data_t)SIMIX_process_get_data(comm->comm.dst_proc))->index); + } + + + memcpy(comm->comm.dst_buff, tmpbuff, buff_size); if (comm->comm.detached) { // if this is a detached send, the source buffer was duplicated by SMPI // sender to make the original buffer available to the application ASAP @@ -302,6 +361,9 @@ static void smpi_comm_copy_buffer_callback(smx_action_t comm, //inside the user data and should be free comm->comm.src_buff = NULL; } + + if(tmpbuff!=buff)xbt_free(tmpbuff); + } void smpi_global_init(void) @@ -346,6 +408,8 @@ void smpi_global_init(void) "Use the option \"--cfg=smpi/running_power:\" to set its value." "Check http://simgrid.org/simgrid/latest/doc/options.html#options_smpi_bench for more information. "); } + if(smpi_privatize_global_variables) + smpi_initialize_global_memory_segments(); } void smpi_global_destroy(void) @@ -369,7 +433,8 @@ void smpi_global_destroy(void) } xbt_free(process_data); process_data = NULL; - + if(smpi_privatize_global_variables) + smpi_destroy_global_memory_segments(); smpi_free_static(); } @@ -390,7 +455,6 @@ int __attribute__ ((weak)) smpi_simulated_main_(int argc, char **argv) { smpi_process_init(&argc, &argv); user_main_(); - //xbt_die("Should not be in this smpi_simulated_main"); return 0; } @@ -529,6 +593,7 @@ int smpi_main(int (*realmain) (int argc, char *argv[]), int argc, char *argv[]) smpi_cpu_threshold = sg_cfg_get_double("smpi/cpu_threshold"); smpi_running_power = sg_cfg_get_double("smpi/running_power"); + smpi_privatize_global_variables = sg_cfg_get_boolean("smpi/privatize_global_variables"); if (smpi_cpu_threshold < 0) smpi_cpu_threshold = DBL_MAX;