/* 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. */
-#include "simgrid/s4u/Mutex.hpp"
-#include "simgrid/s4u/ConditionVariable.hpp"
+
#include "smpi_request.hpp"
#include "mc/mc.h"
#include "src/kernel/activity/CommImpl.hpp"
#include "src/mc/mc_replay.hpp"
#include "src/smpi/include/smpi_actor.hpp"
-#include "xbt/config.hpp"
-
#include <algorithm>
}
}
}
- // This part handles the problem of non-contiguous memory (for the unserialisation at the reception)
+ // This part handles the problem of non-contiguous memory (for the unserialization at the reception)
old_buf_ = old_buf;
size_ = datatype->size() * count;
datatype->ref();
if (req->detached_)
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
+ req->cancelled_ = -1; // mark as uncancelable
XBT_DEBUG("match succeeded");
return 1;
}else return 0;
if (ref->detached_)
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
+ req->cancelled_ = -1; // mark as uncancelable
XBT_DEBUG("match succeeded");
return 1;
} else
/* factories, to hide the internal flags from the caller */
+MPI_Request Request::bsend_init(const 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::get_pid(),
+ comm->group()->actor(dst)->get_pid(), tag, comm,
+ MPI_REQ_PERSISTENT | MPI_REQ_SEND | MPI_REQ_PREPARED | MPI_REQ_BSEND);
+}
+
MPI_Request Request::send_init(const void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm)
{
MPI_REQ_PERSISTENT | MPI_REQ_RECV | MPI_REQ_PREPARED);
}
+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(),
+ comm->group()->actor(dst)->get_pid(), tag, comm,
+ MPI_REQ_NON_PERSISTENT | MPI_REQ_ISEND | MPI_REQ_SEND | MPI_REQ_BSEND);
+ request->start();
+ return request;
+}
+
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 = nullptr;
}
+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(),
+ comm->group()->actor(dst)->get_pid(), tag, comm, MPI_REQ_NON_PERSISTENT | MPI_REQ_SEND | MPI_REQ_BSEND);
+
+ request->start();
+ wait(&request, MPI_STATUS_IGNORE);
+ request = nullptr;
+}
+
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 */
mut->unlock();
} else { /* the RECV flag was not set, so this is a send */
simgrid::smpi::ActorExt* process = smpi_process_remote(simgrid::s4u::Actor::by_pid(dst_));
+ xbt_assert(process, "Actor pid=%d is gone??", dst_);
int rank = src_;
if (TRACE_smpi_view_internals()) {
TRACE_smpi_send(rank, rank, dst_, tag_, size_);
void* buf = buf_;
if ((flags_ & MPI_REQ_SSEND) == 0 &&
- ((flags_ & MPI_REQ_RMA) != 0 ||
+ ((flags_ & MPI_REQ_RMA) != 0 || (flags_ & MPI_REQ_BSEND) != 0 ||
static_cast<int>(size_) < simgrid::config::get_value<int>("smpi/send-is-detached-thresh"))) {
void *oldbuf = nullptr;
detached_ = true;
XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment ");
smpi_switch_data_segment(simgrid::s4u::Actor::by_pid(src_));
}
+ //we need this temporary buffer even for bsend, as it will be released in the copy callback and we don't have a way to differentiate it
+ //so actually ... don't use manually attached buffer space.
buf = xbt_malloc(size_);
memcpy(buf,oldbuf,size_);
XBT_DEBUG("buf %p copied into %p",oldbuf,buf);
}
if(sleeptime > 0.0){
- simcall_process_sleep(sleeptime);
+ simgrid::s4u::this_actor::sleep_for(sleeptime);
XBT_DEBUG("sending size of %zu : sleep %f ", size_, sleeptime);
}
action_ = simcall_comm_isend(
simgrid::s4u::Actor::by_pid(src_)->get_impl(), mailbox->get_impl(), size_, -1.0, buf, real_size_, &match_send,
&xbt_free_f, // how to free the userdata if a detached send fails
- not process->replaying() ? smpi_comm_copy_data_callback : &smpi_comm_null_copy_buffer_callback, this,
+ process->replaying() ? &smpi_comm_null_copy_buffer_callback : smpi_comm_copy_data_callback, this,
// detach if msg size < eager/rdv switch limit
detached_);
XBT_DEBUG("send simcall posted");
}
if(smpi_test_sleep > 0)
- simcall_process_sleep(nsleeps*smpi_test_sleep);
+ simgrid::s4u::this_actor::sleep_for(nsleeps * smpi_test_sleep);
Status::empty(status);
*flag = 1;
int Request::testsome(int incount, MPI_Request requests[], int *count, int *indices, MPI_Status status[])
{
- int ret = MPI_SUCCESS;
int error=0;
int count_dead = 0;
int flag = 0;
*count = 0;
for (int i = 0; i < incount; i++) {
if (requests[i] != MPI_REQUEST_NULL && not (requests[i]->flags_ & MPI_REQ_FINISHED)) {
- ret = test(&requests[i], pstat, &flag);
+ int ret = test(&requests[i], pstat, &flag);
if(ret!=MPI_SUCCESS)
error = 1;
if(flag) {
//multiplier to the sleeptime, to increase speed of execution, each failed testany will increase it
static int nsleeps = 1;
if(smpi_test_sleep > 0)
- simcall_process_sleep(nsleeps*smpi_test_sleep);
+ simgrid::s4u::this_actor::sleep_for(nsleeps * smpi_test_sleep);
try{
i = simcall_comm_testany(comms.data(), comms.size()); // The i-th element in comms matches!
} catch (const Exception&) {
MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat;
int flag;
int error = 0;
- int ret=MPI_SUCCESS;
*outflag = 1;
for(int i=0; i<count; i++){
if (requests[i] != MPI_REQUEST_NULL && not(requests[i]->flags_ & MPI_REQ_PREPARED)) {
- ret = test(&requests[i], pstat, &flag);
+ int ret = test(&requests[i], pstat, &flag);
if (flag){
flag=0;
requests[i]=MPI_REQUEST_NULL;
s4u::Mailbox* mailbox;
request->print_request("New iprobe");
- // We have to test both mailboxes as we don't know if we will receive one one or another
+ // We have to test both mailboxes as we don't know if we will receive one or another
if (simgrid::config::get_value<int>("smpi/async-small-thresh") > 0) {
mailbox = smpi_process()->mailbox_small();
XBT_DEBUG("Trying to probe the perm recv mailbox");
}
if(datatype->flags() & DT_FLAG_DERIVED){
- // This part handles the problem of non-contignous memory the unserialization at the reception
+ // This part handles the problem of non-contiguous memory the unserialization at the reception
if ((req->flags_ & MPI_REQ_RECV) && datatype->size() != 0)
datatype->unserialize(req->buf_, req->old_buf_, req->real_size_/datatype->size() , req->op_);
xbt_free(req->buf_);
//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<simgrid::smpi::Host>()->orecv(req->real_size());
- if(sleeptime > 0.0){
- simcall_process_sleep(sleeptime);
+ if (sleeptime > 0.0) {
+ simgrid::s4u::this_actor::sleep_for(sleeptime);
XBT_DEBUG("receiving size of %zu : sleep %f ", req->real_size_, sleeptime);
}
unref(&(req->detached_sender_));
char key[KEY_SIZE];
if(id==MPI_FORTRAN_REQUEST_NULL)
return static_cast<MPI_Request>(MPI_REQUEST_NULL);
- return static_cast<MPI_Request>(F2C::f2c_lookup()->at(get_key_id(key, id)));
-}
-
-int Request::add_f()
-{
- if (F2C::f2c_lookup() == nullptr) {
- F2C::set_f2c_lookup(new std::unordered_map<std::string, F2C*>);
- }
- char key[KEY_SIZE];
- (*(F2C::f2c_lookup()))[get_key_id(key, F2C::f2c_id())] = this;
- F2C::f2c_id_increment();
- return F2C::f2c_id()-1;
+ return static_cast<MPI_Request>(F2C::f2c_lookup()->at(get_key(key,id)));
}
void Request::free_f(int id)
{
if (id != MPI_FORTRAN_REQUEST_NULL) {
char key[KEY_SIZE];
- F2C::f2c_lookup()->erase(get_key_id(key, id));
+ F2C::f2c_lookup()->erase(get_key(key, id));
}
}
-
int Request::get_status(MPI_Request req, int* flag, MPI_Status * status){
*flag=0;