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;
}
}
-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)
{
/* start a simulated timer */
smpi_process()->simulated_start();
- set_reqq_self(new std::vector<MPI_Request>);
}
};
}
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);
/* 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){