Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Replay: Make the 'storage' variable static
[simgrid.git] / src / smpi / internals / smpi_replay.cpp
index 50e34c2..d2727d8 100644 (file)
@@ -3,23 +3,24 @@
 /* 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 "private.hpp"
 #include "smpi_coll.hpp"
 #include "smpi_comm.hpp"
 #include "smpi_datatype.hpp"
 #include "smpi_group.hpp"
-#include "smpi_process.hpp"
 #include "smpi_request.hpp"
 #include "xbt/replay.hpp"
 #include <simgrid/smpi/replay.hpp>
+#include <src/smpi/include/private.hpp>
 
-#include <boost/algorithm/string/join.hpp>
 #include <memory>
 #include <numeric>
 #include <unordered_map>
 #include <vector>
 
 #include <tuple>
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay, smpi, "Trace Replay with SMPI");
+
 // From https://stackoverflow.com/questions/7110301/generic-hash-for-tuples-in-unordered-map-unordered-set
 // This is all just to make std::unordered_map work with std::tuple. If we need this in other places,
 // this could go into a header file.
@@ -60,8 +61,6 @@ public:
 };
 }
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay,smpi,"Trace Replay with SMPI");
-
 typedef std::tuple</*sender*/ int, /* reciever */ int, /* tag */int> req_key_t;
 typedef std::unordered_map<req_key_t, MPI_Request, hash_tuple::hash<std::tuple<int,int,int>>> req_storage_t;
 
@@ -405,33 +404,33 @@ void ReplayAction<T>::execute(simgrid::xbt::ReplayAction& action)
     log_timed_action(action, start_time);
 }
 
-  void WaitAction::kernel(simgrid::xbt::ReplayAction& action)
-  {
-    std::string s = boost::algorithm::join(action, " ");
-    xbt_assert(req_storage.size(), "action wait not preceded by any irecv or isend: %s", s.c_str());
-    MPI_Request request = req_storage.find(args.src, args.dst, args.tag);
-    req_storage.remove(request);
-
-    if (request == MPI_REQUEST_NULL) {
-      /* Assume that the trace is well formed, meaning the comm might have been caught by a MPI_test. Then just
-       * return.*/
-      return;
-    }
+void WaitAction::kernel(simgrid::xbt::ReplayAction& action)
+{
+  std::string s = boost::algorithm::join(action, " ");
+  xbt_assert(req_storage.size(), "action wait not preceded by any irecv or isend: %s", s.c_str());
+  MPI_Request request = req_storage.find(args.src, args.dst, args.tag);
+  req_storage.remove(request);
+
+  if (request == MPI_REQUEST_NULL) {
+    /* Assume that the trace is well formed, meaning the comm might have been caught by a MPI_test. Then just
+     * return.*/
+    return;
+  }
 
-    int rank = request->comm() != MPI_COMM_NULL ? request->comm()->rank() : -1;
+  int rank = request->comm() != MPI_COMM_NULL ? request->comm()->rank() : -1;
 
-    // Must be taken before Request::wait() since the request may be set to
-    // MPI_REQUEST_NULL by Request::wait!
-    bool is_wait_for_receive = (request->flags() & RECV);
-    // TODO: Here we take the rank while we normally take the process id (look for my_proc_id)
-    TRACE_smpi_comm_in(rank, __func__, new simgrid::instr::NoOpTIData("wait"));
+  // Must be taken before Request::wait() since the request may be set to
+  // MPI_REQUEST_NULL by Request::wait!
+  bool is_wait_for_receive = (request->flags() & MPI_REQ_RECV);
+  // TODO: Here we take the rank while we normally take the process id (look for my_proc_id)
+  TRACE_smpi_comm_in(rank, __func__, new simgrid::instr::WaitTIData(args.src, args.dst, args.tag));
 
-    MPI_Status status;
-    Request::wait(&request, &status);
+  MPI_Status status;
+  Request::wait(&request, &status);
 
-    TRACE_smpi_comm_out(rank);
-    if (is_wait_for_receive)
-      TRACE_smpi_recv(args.src, args.dst, args.tag);
+  TRACE_smpi_comm_out(rank);
+  if (is_wait_for_receive)
+    TRACE_smpi_recv(args.src, args.dst, args.tag);
   }
 
   void SendAction::kernel(simgrid::xbt::ReplayAction& action)
@@ -498,7 +497,7 @@ void ReplayAction<T>::execute(simgrid::xbt::ReplayAction& action)
     // Different times in traced application and replayed version may lead to this
     // In this case, ignore the extra calls.
     if (request != MPI_REQUEST_NULL) {
-      TRACE_smpi_testing_in(my_proc_id);
+      TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::NoOpTIData("test"));
 
       MPI_Status status;
       int flag = Request::test(&request, &status);
@@ -511,7 +510,7 @@ void ReplayAction<T>::execute(simgrid::xbt::ReplayAction& action)
       else
         req_storage.add(request);
 
-      TRACE_smpi_testing_out(my_proc_id);
+      TRACE_smpi_comm_out(my_proc_id);
     }
   }
 
@@ -526,7 +525,7 @@ void ReplayAction<T>::execute(simgrid::xbt::ReplayAction& action)
   }
 
   void CommunicatorAction::kernel(simgrid::xbt::ReplayAction& action)
-  { 
+  {
     /* nothing to do */
   }
 
@@ -540,7 +539,7 @@ void ReplayAction<T>::execute(simgrid::xbt::ReplayAction& action)
       std::vector<MPI_Request> reqs;
       req_storage.get_requests(reqs);
       for (const auto& req : reqs) {
-        if (req && (req->flags() & RECV)) {
+        if (req && (req->flags() & MPI_REQ_RECV)) {
           sender_receiver.push_back({req->src(), req->dst()});
         }
       }
@@ -710,7 +709,7 @@ void ReplayAction<T>::execute(simgrid::xbt::ReplayAction& action)
 } // Replay Namespace
 }} // namespace simgrid::smpi
 
-std::vector<simgrid::smpi::replay::RequestStorage> storage;
+static std::vector<simgrid::smpi::replay::RequestStorage> storage;
 /** @brief Only initialize the replay, don't do it for real */
 void smpi_replay_init(int* argc, char*** argv)
 {