]> AND Public Git Repository - simgrid.git/blobdiff - src/smpi/bindings/smpi_pmpi_request.cpp
Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Further factorization: introduce ModuleGroup::init_from_flag_value()
[simgrid.git] / src / smpi / bindings / smpi_pmpi_request.cpp
index f903f068d36fc51c8162212f73fb55bb8c2f9533..94bb62be2adfae7cbee124d49dc3a97a665b4656 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2021. The SimGrid Team. All rights reserved.          */
+/* Copyright (c) 2007-2023. 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. */
@@ -30,7 +30,7 @@ static aid_t getPid(MPI_Comm comm, int id)
   CHECK_REQUEST(7)\
   *request = MPI_REQUEST_NULL;\
   CHECK_SEND_INPUTS
-  
+
 #define CHECK_IRECV_INPUTS\
   SET_BUF1(buf)\
   CHECK_REQUEST(7)\
@@ -98,9 +98,7 @@ int PMPI_Start(MPI_Request * request)
     MPI_Request req = *request;
     aid_t my_proc_id = (req->comm() != MPI_COMM_NULL) ? simgrid::s4u::this_actor::get_pid() : -1;
     TRACE_smpi_comm_in(my_proc_id, __func__,
-                       new simgrid::instr::Pt2PtTIData("Start", req->dst(),
-                                                       req->size(),
-                                                       req->tag(), 
+                       new simgrid::instr::Pt2PtTIData("Start", MPI_COMM_WORLD->group()->rank(req->dst()), req->size(), req->tag(),
                                                        simgrid::smpi::Datatype::encode(req->type())));
     if (not TRACE_smpi_view_internals() && req->flags() & MPI_REQ_SEND)
       TRACE_smpi_send(my_proc_id, my_proc_id, getPid(req->comm(), req->dst()), req->tag(), req->size());
@@ -173,7 +171,7 @@ int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MP
   const SmpiBenchGuard suspend_bench;
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("irecv", src,
+                     new simgrid::instr::Pt2PtTIData("irecv", MPI_COMM_WORLD->group()->rank(getPid(comm, src)),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   *request = simgrid::smpi::Request::irecv(buf, count, datatype, src, tag, comm);
@@ -191,7 +189,7 @@ int PMPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dst, int t
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t trace_dst  = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("isend", dst,
+                     new simgrid::instr::Pt2PtTIData("isend", MPI_COMM_WORLD->group()->rank(trace_dst),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, trace_dst, tag, count * datatype->size());
@@ -216,7 +214,7 @@ int PMPI_Issend(const void* buf, int count, MPI_Datatype datatype, int dst, int
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t trace_dst  = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("ISsend", dst,
+                     new simgrid::instr::Pt2PtTIData("ISsend", MPI_COMM_WORLD->group()->rank(trace_dst),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, trace_dst, tag, count * datatype->size());
@@ -247,7 +245,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI
   } else {
     aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
     TRACE_smpi_comm_in(my_proc_id, __func__,
-                       new simgrid::instr::Pt2PtTIData("recv", src,
+                       new simgrid::instr::Pt2PtTIData("recv", MPI_COMM_WORLD->group()->rank(getPid(comm, src)),
                                                        count,
                                                        tag, simgrid::smpi::Datatype::encode(datatype)));
 
@@ -258,7 +256,7 @@ int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI
       aid_t src_traced = (status != MPI_STATUS_IGNORE) ? getPid(comm, status->MPI_SOURCE) : getPid(comm, src);
       TRACE_smpi_recv(src_traced, my_proc_id, tag);
     }
-    
+
     TRACE_smpi_comm_out(my_proc_id);
   }
 
@@ -273,7 +271,7 @@ int PMPI_Send(const void *buf, int count, MPI_Datatype datatype, int dst, int ta
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t dst_traced = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("send", dst,
+                     new simgrid::instr::Pt2PtTIData("send", MPI_COMM_WORLD->group()->rank(dst_traced),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   if (not TRACE_smpi_view_internals()) {
@@ -299,11 +297,10 @@ int PMPI_Bsend(const void* buf, int count, MPI_Datatype datatype, int dst, int t
   int bsend_buf_size = 0;
   void* bsend_buf = nullptr;
   smpi_process()->bsend_buffer(&bsend_buf, &bsend_buf_size);
-  int size = datatype->get_extent() * count;
-  if (bsend_buf == nullptr || bsend_buf_size < size + MPI_BSEND_OVERHEAD)
+  if (bsend_buf == nullptr || bsend_buf_size < datatype->get_extent() * count + MPI_BSEND_OVERHEAD)
     return MPI_ERR_BUFFER;
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("bsend", dst,
+                     new simgrid::instr::Pt2PtTIData("bsend", MPI_COMM_WORLD->group()->rank(dst_traced),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   if (not TRACE_smpi_view_internals()) {
@@ -324,11 +321,10 @@ int PMPI_Ibsend(const void* buf, int count, MPI_Datatype datatype, int dst, int
   int bsend_buf_size = 0;
   void* bsend_buf = nullptr;
   smpi_process()->bsend_buffer(&bsend_buf, &bsend_buf_size);
-  int size = datatype->get_extent() * count;
-  if (bsend_buf == nullptr || bsend_buf_size < size + MPI_BSEND_OVERHEAD)
+  if (bsend_buf == nullptr || bsend_buf_size < datatype->get_extent() * count + MPI_BSEND_OVERHEAD)
     return MPI_ERR_BUFFER;
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("ibsend", dst,
+                     new simgrid::instr::Pt2PtTIData("ibsend", MPI_COMM_WORLD->group()->rank(trace_dst),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, trace_dst, tag, count * datatype->size());
@@ -363,7 +359,7 @@ int PMPI_Ssend(const void* buf, int count, MPI_Datatype datatype, int dst, int t
   aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
   aid_t dst_traced = getPid(comm, dst);
   TRACE_smpi_comm_in(my_proc_id, __func__,
-                     new simgrid::instr::Pt2PtTIData("Ssend", dst,
+                     new simgrid::instr::Pt2PtTIData("Ssend", MPI_COMM_WORLD->group()->rank(dst_traced),
                                                      count,
                                                      tag, simgrid::smpi::Datatype::encode(datatype)));
   TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, tag, count * datatype->size());
@@ -404,8 +400,8 @@ int PMPI_Sendrecv(const void* sendbuf, int sendcount, MPI_Datatype sendtype, int
     retval = MPI_ERR_RANK;
   } else {
     aid_t my_proc_id = simgrid::s4u::this_actor::get_pid();
-    aid_t dst_traced = getPid(comm, dst);
-    aid_t src_traced = getPid(comm, src);
+    aid_t dst_traced = MPI_COMM_WORLD->group()->rank(getPid(comm, dst));
+    aid_t src_traced = MPI_COMM_WORLD->group()->rank(getPid(comm, src));
 
     // FIXME: Hack the way to trace this one
     auto dst_hack = std::make_shared<std::vector<int>>();
@@ -441,7 +437,10 @@ int PMPI_Sendrecv_replace(void* buf, int count, MPI_Datatype datatype, int dst,
   CHECK_BUFFER(1, buf, count, datatype)
 
   int size = datatype->get_extent() * count;
-  xbt_assert(size > 0);
+  if (size == 0)
+    return MPI_SUCCESS;
+  else if (size <0)
+    return MPI_ERR_ARG;
   std::vector<char> recvbuf(size);
   retval =
       MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf.data(), count, datatype, src, recvtag, comm, status);
@@ -466,7 +465,10 @@ int PMPI_Test(MPI_Request * request, int *flag, MPI_Status * status)
   } else {
     aid_t my_proc_id = ((*request)->comm() != MPI_COMM_NULL) ? simgrid::s4u::this_actor::get_pid() : -1;
 
-    TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("test"));
+    TRACE_smpi_comm_in(my_proc_id, __func__,
+                       new simgrid::instr::WaitTIData("test", MPI_COMM_WORLD->group()->rank((*request)->src()),
+                                                      MPI_COMM_WORLD->group()->rank((*request)->dst()),
+                                                      (*request)->tag()));
     retval = simgrid::smpi::Request::test(request,status, flag);
 
     TRACE_smpi_comm_out(my_proc_id);
@@ -588,7 +590,7 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status)
 
   simgrid::smpi::Status::empty(status);
 
-  CHECK_NULL(1, MPI_ERR_ARG, request) 
+  CHECK_NULL(1, MPI_ERR_ARG, request)
   if (*request == MPI_REQUEST_NULL) {
     retval = MPI_SUCCESS;
   } else {
@@ -601,7 +603,7 @@ int PMPI_Wait(MPI_Request * request, MPI_Status * status)
 
     aid_t my_proc_id = (*request)->comm() != MPI_COMM_NULL ? simgrid::s4u::this_actor::get_pid() : -1;
     TRACE_smpi_comm_in(my_proc_id, __func__,
-                       new simgrid::instr::WaitTIData(MPI_COMM_WORLD->group()->rank((*request)->src()),
+                       new simgrid::instr::WaitTIData("wait", MPI_COMM_WORLD->group()->rank((*request)->src()),
                                                       MPI_COMM_WORLD->group()->rank((*request)->dst()),
                                                       (*request)->tag()));
 
@@ -717,7 +719,7 @@ int PMPI_Test_cancelled(const MPI_Status* status, int* flag){
     return MPI_ERR_ARG;
   }
   *flag=simgrid::smpi::Status::cancelled(status);
-  return MPI_SUCCESS;  
+  return MPI_SUCCESS;
 }
 
 int PMPI_Status_set_cancelled(MPI_Status* status, int flag){
@@ -725,7 +727,7 @@ int PMPI_Status_set_cancelled(MPI_Status* status, int flag){
     return MPI_ERR_ARG;
   }
   simgrid::smpi::Status::set_cancelled(status,flag);
-  return MPI_SUCCESS;  
+  return MPI_SUCCESS;
 }
 
 int PMPI_Status_set_elements(MPI_Status* status, MPI_Datatype datatype, int count){