#include "src/mc/mc_replay.hpp"
#include "src/simix/ActorImpl.hpp"
#include "xbt/config.hpp"
+#include <xbt/ex.hpp>
#include <algorithm>
else
refcount_ = 0;
op_ = MPI_REPLACE;
+ cancelled_ = 0;
}
MPI_Comm Request::comm(){
return detached_;
}
+MPI_Datatype Request::type(){
+ return old_type_;
+}
+
size_t Request::size(){
return size_;
}
{
if((*request) != MPI_REQUEST_NULL){
(*request)->refcount_--;
- if((*request)->refcount_<0) xbt_die("wrong refcount");
+ if((*request)->refcount_ < 0) {
+ (*request)->print_request("wrong refcount");
+ xbt_die("Whoops, wrong refcount");
+ }
if((*request)->refcount_==0){
Datatype::unref((*request)->old_type_);
Comm::unref((*request)->comm_);
ref->truncated_ = 1;
if(req->detached_==1)
ref->detached_sender_=req; //tie the sender to the receiver, as it is detached and has to be freed in the receiver
+ if(req->cancelled_==0)
+ req->cancelled_=-1;//mark as uncancellable
XBT_DEBUG("match succeeded");
return 1;
}else return 0;
req->truncated_ = 1;
if(ref->detached_==1)
req->detached_sender_=ref; //tie the sender to the receiver, as it is detached and has to be freed in the receiver
+ if(req->cancelled_==0)
+ req->cancelled_=-1;//mark as uncancellable
XBT_DEBUG("match succeeded");
return 1;
} else
MPI_Request Request::send_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
{
- return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::getPid(),
+ return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, PERSISTENT | SEND | PREPARED);
}
MPI_Request Request::ssend_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
{
- return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::getPid(),
+ return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, PERSISTENT | SSEND | SEND | PREPARED);
}
MPI_Request Request::isend_init(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
{
- return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::getPid(),
+ return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, PERSISTENT | ISEND | SEND | PREPARED);
}
{
return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype,
src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : comm->group()->actor(src)->get_pid(),
- simgrid::s4u::this_actor::getPid(), tag, comm, PERSISTENT | RECV | PREPARED);
+ simgrid::s4u::this_actor::get_pid(), tag, comm, PERSISTENT | RECV | PREPARED);
}
MPI_Request Request::rma_recv_init(void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm,
{
return new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype,
src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : comm->group()->actor(src)->get_pid(),
- simgrid::s4u::this_actor::getPid(), tag, comm, PERSISTENT | RECV | PREPARED);
+ simgrid::s4u::this_actor::get_pid(), tag, comm, PERSISTENT | RECV | PREPARED);
}
MPI_Request Request::isend(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::getPid(),
+ request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, NON_PERSISTENT | ISEND | SEND);
request->start();
return request;
MPI_Request Request::issend(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::getPid(),
+ request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, NON_PERSISTENT | ISEND | SSEND | SEND);
request->start();
return request;
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,
src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : comm->group()->actor(src)->get_pid(),
- simgrid::s4u::this_actor::getPid(), tag, comm, NON_PERSISTENT | RECV);
+ simgrid::s4u::this_actor::get_pid(), tag, comm, NON_PERSISTENT | RECV);
request->start();
return request;
}
void Request::send(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::getPid(),
+ request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, NON_PERSISTENT | SEND);
request->start();
void Request::ssend(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::getPid(),
+ request = new Request(buf == MPI_BOTTOM ? nullptr : buf, count, datatype, simgrid::s4u::this_actor::get_pid(),
comm->group()->actor(dst)->get_pid(), tag, comm, NON_PERSISTENT | SSEND | SEND);
request->start();
{
MPI_Request requests[2];
MPI_Status stats[2];
- int myid = simgrid::s4u::this_actor::getPid();
+ int myid = simgrid::s4u::this_actor::get_pid();
if ((comm->group()->actor(dst)->get_pid() == myid) && (comm->group()->actor(src)->get_pid() == myid)) {
Datatype::copy(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype);
if (status != MPI_STATUS_IGNORE) {
simgrid::smpi::Process* process = smpi_process_remote(simgrid::s4u::Actor::by_pid(dst_));
- int async_small_thresh = xbt_cfg_get_int("smpi/async-small-thresh");
+ int async_small_thresh = simgrid::config::get_config<int>("smpi/async-small-thresh");
xbt_mutex_t mut = process->mailboxes_mutex();
if (async_small_thresh != 0 || (flags_ & RMA) != 0)
this->print_request("New send");
void* buf = buf_;
- if ((flags_ & SSEND) == 0 && ( (flags_ & RMA) != 0
- || static_cast<int>(size_) < xbt_cfg_get_int("smpi/send-is-detached-thresh") ) ) {
+ if ((flags_ & SSEND) == 0 &&
+ ((flags_ & RMA) != 0 ||
+ static_cast<int>(size_) < simgrid::config::get_config<int>("smpi/send-is-detached-thresh"))) {
void *oldbuf = nullptr;
detached_ = 1;
XBT_DEBUG("Send request %p is detached", this);
XBT_DEBUG("sending size of %zu : sleep %f ", size_, sleeptime);
}
- int async_small_thresh = xbt_cfg_get_int("smpi/async-small-thresh");
+ int async_small_thresh = simgrid::config::get_config<int>("smpi/async-small-thresh");
xbt_mutex_t mut=process->mailboxes_mutex();
}
}
+void Request::cancel()
+{
+ if(cancelled_!=-1)
+ cancelled_=1;
+ if (this->action_ != nullptr)
+ (boost::static_pointer_cast<simgrid::kernel::activity::CommImpl>(this->action_))->cancel();
+}
+
int Request::test(MPI_Request * request, MPI_Status * status) {
//assume that request is not MPI_REQUEST_NULL (filtered in PMPI_Test or testall before)
// to avoid deadlocks if used as a break condition, such as
Status::empty(status);
int flag = 1;
if (((*request)->flags_ & PREPARED) == 0) {
- if ((*request)->action_ != nullptr)
- flag = simcall_comm_test((*request)->action_);
+ if ((*request)->action_ != nullptr){
+ try{
+ flag = simcall_comm_test((*request)->action_);
+ }catch (xbt_ex& e) {
+ return 0;
+ }
+ }
if (flag) {
finish_wait(request,status);
nsleeps=1;//reset the number of sleeps we will do next time
if (*request != MPI_REQUEST_NULL && ((*request)->flags_ & PERSISTENT) == 0)
*request = MPI_REQUEST_NULL;
- } else if (xbt_cfg_get_boolean("smpi/grow-injected-times")){
+ } else if (simgrid::config::get_config<bool>("smpi/grow-injected-times")) {
nsleeps++;
}
}
static int nsleeps = 1;
if(smpi_test_sleep > 0)
simcall_process_sleep(nsleeps*smpi_test_sleep);
-
- i = simcall_comm_testany(comms.data(), comms.size()); // The i-th element in comms matches!
+ try{
+ i = simcall_comm_testany(comms.data(), comms.size()); // The i-th element in comms matches!
+ }catch (xbt_ex& e) {
+ return 0;
+ }
+
if (i != -1) { // -1 is not MPI_UNDEFINED but a SIMIX return code. (nothing matches)
*index = map[i];
finish_wait(&requests[*index],status);
double maxrate = xbt_cfg_get_double("smpi/iprobe-cpu-usage");
MPI_Request request = new Request(nullptr, 0, MPI_CHAR,
source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : comm->group()->actor(source)->get_pid(),
- simgrid::s4u::this_actor::getPid(), tag, comm, PERSISTENT | RECV);
+ simgrid::s4u::this_actor::get_pid(), tag, comm, PERSISTENT | RECV);
if (smpi_iprobe_sleep > 0) {
smx_activity_t iprobe_sleep = simcall_execution_start(
"iprobe", /* flops to executek*/ nsleeps * smpi_iprobe_sleep * speed * maxrate, /* priority */ 1.0,
request->print_request("New iprobe");
// 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){
- mailbox = smpi_process()->mailbox_small();
- XBT_DEBUG("Trying to probe the perm recv mailbox");
- request->action_ = simcall_comm_iprobe(mailbox, 0, &match_recv, static_cast<void*>(request));
+ if (simgrid::config::get_config<int>("smpi/async-small-thresh") > 0) {
+ mailbox = smpi_process()->mailbox_small();
+ XBT_DEBUG("Trying to probe the perm recv mailbox");
+ request->action_ = simcall_comm_iprobe(mailbox, 0, &match_recv, static_cast<void*>(request));
}
if (request->action_ == nullptr){
}
else {
*flag = 0;
- if (xbt_cfg_get_boolean("smpi/grow-injected-times"))
+ if (simgrid::config::get_config<bool>("smpi/grow-injected-times"))
nsleeps++;
}
unref(&request);
{
MPI_Request req = *request;
Status::empty(status);
+
+ if (req->cancelled_==1){
+ if (status!=MPI_STATUS_IGNORE)
+ status->cancelled=1;
+ return;
+ }
if (not((req->detached_ != 0) && ((req->flags_ & SEND) != 0)) && ((req->flags_ & PREPARED) == 0)) {
if(status != MPI_STATUS_IGNORE) {
}
if (TRACE_smpi_view_internals() && ((req->flags_ & RECV) != 0)){
- int rank = simgrid::s4u::this_actor::getPid();
+ int rank = simgrid::s4u::this_actor::get_pid();
int src_traced = (req->src_ == MPI_ANY_SOURCE ? req->real_src_ : req->src_);
TRACE_smpi_recv(src_traced, rank,req->tag_);
}
return;
}
- if ((*request)->action_ != nullptr)
- // this is not a detached send
- simcall_comm_wait((*request)->action_, -1.0);
+ if ((*request)->action_ != nullptr){
+ try{
+ // this is not a detached send
+ simcall_comm_wait((*request)->action_, -1.0);
+ }catch (xbt_ex& e) {
+ XBT_VERB("Request cancelled");
+ }
+ }
+
finish_wait(request,status);
if (*request != MPI_REQUEST_NULL && (((*request)->flags_ & NON_PERSISTENT)!=0))
}
if (size > 0) {
XBT_DEBUG("Enter waitany for %lu comms", xbt_dynar_length(&comms));
- int i = simcall_comm_waitany(&comms, -1);
+ int i=MPI_UNDEFINED;
+ try{
+ // this is not a detached send
+ i = simcall_comm_waitany(&comms, -1);
+ }catch (xbt_ex& e) {
+ XBT_INFO("request %d cancelled ",i);
+ return i;
+ }
// not MPI_UNDEFINED, as this is a simix return code
if (i != -1) {
index = c;
} else {
index = waitany(count, (MPI_Request*)requests, pstat);
+
if (index == MPI_UNDEFINED)
break;