Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define and use optimized variants for simcalls comm_testany and comm_waitany.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 19 Feb 2019 22:10:16 +0000 (23:10 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 20 Feb 2019 08:42:06 +0000 (09:42 +0100)
include/simgrid/simix.h
src/msg/msg_gos.cpp
src/s4u/s4u_Comm.cpp
src/simix/libsmx.cpp
src/smpi/mpi/smpi_request.cpp

index a489689..fb1aa18 100644 (file)
@@ -227,9 +227,12 @@ XBT_PUBLIC smx_activity_t simcall_comm_iprobe(smx_mailbox_t mbox, int type,
 
 /* FIXME: waitany is going to be a vararg function, and should take a timeout */
 XBT_PUBLIC unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double timeout);
+XBT_PUBLIC unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count,
+                                             double timeout);
 XBT_PUBLIC void simcall_comm_wait(const smx_activity_t& comm, double timeout);
 XBT_PUBLIC int simcall_comm_test(const smx_activity_t& comm);
 XBT_PUBLIC int simcall_comm_testany(smx_activity_t comms[], size_t count);
+XBT_PUBLIC int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count);
 #endif
 
 /************************** Synchro simcalls **********************************/
index 47a947b..fd90d4f 100644 (file)
@@ -480,12 +480,12 @@ int MSG_comm_testany(xbt_dynar_t comms)
   int finished_index = -1;
 
   /* Create the equivalent array with SIMIX objects: */
-  std::vector<simgrid::kernel::activity::ActivityImplPtr> s_comms;
+  std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
   s_comms.reserve(xbt_dynar_length(comms));
   msg_comm_t comm;
   unsigned int cursor;
   xbt_dynar_foreach(comms, cursor, comm) {
-    s_comms.push_back(comm->s_comm);
+    s_comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(comm->s_comm.get()));
   }
 
   msg_error_t status = MSG_OK;
@@ -576,12 +576,12 @@ int MSG_comm_waitany(xbt_dynar_t comms)
   int finished_index = -1;
 
   /* Create the equivalent array with SIMIX objects: */
-  std::vector<simgrid::kernel::activity::ActivityImplPtr> s_comms;
+  std::vector<simgrid::kernel::activity::CommImpl*> s_comms;
   s_comms.reserve(xbt_dynar_length(comms));
   msg_comm_t comm;
   unsigned int cursor;
   xbt_dynar_foreach(comms, cursor, comm) {
-    s_comms.push_back(comm->s_comm);
+    s_comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(comm->s_comm.get()));
   }
 
   msg_error_t status = MSG_OK;
index 24d6688..7d3a926 100644 (file)
@@ -31,13 +31,12 @@ Comm::~Comm()
 
 int Comm::wait_any_for(std::vector<CommPtr>* comms, double timeout)
 {
-  smx_activity_t* array = new smx_activity_t[comms->size()];
-  for (unsigned int i = 0; i < comms->size(); i++) {
-    array[i] = comms->at(i)->pimpl_;
-  }
-  int idx = simcall_comm_waitany(array, comms->size(), timeout);
-  delete[] array;
-  return idx;
+  std::unique_ptr<simgrid::kernel::activity::CommImpl* []> rcomms(
+      new simgrid::kernel::activity::CommImpl*[comms->size()]);
+  std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) {
+    return static_cast<simgrid::kernel::activity::CommImpl*>(comm->pimpl_.get());
+  });
+  return simcall_comm_waitany(rcomms.get(), comms->size(), timeout);
 }
 
 void Comm::wait_all(std::vector<CommPtr>* comms)
@@ -172,13 +171,12 @@ Comm* Comm::wait_for(double timeout)
 }
 int Comm::test_any(std::vector<CommPtr>* comms)
 {
-  smx_activity_t* array = new smx_activity_t[comms->size()];
-  for (unsigned int i = 0; i < comms->size(); i++) {
-    array[i] = comms->at(i)->pimpl_;
-  }
-  int res = simcall_comm_testany(array, comms->size());
-  delete[] array;
-  return res;
+  std::unique_ptr<simgrid::kernel::activity::CommImpl* []> rcomms(
+      new simgrid::kernel::activity::CommImpl*[comms->size()]);
+  std::transform(begin(*comms), end(*comms), rcomms.get(), [](const CommPtr& comm) {
+    return static_cast<simgrid::kernel::activity::CommImpl*>(comm->pimpl_.get());
+  });
+  return simcall_comm_testany(rcomms.get(), comms->size());
 }
 
 Comm* Comm::detach()
index 1da03e0..a746114 100644 (file)
@@ -224,6 +224,11 @@ unsigned int simcall_comm_waitany(smx_activity_t comms[], size_t count, double t
   return simcall_BODY_comm_waitany(rcomms.get(), count, timeout);
 }
 
+unsigned int simcall_comm_waitany(simgrid::kernel::activity::CommImpl* comms[], size_t count, double timeout)
+{
+  return simcall_BODY_comm_waitany(comms, count, timeout);
+}
+
 /**
  * @ingroup simix_comm_management
  */
@@ -238,6 +243,13 @@ int simcall_comm_testany(smx_activity_t comms[], size_t count)
   return simcall_BODY_comm_testany(rcomms.get(), count);
 }
 
+int simcall_comm_testany(simgrid::kernel::activity::CommImpl* comms[], size_t count)
+{
+  if (count == 0)
+    return -1;
+  return simcall_BODY_comm_testany(comms, count);
+}
+
 /**
  * @ingroup simix_comm_management
  */
index 5dbc53b..b9ba848 100644 (file)
@@ -603,7 +603,7 @@ int Request::testsome(int incount, MPI_Request requests[], int *indices, MPI_Sta
 
 int Request::testany(int count, MPI_Request requests[], int *index, MPI_Status * status)
 {
-  std::vector<simgrid::kernel::activity::ActivityImplPtr> comms;
+  std::vector<simgrid::kernel::activity::CommImpl*> comms;
   comms.reserve(count);
 
   int i;
@@ -614,7 +614,7 @@ int Request::testany(int count, MPI_Request requests[], int *index, MPI_Status *
   std::vector<int> map; /** Maps all matching comms back to their location in requests **/
   for(i = 0; i < count; i++) {
     if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->action_ && not(requests[i]->flags_ & MPI_REQ_PREPARED)) {
-      comms.push_back(requests[i]->action_);
+      comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(requests[i]->action_.get()));
       map.push_back(i);
     }
   }
@@ -842,7 +842,7 @@ void Request::wait(MPI_Request * request, MPI_Status * status)
 
 int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
 {
-  std::vector<simgrid::kernel::activity::ActivityImplPtr> comms;
+  std::vector<simgrid::kernel::activity::CommImpl*> comms;
   comms.reserve(count);
   int index = MPI_UNDEFINED;
 
@@ -855,7 +855,7 @@ int Request::waitany(int count, MPI_Request requests[], MPI_Status * status)
           not(requests[i]->flags_ & MPI_REQ_FINISHED)) {
         if (requests[i]->action_ != nullptr) {
           XBT_DEBUG("Waiting any %p ", requests[i]);
-          comms.push_back(requests[i]->action_);
+          comms.push_back(static_cast<simgrid::kernel::activity::CommImpl*>(requests[i]->action_.get()));
           map.push_back(i);
         } else {
           // This is a finished detached request, let's return this one