X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f9b0b47d63fb3eed01420b0eabb455cb300f6cd7..28d7faa60b9789a70d99c922e163c4aa7de363de:/src/smpi/smpi_base.c diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index e76bdc1c3b..af7deebdcd 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -7,6 +7,7 @@ #include "private.h" #include "xbt/virtu.h" #include "mc/mc.h" +#include "mc/mc_replay.h" #include "xbt/replay.h" #include #include "simix/smx_private.h" @@ -250,10 +251,8 @@ static MPI_Request build_request(void *buf, int count, else request->refcount = 0; request->op = MPI_REPLACE; -#ifdef HAVE_TRACING request->send = 0; request->recv = 0; -#endif if (flags & SEND) smpi_datatype_unuse(datatype); return request; @@ -344,12 +343,14 @@ void smpi_mpi_start(MPI_Request request) if (request->flags & RECV) { print_request("New recv", request); + + xbt_mutex_t mut=smpi_process_mailboxes_mutex(); + xbt_mutex_acquire(mut); if (request->flags & RMA || request->size < sg_cfg_get_int("smpi/async_small_thres")){ //We have to check both mailboxes (because SSEND messages are sent to the large mbox). begin with the more appropriate one : the small one. mailbox = smpi_process_mailbox_small(); XBT_DEBUG("Is there a corresponding send already posted in the small mailbox %p (in case of SSEND)?", mailbox); - XBT_DEBUG("Is there a corresponding send already posted the small mailbox %p (in case of SSEND)?", mailbox); smx_synchro_t action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request); if(action ==NULL){ @@ -358,7 +359,6 @@ void smpi_mpi_start(MPI_Request request) action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request); if(action ==NULL){ XBT_DEBUG("Still nothing, switch back to the small mailbox : %p", mailbox); - XBT_DEBUG("Still notching, switch back to the small mailbox : %p", mailbox); mailbox = smpi_process_mailbox_small(); } }else{ @@ -395,18 +395,16 @@ void smpi_mpi_start(MPI_Request request) request, -1.0); XBT_DEBUG("recv simcall posted"); - + xbt_mutex_release(mut); } else { int receiver = request->dst; - #ifdef HAVE_TRACING - int rank = request->src; - if (TRACE_smpi_view_internals()) { - TRACE_smpi_send(rank, rank, receiver,request->size); - } - #endif + int rank = request->src; + if (TRACE_smpi_view_internals()) { + TRACE_smpi_send(rank, rank, receiver,request->size); + } print_request("New send", request); //if we are giving back the control to the user without waiting for completion, we have to inject timings @@ -421,6 +419,9 @@ void smpi_mpi_start(MPI_Request request) XBT_DEBUG("sending size of %zu : sleep %f ", request->size, smpi_os(request->size)); } + xbt_mutex_t mut=smpi_process_remote_mailboxes_mutex(receiver); + xbt_mutex_acquire(mut); + if (request->flags & RMA || request->size < sg_cfg_get_int("smpi/async_small_thres")) { // eager mode mailbox = smpi_process_remote_mailbox(receiver); XBT_DEBUG("Is there a corresponding recv already posted in the large mailbox %p?", mailbox); @@ -456,11 +457,11 @@ void smpi_mpi_start(MPI_Request request) oldbuf = request->buf; if (!smpi_process_get_replaying() && oldbuf && request->size!=0){ if((smpi_privatize_global_variables) - && ((char*)request->buf >= start_data_exe) - && ((char*)request->buf < start_data_exe + size_data_exe )){ + && ((char*) request->buf >= smpi_start_data_exe) + && ((char*)request->buf < smpi_start_data_exe + smpi_size_data_exe )){ XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment "); - smpi_switch_data_segment(request->src); - } + smpi_switch_data_segment(request->src); + } buf = xbt_malloc(request->size); memcpy(buf,oldbuf,request->size); XBT_DEBUG("buf %p copied into %p",oldbuf,buf); @@ -486,13 +487,11 @@ void smpi_mpi_start(MPI_Request request) -#ifdef HAVE_TRACING /* FIXME: detached sends are not traceable (request->action == NULL) */ if (request->action) - simcall_set_category(request->action, TRACE_internal_smpi_get_category()); - -#endif + simcall_set_category(request->action, TRACE_internal_smpi_get_category()); + xbt_mutex_release(mut); } } @@ -696,8 +695,8 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) if((req->flags & ACCUMULATE) || (datatype->has_subtype == 1)){ if (!smpi_process_get_replaying()){ if( smpi_privatize_global_variables - && ((char*)req->old_buf >= start_data_exe) - && ((char*)req->old_buf < start_data_exe + size_data_exe ) + && ((char*)req->old_buf >= smpi_start_data_exe) + && ((char*)req->old_buf < smpi_start_data_exe + smpi_size_data_exe ) ){ XBT_VERB("Privatization : We are unserializing to a zone in global memory - Switch data segment "); smpi_switch_data_segment(smpi_process_index()); @@ -721,7 +720,6 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) } -#ifdef HAVE_TRACING if (TRACE_smpi_view_internals()) { if(req->flags & RECV){ int rank = smpi_process_index(); @@ -729,7 +727,6 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) TRACE_smpi_recv(rank, src_traced, rank); } } -#endif if(req->detached_sender!=NULL){ smpi_mpi_request_free(&(req->detached_sender));