X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0199ba108d66c94df94e4f044994e79efdece4b1..ea74f5d95928a521a588737e81f1de94eef25d19:/src/smpi/mpi/smpi_request.cpp diff --git a/src/smpi/mpi/smpi_request.cpp b/src/smpi/mpi/smpi_request.cpp index 72c4f99e74..2b54eacf68 100644 --- a/src/smpi/mpi/smpi_request.cpp +++ b/src/smpi/mpi/smpi_request.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2022. The SimGrid Team. 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. */ @@ -57,6 +57,10 @@ Request::Request(const void* buf, int count, MPI_Datatype datatype, aid_t src, a detached_ = false; detached_sender_ = nullptr; real_src_ = 0; + // get src_host if it's available (src is valid) + auto src_process = simgrid::s4u::Actor::by_pid(src); + if (src_process) + src_host_ = src_process->get_host(); truncated_ = false; unmatched_types_ = false; real_size_ = 0; @@ -132,8 +136,10 @@ bool Request::match_common(MPI_Request req, MPI_Request sender, MPI_Request rece receiver->src_ == sender->src_) && ((receiver->tag_ == MPI_ANY_TAG && sender->tag_ >= 0) || receiver->tag_ == sender->tag_)) { // we match, we can transfer some values - if (receiver->src_ == MPI_ANY_SOURCE) + if (receiver->src_ == MPI_ANY_SOURCE) { receiver->real_src_ = sender->src_; + receiver->src_host_ = sender->src_host_; + } if (receiver->tag_ == MPI_ANY_TAG) receiver->real_tag_ = sender->tag_; if ((receiver->flags_ & MPI_REQ_PROBE) == 0 ){ @@ -161,7 +167,8 @@ bool Request::match_common(MPI_Request req, MPI_Request sender, MPI_Request rece void Request::init_buffer(int count){ // FIXME Handle the case of a partial shared malloc. // This part handles the problem of non-contiguous memory (for the unserialization at the reception) - if ((((flags_ & MPI_REQ_RECV) != 0) && ((flags_ & MPI_REQ_ACCUMULATE) != 0)) || (type_->flags() & DT_FLAG_DERIVED)) { + if (not smpi_process()->replaying() && + ((((flags_ & MPI_REQ_RECV) != 0) && ((flags_ & MPI_REQ_ACCUMULATE) != 0)) || (type_->flags() & DT_FLAG_DERIVED))) { // This part handles the problem of non-contiguous memory old_buf_ = buf_; if (count==0){ @@ -227,7 +234,7 @@ MPI_Request Request::isend_init(const void *buf, int count, MPI_Datatype datatyp MPI_Request Request::rma_send_init(const void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm, MPI_Op op) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ + MPI_Request request; if(op==MPI_OP_NULL){ request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, comm->group()->actor(src), dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, @@ -258,12 +265,12 @@ MPI_Request Request::recv_init(void *buf, int count, MPI_Datatype datatype, int MPI_Request Request::rma_recv_init(void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm, MPI_Op op) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ aid_t source = MPI_PROC_NULL; if (src == MPI_ANY_SOURCE) source = MPI_ANY_SOURCE; else if (src != MPI_PROC_NULL) source = comm->group()->actor(src); + MPI_Request request; if(op==MPI_OP_NULL){ request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, source, dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, @@ -291,10 +298,9 @@ MPI_Request Request::irecv_init(void *buf, int count, MPI_Datatype datatype, int MPI_Request Request::ibsend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), - dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND | MPI_REQ_BSEND); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), + dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, + MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND | MPI_REQ_BSEND); if(dst != MPI_PROC_NULL) request->start(); return request; @@ -302,10 +308,9 @@ MPI_Request Request::ibsend(const void *buf, int count, MPI_Datatype datatype, i MPI_Request Request::isend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), - dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), + dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, + MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND); if(dst != MPI_PROC_NULL) request->start(); return request; @@ -313,10 +318,9 @@ MPI_Request Request::isend(const void *buf, int count, MPI_Datatype datatype, in MPI_Request Request::issend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), - dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SSEND | MPI_REQ_SEND); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), + dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, + MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SSEND | MPI_REQ_SEND); if(dst != MPI_PROC_NULL) request->start(); return request; @@ -324,15 +328,13 @@ MPI_Request Request::issend(const void *buf, int count, MPI_Datatype datatype, i MPI_Request Request::irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ aid_t source = MPI_PROC_NULL; if (src == MPI_ANY_SOURCE) source = MPI_ANY_SOURCE; else if (src != MPI_PROC_NULL) source = comm->group()->actor(src); - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, - source, simgrid::s4u::this_actor::get_pid(), tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_RECV); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, source, + simgrid::s4u::this_actor::get_pid(), tag, comm, MPI_REQ_NON_PERSISTENT | MPI_REQ_RECV); if(src != MPI_PROC_NULL) request->start(); return request; @@ -340,8 +342,7 @@ MPI_Request Request::irecv(void *buf, int count, MPI_Datatype datatype, int src, int Request::recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status * status) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = irecv(buf, count, datatype, src, tag, comm); + MPI_Request request = irecv(buf, count, datatype, src, tag, comm); int retval = wait(&request,status); request = nullptr; return retval; @@ -349,10 +350,9 @@ int Request::recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, void Request::bsend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), - dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND | MPI_REQ_BSEND); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), + dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, + MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND | MPI_REQ_BSEND); if(dst != MPI_PROC_NULL) request->start(); @@ -362,10 +362,9 @@ void Request::bsend(const void *buf, int count, MPI_Datatype datatype, int dst, void Request::send(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), - dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), + dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, + MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND); if(dst != MPI_PROC_NULL) request->start(); wait(&request, MPI_STATUS_IGNORE); @@ -374,10 +373,9 @@ void Request::send(const void *buf, int count, MPI_Datatype datatype, int dst, i void Request::ssend(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { - MPI_Request request = nullptr; /* MC needs the comm to be set to nullptr during the call */ - request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), - dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, - MPI_REQ_NON_PERSISTENT | MPI_REQ_SSEND | MPI_REQ_SEND); + auto request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(), + dst != MPI_PROC_NULL ? comm->group()->actor(dst) : MPI_PROC_NULL, tag, comm, + MPI_REQ_NON_PERSISTENT | MPI_REQ_SSEND | MPI_REQ_SEND); if(dst != MPI_PROC_NULL) request->start(); @@ -521,9 +519,13 @@ void Request::start() double sleeptime = 0.0; if (detached_ || ((flags_ & (MPI_REQ_ISEND | MPI_REQ_SSEND)) != 0)) { // issend should be treated as isend // isend and send timings may be different - sleeptime = ((flags_ & MPI_REQ_ISEND) != 0) - ? simgrid::s4u::Actor::self()->get_host()->extension()->oisend(size_) - : simgrid::s4u::Actor::self()->get_host()->extension()->osend(size_); + sleeptime = + ((flags_ & MPI_REQ_ISEND) != 0) + ? simgrid::s4u::Actor::self()->get_host()->extension()->oisend( + size_, simgrid::s4u::Actor::by_pid(src_)->get_host(), simgrid::s4u::Actor::by_pid(dst_)->get_host()) + : simgrid::s4u::Actor::self()->get_host()->extension()->osend( + size_, simgrid::s4u::Actor::by_pid(src_)->get_host(), + simgrid::s4u::Actor::by_pid(dst_)->get_host()); } if(sleeptime > 0.0){ @@ -697,13 +699,12 @@ int Request::testany(int count, MPI_Request requests[], int *index, int* flag, M std::vector comms; comms.reserve(count); - int i; *flag = 0; int ret = MPI_SUCCESS; *index = MPI_UNDEFINED; std::vector map; /** Maps all matching comms back to their location in requests **/ - for(i = 0; i < count; i++) { + for (int i = 0; i < count; i++) { if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->action_ && not(requests[i]->flags_ & MPI_REQ_PREPARED)) { comms.push_back(static_cast(requests[i]->action_.get())); map.push_back(i); @@ -714,13 +715,14 @@ int Request::testany(int count, MPI_Request requests[], int *index, int* flag, M static int nsleeps = 1; if(smpi_test_sleep > 0) simgrid::s4u::this_actor::sleep_for(nsleeps * smpi_test_sleep); + ssize_t i; try{ i = simcall_comm_testany(comms.data(), comms.size()); // The i-th element in comms matches! } catch (const Exception&) { XBT_DEBUG("Exception in testany"); return 0; } - + if (i != -1) { // -1 is not MPI_UNDEFINED but a SIMIX return code. (nothing matches) *index = map[i]; if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags_ & MPI_REQ_GENERALIZED) && @@ -779,7 +781,7 @@ int Request::testall(int count, MPI_Request requests[], int* outflag, MPI_Status }else{ *outflag=0; } - if (ret != MPI_SUCCESS) + if (ret != MPI_SUCCESS) error = 1; }else{ Status::empty(pstat); @@ -788,9 +790,9 @@ int Request::testall(int count, MPI_Request requests[], int* outflag, MPI_Status status[i] = *pstat; } } - if(error==1) + if (error == 1) return MPI_ERR_IN_STATUS; - else + else return MPI_SUCCESS; } @@ -821,11 +823,11 @@ void Request::iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* /*(seconds * flop/s -> total flops)*/ smpi_iprobe_sleep * speed * maxrate) ->set_name("iprobe") /* Not the entire CPU can be used when iprobing: This is important for - * the energy consumption caused by polling with iprobes. + * the energy consumption caused by polling with iprobes. * Note also that the number of flops that was * computed above contains a maxrate factor and is hence reduced (maxrate < 1) */ - ->set_bound(maxrate*speed) + ->set_bound(maxrate * speed) ->start() ->wait(); } @@ -933,9 +935,9 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status) MPI_Datatype datatype = req->type_; // FIXME Handle the case of a partial shared malloc. - if (((req->flags_ & MPI_REQ_ACCUMULATE) != 0) || - (datatype->flags() & DT_FLAG_DERIVED)) { // && (not smpi_is_shared(req->old_buf_))){ - if (not smpi_process()->replaying() && smpi_switch_data_segment(simgrid::s4u::Actor::self(), req->old_buf_)) + if (not smpi_process()->replaying() && + (((req->flags_ & MPI_REQ_ACCUMULATE) != 0) || (datatype->flags() & DT_FLAG_DERIVED))) { + if (smpi_switch_data_segment(simgrid::s4u::Actor::self(), req->old_buf_)) XBT_VERB("Privatization : We are unserializing to a zone in global memory Switch data segment "); if(datatype->flags() & DT_FLAG_DERIVED){ @@ -963,8 +965,9 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status) } if(req->detached_sender_ != nullptr){ //integrate pseudo-timing for buffering of small messages, do not bother to execute the simcall if 0 - double sleeptime = - simgrid::s4u::Actor::self()->get_host()->extension()->orecv(req->real_size()); + simgrid::s4u::Host* dst_host = simgrid::s4u::Actor::by_pid(req->dst_)->get_host(); + double sleeptime = simgrid::s4u::Actor::self()->get_host()->extension()->orecv( + req->real_size(), req->src_host_, dst_host); if (sleeptime > 0.0) { simgrid::s4u::this_actor::sleep_for(sleeptime); XBT_DEBUG("receiving size of %zu : sleep %f ", req->real_size_, sleeptime); @@ -1079,7 +1082,7 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status) // This is a finished detached request, let's return this one comms.clear(); // don't do the waitany call afterwards index = i; - if (requests[index] != MPI_REQUEST_NULL && (requests[index])->flags_ & MPI_REQ_NBC) + if (requests[index]->flags_ & MPI_REQ_NBC) finish_nbc_requests(&requests[index], 0); finish_wait(&requests[i], status); // cleanup if refcount = 0 if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags_ & MPI_REQ_NON_PERSISTENT)) @@ -1090,7 +1093,7 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status) } if (not comms.empty()) { XBT_DEBUG("Enter waitany for %zu comms", comms.size()); - int i; + ssize_t i; try{ i = simcall_comm_waitany(comms.data(), comms.size(), -1); } catch (const CancelException&) { @@ -1188,8 +1191,7 @@ int Request::waitsome(int incount, MPI_Request requests[], int *indices, MPI_Sta indices[count] = index; count++; for (int i = 0; i < incount; i++) { - if (i!=index && requests[i] != MPI_REQUEST_NULL - && not(requests[i]->flags_ & MPI_REQ_FINISHED)) { + if (i != index && requests[i] != MPI_REQUEST_NULL && not(requests[i]->flags_ & MPI_REQ_FINISHED)) { test(&requests[i], pstat,&flag); if (flag==1){ indices[count] = i;