X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3fa78c2064c144ac3b4035142261bda6cead8211..e7474e602031399bbebb1105d683564d1fb2f1c0:/src/smpi/smpi_base.cpp diff --git a/src/smpi/smpi_base.cpp b/src/smpi/smpi_base.cpp index 9ad417780f..ec45beb604 100644 --- a/src/smpi/smpi_base.cpp +++ b/src/smpi/smpi_base.cpp @@ -76,12 +76,14 @@ typedef struct s_smpi_factor_multival { // FIXME: this should be merged (dedupli double values[4];//arbitrary set to 4 } s_smpi_factor_multival_t; -xbt_dynar_t smpi_os_values = NULL; -xbt_dynar_t smpi_or_values = NULL; -xbt_dynar_t smpi_ois_values = NULL; +xbt_dynar_t smpi_os_values = nullptr; +xbt_dynar_t smpi_or_values = nullptr; +xbt_dynar_t smpi_ois_values = nullptr; static simgrid::config::Flag smpi_wtime_sleep( "smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", 0.0); +static simgrid::config::Flag smpi_init_sleep( + "smpi/init", "Time to inject inside a call to MPI_Init", 0.0); static simgrid::config::Flag smpi_iprobe_sleep( "smpi/iprobe", "Minimum time to inject inside a call to MPI_Iprobe", 1e-4); static simgrid::config::Flag smpi_test_sleep( @@ -136,7 +138,7 @@ static xbt_dynar_t parse_factor(const char *smpi_coef_string) static double smpi_os(double size) { - if (smpi_os_values == NULL) { + if (smpi_os_values == nullptr) { smpi_os_values = parse_factor(xbt_cfg_get_string("smpi/os")); smpi_register_static(smpi_os_values, xbt_dynar_free_voidp); } @@ -165,7 +167,7 @@ static double smpi_os(double size) static double smpi_ois(double size) { - if (smpi_ois_values == NULL) { + if (smpi_ois_values == nullptr) { smpi_ois_values = parse_factor(xbt_cfg_get_string("smpi/ois")); smpi_register_static(smpi_ois_values, xbt_dynar_free_voidp); } @@ -192,7 +194,7 @@ static double smpi_ois(double size) static double smpi_or(double size) { - if (smpi_or_values == NULL) { + if (smpi_or_values == nullptr) { smpi_or_values = parse_factor(xbt_cfg_get_string("smpi/or")); smpi_register_static(smpi_or_values, xbt_dynar_free_voidp); } @@ -218,6 +220,11 @@ static double smpi_or(double size) return current; } +void smpi_mpi_init() { + if(smpi_init_sleep > 0) + simcall_process_sleep(smpi_init_sleep); +} + double smpi_mpi_wtime(){ double time; if (smpi_process_initialized() != 0 && @@ -260,32 +267,32 @@ static MPI_Request build_request(void *buf, int count, MPI_Datatype datatype, in } } - request->buf = buf; + request->buf = buf; // This part handles the problem of non-contiguous memory (for the unserialisation at the reception) - request->old_buf = old_buf; + request->old_buf = old_buf; request->old_type = datatype; request->size = smpi_datatype_size(datatype) * count; smpi_datatype_use(datatype); - request->src = src; - request->dst = dst; - request->tag = tag; + request->src = src; + request->dst = dst; + request->tag = tag; request->comm = comm; smpi_comm_use(request->comm); - request->action = NULL; - request->flags = flags; - request->detached = 0; - request->detached_sender = NULL; - request->real_src = 0; + request->action = nullptr; + request->flags = flags; + request->detached = 0; + request->detached_sender = nullptr; + request->real_src = 0; request->truncated = 0; request->real_size = 0; - request->real_tag = 0; - if(flags & PERSISTENT) + request->real_tag = 0; + if (flags & PERSISTENT) request->refcount = 1; else request->refcount = 0; - request->op = MPI_REPLACE; + request->op = MPI_REPLACE; request->send = 0; request->recv = 0; @@ -341,7 +348,7 @@ void smpi_mpi_start(MPI_Request request) { smx_mailbox_t mailbox; - xbt_assert(!request->action, "Cannot (re)start a non-finished communication"); + xbt_assert(request->action == nullptr, "Cannot (re-)start unfinished communication"); request->flags &= ~PREPARED; request->flags &= ~FINISHED; request->refcount++; @@ -364,11 +371,11 @@ void smpi_mpi_start(MPI_Request request) XBT_DEBUG("Is there a corresponding send already posted in the small mailbox %p (in case of SSEND)?", mailbox); smx_synchro_t action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, static_cast(request)); - if(action ==NULL){ + if(action == nullptr){ mailbox = smpi_process_mailbox(); XBT_DEBUG("No, nothing in the small mailbox test the other one : %p", mailbox); action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, static_cast(request)); - if(action ==NULL){ + if(action == nullptr){ XBT_DEBUG("Still nothing, switch back to the small mailbox : %p", mailbox); mailbox = smpi_process_mailbox_small(); } @@ -380,7 +387,7 @@ void smpi_mpi_start(MPI_Request request) XBT_DEBUG("Is there a corresponding send already posted the small mailbox?"); smx_synchro_t action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, (void*)request); - if(action ==NULL){ + if(action == nullptr){ XBT_DEBUG("No, nothing in the permanent receive mailbox"); mailbox = smpi_process_mailbox(); }else{ @@ -390,7 +397,7 @@ void smpi_mpi_start(MPI_Request request) //integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0 double sleeptime = (request->detached != 0) ? smpi_or(request->size) : 0.0; - if(sleeptime >= 0.0){ + if(sleeptime > 0.0){ simcall_process_sleep(sleeptime); XBT_DEBUG("receiving size of %zu : sleep %f ", request->size, smpi_or(request->size)); } @@ -415,12 +422,12 @@ void smpi_mpi_start(MPI_Request request) //if we are giving back the control to the user without waiting for completion, we have to inject timings double sleeptime = 0.0; - if(request->detached != 0 || (request->flags & (ISEND|SSEND))){// issend should be treated as isend + if(request->detached != 0 || ((request->flags & (ISEND|SSEND)) != 0)){// issend should be treated as isend //isend and send timings may be different sleeptime = ((request->flags & ISEND) != 0)? smpi_ois(request->size) : smpi_os(request->size); } - if(sleeptime != 0.0){ + if(sleeptime > 0.0){ simcall_process_sleep(sleeptime); XBT_DEBUG("sending size of %zu : sleep %f ", request->size, smpi_os(request->size)); } @@ -439,23 +446,26 @@ void smpi_mpi_start(MPI_Request request) mailbox = smpi_process_remote_mailbox(receiver); XBT_DEBUG("Is there a corresponding recv already posted in the large mailbox %p?", mailbox); smx_synchro_t action = simcall_comm_iprobe(mailbox, 1,request->dst, request->tag, &match_send, static_cast(request)); - if(action ==NULL){ - if ((request->flags & SSEND) == 0){ - mailbox = smpi_process_remote_mailbox_small(receiver); - XBT_DEBUG("No, nothing in the large mailbox, message is to be sent on the small one %p", mailbox); - } else{ - mailbox = smpi_process_remote_mailbox_small(receiver); - XBT_DEBUG("SSEND : Is there a corresponding recv already posted in the small mailbox %p?", mailbox); - action = simcall_comm_iprobe(mailbox, 1,request->dst, request->tag, &match_send, static_cast(request)); - if(action ==NULL){ - XBT_DEBUG("No, we are first, send to large mailbox"); - mailbox = smpi_process_remote_mailbox(receiver); - } - } - }else{ + if (action == nullptr) { + if ((request->flags & SSEND) == 0){ + mailbox = smpi_process_remote_mailbox_small(receiver); + XBT_DEBUG("No, nothing in the large mailbox, message is to be sent on the small one %p", mailbox); + } + else { + mailbox = smpi_process_remote_mailbox_small(receiver); + XBT_DEBUG("SSEND : Is there a corresponding recv already posted in the small mailbox %p?", mailbox); + action = simcall_comm_iprobe(mailbox, 1,request->dst, request->tag, &match_send, static_cast(request)); + if (action == nullptr) { + XBT_DEBUG("No, we are first, send to large mailbox"); + mailbox = smpi_process_remote_mailbox(receiver); + } + } + } + else { XBT_DEBUG("Yes there was something for us in the large mailbox"); } - }else{ + } + else { mailbox = smpi_process_remote_mailbox(receiver); XBT_DEBUG("Send request %p is in the large mailbox %p (buf: %p)",mailbox, request,request->buf); } @@ -494,8 +504,8 @@ void smpi_mpi_start(MPI_Request request) request->detached); XBT_DEBUG("send simcall posted"); - /* FIXME: detached sends are not traceable (request->action == NULL) */ - if (request->action) + /* FIXME: detached sends are not traceable (request->action == nullptr) */ + if (request->action != nullptr) simcall_set_category(request->action, TRACE_internal_smpi_get_category()); if (async_small_thresh != 0 || ((request->flags & RMA)!=0)) @@ -505,7 +515,7 @@ void smpi_mpi_start(MPI_Request request) void smpi_mpi_startall(int count, MPI_Request * requests) { - if(requests==NULL) + if(requests== nullptr) return; for(int i = 0; i < count; i++) { @@ -671,7 +681,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) MPI_Request req = *request; smpi_empty_status(status); - if(!((req->detached != 0) && req->flags & SEND) && ((req->flags & PREPARED) == 0)){ + if(!((req->detached != 0) && ((req->flags & SEND) != 0)) && ((req->flags & PREPARED) == 0)){ if(status != MPI_STATUS_IGNORE) { int src = req->src == MPI_ANY_SOURCE ? req->real_src : req->src; status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(req->comm), src); @@ -708,7 +718,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) } } - if (TRACE_smpi_view_internals() && req->flags & RECV){ + if (TRACE_smpi_view_internals() && ((req->flags & RECV) != 0)){ int rank = smpi_process_index(); int src_traced = (req->src == MPI_ANY_SOURCE ? req->real_src : req->src); TRACE_smpi_recv(rank, src_traced, rank); @@ -835,7 +845,7 @@ void smpi_mpi_probe(int source, int tag, MPI_Comm comm, MPI_Status* status){ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status){ - MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : + MPI_Request request = build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag, comm, PERSISTENT | RECV); // to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls @@ -849,28 +859,29 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* print_request("New iprobe", request); // We have to test both mailboxes as we don't know if we will receive one one or another - if (xbt_cfg_get_int("smpi/async-small-thresh")>0){ + if (xbt_cfg_get_int("smpi/async-small-thresh") > 0){ mailbox = smpi_process_mailbox_small(); - XBT_DEBUG("trying to probe the perm recv mailbox"); + XBT_DEBUG("Trying to probe the perm recv mailbox"); request->action = simcall_comm_iprobe(mailbox, 0, request->src, request->tag, &match_recv, static_cast(request)); } - if (request->action==NULL){ - mailbox = smpi_process_mailbox(); - XBT_DEBUG("trying to probe the other mailbox"); - request->action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, static_cast(request)); + + if (request->action == nullptr){ + mailbox = smpi_process_mailbox(); + XBT_DEBUG("trying to probe the other mailbox"); + request->action = simcall_comm_iprobe(mailbox, 0, request->src,request->tag, &match_recv, static_cast(request)); } - if (request->action){ + if (request->action != nullptr){ simgrid::simix::Comm *sync_comm = static_cast(request->action); - MPI_Request req = static_cast(sync_comm->src_data); + MPI_Request req = static_cast(sync_comm->src_data); *flag = 1; - if(status != MPI_STATUS_IGNORE && (req->flags & PREPARED)==0) { + if(status != MPI_STATUS_IGNORE && (req->flags & PREPARED) == 0) { status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(comm), req->src); status->MPI_TAG = req->tag; status->MPI_ERROR = MPI_SUCCESS; status->count = req->real_size; } - nsleeps=1;//reset the number of sleeps we will do next time + nsleeps = 1;//reset the number of sleeps we will do next time } else { *flag = 0;