X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/13e0c316176dfe56c04b66d96b65a174e76d0549..8e0201e83de6ce9132c74ee5face3e1ef47d4381:/src/smpi/smpi_global.c diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 7e446a9590..60e550f84d 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -2,11 +2,12 @@ * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ + * under the terms of the license (GNU LGPL) which comes with this package. */ #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" @@ -29,7 +30,7 @@ typedef struct s_smpi_process_data { MPI_Comm comm_self; void *data; /* user data */ int index; - int initialized; + char state; int sampling; /* inside an SMPI_SAMPLE_ block? */ } s_smpi_process_data_t; @@ -85,12 +86,14 @@ 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) { int index = smpi_process_index(); - process_data[index]->index = -100; + process_data[index]->state = SMPI_FINALIZED; XBT_DEBUG("<%d> Process left the game", index); } @@ -99,10 +102,44 @@ void smpi_process_destroy(void) */ void smpi_process_finalize(void) { +#if 0 // wait for all pending asynchronous comms to finish 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 } /** @@ -110,8 +147,11 @@ void smpi_process_finalize(void) */ int smpi_process_finalized() { - return (smpi_process_index() == -100); - // If finalized, this value has been set to -100; + int index = smpi_process_index(); + if (index != MPI_UNDEFINED) + return (process_data[index]->state == SMPI_FINALIZED); + else + return 0; } /** @@ -120,8 +160,8 @@ int smpi_process_finalized() int smpi_process_initialized(void) { int index = smpi_process_index(); - return ((index != -100) && (index != MPI_UNDEFINED) - && (process_data[index]->initialized)); + return ( (index != MPI_UNDEFINED) + && (process_data[index]->state == SMPI_INITIALIZED)); } /** @@ -130,8 +170,8 @@ int smpi_process_initialized(void) void smpi_process_mark_as_initialized(void) { int index = smpi_process_index(); - if ((index != -100) && (index != MPI_UNDEFINED)) - process_data[index]->initialized = 1; + if ((index != MPI_UNDEFINED) && (!process_data[index]->state != SMPI_FINALIZED)) + process_data[index]->state = SMPI_INITIALIZED; } @@ -287,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 @@ -298,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) @@ -321,7 +387,7 @@ void smpi_global_init(void) 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]->initialized = 0; + process_data[i]->state = SMPI_UNINITIALIZED; process_data[i]->sampling = 0; } group = smpi_group_new(process_count); @@ -335,6 +401,15 @@ void smpi_global_init(void) xbt_assert(sg_cfg_get_int("smpi/async_small_thres") <= sg_cfg_get_int("smpi/send_is_detached_thres")); + + if (sg_cfg_is_default_value("smpi/running_power")) { + XBT_INFO("You did not set the power of the host running the simulation. " + "The timings will certainly not be accurate. " + "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) @@ -358,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(); } @@ -379,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; } @@ -518,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;