Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Replay: Cleanup WaitAction a bit
[simgrid.git] / src / smpi / internals / smpi_replay.cpp
index 73b66cf..b12e1e1 100644 (file)
@@ -128,9 +128,6 @@ public:
   WaitAction() : ReplayAction("Wait") {}
   void kernel(simgrid::xbt::ReplayAction& action) override
   {
-    CHECK_ACTION_PARAMS(action, 0, 0)
-    MPI_Status status;
-
     std::string s = boost::algorithm::join(action, " ");
     xbt_assert(get_reqq_self()->size(), "action wait not preceded by any irecv or isend: %s", s.c_str());
     MPI_Request request = get_reqq_self()->back();
@@ -152,6 +149,7 @@ public:
     // TODO: Here we take the rank while we normally take the process id (look for my_proc_id)
     TRACE_smpi_comm_in(rank, __FUNCTION__, new simgrid::instr::NoOpTIData("wait"));
 
+    MPI_Status status;
     Request::wait(&request, &status);
 
     TRACE_smpi_comm_out(rank);
@@ -274,72 +272,51 @@ public:
   }
 };
 
-} // Replay Namespace
-
-static void action_finalize(simgrid::xbt::ReplayAction& action)
-{
-  /* Nothing to do */
-}
-
-static void action_comm_size(simgrid::xbt::ReplayAction& action)
-{
-  log_timed_action (action, smpi_process()->simulated_elapsed());
-}
-
-static void action_comm_split(simgrid::xbt::ReplayAction& action)
-{
-  log_timed_action (action, smpi_process()->simulated_elapsed());
-}
-
-static void action_comm_dup(simgrid::xbt::ReplayAction& action)
-{
-  log_timed_action (action, smpi_process()->simulated_elapsed());
-}
-
-static void action_waitall(simgrid::xbt::ReplayAction& action)
-{
-  CHECK_ACTION_PARAMS(action, 0, 0)
-  double clock = smpi_process()->simulated_elapsed();
-  const unsigned int count_requests = get_reqq_self()->size();
-
-  if (count_requests>0) {
-    MPI_Status status[count_requests];
+class CommunicatorAction : public ReplayAction<ActionArgParser> {
+public:
+  CommunicatorAction() : ReplayAction("Comm") {}
+  void kernel(simgrid::xbt::ReplayAction& action) override { /* nothing to do */}
+};
 
-    int my_proc_id_traced = Actor::self()->getPid();
-    TRACE_smpi_comm_in(my_proc_id_traced, __FUNCTION__,
-                       new simgrid::instr::Pt2PtTIData("waitAll", -1, count_requests, ""));
-    int recvs_snd[count_requests];
-    int recvs_rcv[count_requests];
-    for (unsigned int i = 0; i < count_requests; i++) {
-      const auto& req = (*get_reqq_self())[i];
-      if (req && (req->flags() & RECV)) {
-        recvs_snd[i] = req->src();
-        recvs_rcv[i] = req->dst();
-      } else
-        recvs_snd[i] = -100;
-   }
-   Request::waitall(count_requests, &(*get_reqq_self())[0], status);
-
-   for (unsigned i = 0; i < count_requests; i++) {
-     if (recvs_snd[i]!=-100)
-       TRACE_smpi_recv(recvs_snd[i], recvs_rcv[i],0);
-   }
-   TRACE_smpi_comm_out(my_proc_id_traced);
+class WaitAllAction : public ReplayAction<ActionArgParser> {
+public:
+  WaitAllAction() : ReplayAction("waitAll") {}
+  void kernel(simgrid::xbt::ReplayAction& action) override
+  {
+    const unsigned int count_requests = get_reqq_self()->size();
+
+    if (count_requests > 0) {
+      TRACE_smpi_comm_in(my_proc_id, __FUNCTION__,
+                         new simgrid::instr::Pt2PtTIData("waitAll", -1, count_requests, ""));
+      std::vector<std::pair</*sender*/int,/*recv*/int>> sender_receiver;
+      for (const auto& req : (*get_reqq_self())) {
+        if (req && (req->flags() & RECV)) {
+          sender_receiver.push_back({req->src(), req->dst()});
+        }
+      }
+      MPI_Status status[count_requests];
+      Request::waitall(count_requests, &(*get_reqq_self())[0], status);
+
+      for (auto& pair : sender_receiver) {
+        TRACE_smpi_recv(pair.first, pair.second, 0);
+      }
+      TRACE_smpi_comm_out(my_proc_id);
+    }
   }
-  log_timed_action (action, clock);
-}
-
-static void action_barrier(simgrid::xbt::ReplayAction& action)
-{
-  double clock = smpi_process()->simulated_elapsed();
-  int my_proc_id = Actor::self()->getPid();
-  TRACE_smpi_comm_in(my_proc_id, __FUNCTION__, new simgrid::instr::NoOpTIData("barrier"));
+};
 
-  Colls::barrier(MPI_COMM_WORLD);
+class BarrierAction : public ReplayAction<ActionArgParser> {
+public:
+  BarrierAction() : ReplayAction("barrier") {}
+  void kernel(simgrid::xbt::ReplayAction& action) override
+  {
+    TRACE_smpi_comm_in(my_proc_id, __FUNCTION__, new simgrid::instr::NoOpTIData("barrier"));
+    Colls::barrier(MPI_COMM_WORLD);
+    TRACE_smpi_comm_out(my_proc_id);
+  }
+};
 
-  TRACE_smpi_comm_out(my_proc_id);
-  log_timed_action (action, clock);
-}
+} // Replay Namespace
 
 static void action_bcast(simgrid::xbt::ReplayAction& action)
 {
@@ -802,10 +779,10 @@ void smpi_replay_init(int* argc, char*** argv)
   TRACE_smpi_comm_in(my_proc_id, "smpi_replay_run_init", new simgrid::instr::NoOpTIData("init"));
   TRACE_smpi_comm_out(my_proc_id);
   xbt_replay_action_register("init", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::InitAction().execute(action); });
