Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Replay: Clear all requests after waitall
[simgrid.git] / src / smpi / internals / smpi_replay.cpp
index 4aa0d5c..8ec3a36 100644 (file)
@@ -77,7 +77,6 @@ namespace hash_tuple{
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay,smpi,"Trace Replay with SMPI");
 
-static std::unordered_map<int, std::vector<MPI_Request>*> reqq;
 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;
 
@@ -108,16 +107,6 @@ static void log_timed_action(simgrid::xbt::ReplayAction& action, double clock)
   }
 }
 
-static std::vector<MPI_Request>* get_reqq_self()
-{
-  return reqq.at(simgrid::s4u::this_actor::get_pid());
-}
-
-static void set_reqq_self(std::vector<MPI_Request> *mpi_request)
-{
-  reqq.insert({simgrid::s4u::this_actor::get_pid(), mpi_request});
-}
-
 /* Helper function */
 static double parse_double(std::string string)
 {
@@ -704,7 +693,6 @@ public:
 
     /* start a simulated timer */
     smpi_process()->simulated_start();
-    set_reqq_self(new std::vector<MPI_Request>);
   }
 };
 
@@ -733,6 +721,7 @@ public:
       }
       MPI_Status status[count_requests];
       Request::waitall(count_requests, &(reqs.data())[0], status);
+      req_storage->get_store().clear();
 
       for (auto& pair : sender_receiver) {
         TRACE_smpi_recv(pair.first, pair.second, 0);
@@ -1006,20 +995,19 @@ void smpi_replay_main(int* argc, char*** argv)
 
   /* and now, finalize everything */
   /* One active process will stop. Decrease the counter*/
-  XBT_DEBUG("There are %zu elements in reqq[*]", get_reqq_self()->size());
-  if (not get_reqq_self()->empty()) {
-    unsigned int count_requests=get_reqq_self()->size();
+  unsigned int count_requests = storage[simgrid::s4u::this_actor::get_pid() - 1].size();
+  XBT_DEBUG("There are %ud elements in reqq[*]", count_requests);
+  if (count_requests > 0) {
     MPI_Request requests[count_requests];
     MPI_Status status[count_requests];
     unsigned int i=0;
 
-    for (auto const& req : *get_reqq_self()) {
-      requests[i] = req;
+    for (auto const& pair : storage[simgrid::s4u::this_actor::get_pid() - 1].get_store()) {
+      requests[i] = pair.second;
       i++;
     }
     simgrid::smpi::Request::waitall(count_requests, requests, status);
   }
-  delete get_reqq_self();
   active_processes--;
 
   if(active_processes==0){