X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8fc62f8b40bf977a42f16281950ce7564cd6f91a..0df1f8b77feadf04f5e30aeeccdd16806353f330:/src/smpi/internals/smpi_replay.cpp diff --git a/src/smpi/internals/smpi_replay.cpp b/src/smpi/internals/smpi_replay.cpp index e7c7a07a15..4aa0d5c530 100644 --- a/src/smpi/internals/smpi_replay.cpp +++ b/src/smpi/internals/smpi_replay.cpp @@ -611,7 +611,7 @@ public: Request::send(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD); } else if (name == "Isend") { MPI_Request request = Request::isend(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD); - get_reqq_self()->push_back(request); + req_storage->add(request); } else { xbt_die("Don't know this action, %s", name.c_str()); } @@ -642,7 +642,7 @@ public: Request::recv(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD, &status); } else if (name == "Irecv") { MPI_Request request = Request::irecv(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD); - get_reqq_self()->push_back(request); + req_storage->add(request); } TRACE_smpi_comm_out(my_proc_id); @@ -669,8 +669,8 @@ public: TestAction(RequestStorage& storage) : ReplayAction("Test", storage) {} void kernel(simgrid::xbt::ReplayAction& action) override { - MPI_Request request = get_reqq_self()->back(); - get_reqq_self()->pop_back(); + MPI_Request request = req_storage->find(args.src, args.dst, args.tag); + req_storage->remove(request); // if request is null here, this may mean that a previous test has succeeded // Different times in traced application and replayed version may lead to this // In this case, ignore the extra calls. @@ -683,7 +683,10 @@ public: XBT_DEBUG("MPI_Test result: %d", flag); /* push back request in vector to be caught by a subsequent wait. if the test did succeed, the request is now * nullptr.*/ - get_reqq_self()->push_back(request); + if (request == MPI_REQUEST_NULL) + req_storage->addNullRequest(args.src, args.dst, args.tag); + else + req_storage->add(request); TRACE_smpi_testing_out(my_proc_id); } @@ -716,18 +719,20 @@ public: WaitAllAction(RequestStorage& storage) : ReplayAction("waitAll", storage) {} void kernel(simgrid::xbt::ReplayAction& action) override { - const unsigned int count_requests = get_reqq_self()->size(); + const unsigned int count_requests = req_storage->size(); if (count_requests > 0) { TRACE_smpi_comm_in(my_proc_id, __func__, new simgrid::instr::Pt2PtTIData("waitAll", -1, count_requests, "")); std::vector> sender_receiver; - for (const auto& req : (*get_reqq_self())) { + std::vector reqs; + req_storage->get_requests(reqs); + for (const auto& req : reqs) { 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); + Request::waitall(count_requests, &(reqs.data())[0], status); for (auto& pair : sender_receiver) { TRACE_smpi_recv(pair.first, pair.second, 0);