-  xbt_replay_action_register("finalize",   simgrid::smpi::action_finalize);
-  xbt_replay_action_register("comm_size",  simgrid::smpi::action_comm_size);
-  xbt_replay_action_register("comm_split", simgrid::smpi::action_comm_split);
-  xbt_replay_action_register("comm_dup",   simgrid::smpi::action_comm_dup);
+  xbt_replay_action_register("finalize", [](simgrid::xbt::ReplayAction& action) { /* nothing to do */ });
+  xbt_replay_action_register("comm_size", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::CommunicatorAction().execute(action); });
+  xbt_replay_action_register("comm_split",[](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::CommunicatorAction().execute(action); });
+  xbt_replay_action_register("comm_dup",  [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::CommunicatorAction().execute(action); });
 
   xbt_replay_action_register("send",  [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::SendAction("send").execute(action); });
   xbt_replay_action_register("Isend", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::SendAction("Isend").execute(action); });
@@ -813,7 +790,7 @@ void smpi_replay_init(int* argc, char*** argv)
   xbt_replay_action_register("Irecv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::RecvAction("Irecv").execute(action); });
   xbt_replay_action_register("test",  [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::TestAction().execute(action); });
   xbt_replay_action_register("wait",  [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::WaitAction().execute(action); });
-  xbt_replay_action_register("waitAll",    simgrid::smpi::action_waitall);
+  xbt_replay_action_register("waitAll", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::Replay::WaitAllAction().execute(action); });
   xbt_replay_action_register("barrier",    simgrid::smpi::action_barrier);
   xbt_replay_action_register("bcast",      simgrid::smpi::action_bcast);
   xbt_replay_action_register("reduce",     simgrid::smpi::action_reduce);