X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4bb5b0cce7c4e83bd911d4b46c02d041815b3819..2818cfc3410f2a4b4aebc56514c823f2b4b5e856:/src/smpi/internals/smpi_replay.cpp diff --git a/src/smpi/internals/smpi_replay.cpp b/src/smpi/internals/smpi_replay.cpp index 14c1bff8e0..d55ff234b9 100644 --- a/src/smpi/internals/smpi_replay.cpp +++ b/src/smpi/internals/smpi_replay.cpp @@ -134,7 +134,10 @@ public: /* Sometimes we need to re-insert MPI_REQUEST_NULL but we still need src,dst and tag */ void addNullRequest(int src, int dst, int tag) { - store.insert({req_key_t(src, dst, tag), MPI_REQUEST_NULL}); + store.insert({req_key_t( + MPI_COMM_WORLD->group()->actor(src)->get_pid()-1, + MPI_COMM_WORLD->group()->actor(dst)->get_pid()-1, + tag), MPI_REQUEST_NULL}); } }; @@ -432,7 +435,7 @@ void SendAction::kernel(simgrid::xbt::ReplayAction& action) if (name == "send") { Request::send(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD); - } else if (name == "Isend") { + } else if (name == "isend") { MPI_Request request = Request::isend(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD); req_storage.add(request); } else { @@ -458,13 +461,13 @@ void RecvAction::kernel(simgrid::xbt::ReplayAction& action) if (name == "recv") { Request::recv(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD, &status); - } else if (name == "Irecv") { + } else if (name == "irecv") { MPI_Request request = Request::irecv(nullptr, args.size, args.datatype1, args.partner, args.tag, MPI_COMM_WORLD); req_storage.add(request); } TRACE_smpi_comm_out(my_proc_id); - // TODO: Check why this was only activated in the "recv" case and not in the "Irecv" case + // TODO: Check why this was only activated in the "recv" case and not in the "irecv" case if (name == "recv" && not TRACE_smpi_view_internals()) { TRACE_smpi_recv(src_traced, my_proc_id, args.tag); } @@ -697,16 +700,17 @@ void AllToAllVAction::kernel(simgrid::xbt::ReplayAction& action) } // Replay Namespace }} // namespace simgrid::smpi -static std::vector storage; +static std::unordered_map storage; /** @brief Only initialize the replay, don't do it for real */ void smpi_replay_init(int* argc, char*** argv) { - simgrid::smpi::Process::init(argc, argv); + if (not smpi_process()->initializing()){ + simgrid::smpi::ActorExt::init(argc, argv); + } smpi_process()->mark_as_initialized(); smpi_process()->set_replaying(true); int my_proc_id = simgrid::s4u::this_actor::get_pid(); - storage.resize(smpi_process_count()); TRACE_smpi_init(my_proc_id); TRACE_smpi_computing_init(my_proc_id); @@ -717,13 +721,13 @@ void smpi_replay_init(int* argc, char*** argv) 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", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); - xbt_replay_action_register("Isend", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("Isend", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); - xbt_replay_action_register("recv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("recv", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); - xbt_replay_action_register("Irecv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("Irecv", storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); - xbt_replay_action_register("test", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::TestAction(storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); - xbt_replay_action_register("wait", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAction(storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); - xbt_replay_action_register("waitall", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAllAction(storage[simgrid::s4u::this_actor::get_pid()-1]).execute(action); }); + xbt_replay_action_register("send", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("send", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); + xbt_replay_action_register("isend", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendAction("isend", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); + xbt_replay_action_register("recv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("recv", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); + xbt_replay_action_register("irecv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::RecvAction("irecv", storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); + xbt_replay_action_register("test", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::TestAction(storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); + xbt_replay_action_register("wait", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAction(storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); + xbt_replay_action_register("waitall", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::WaitAllAction(storage[simgrid::s4u::this_actor::get_pid()]).execute(action); }); xbt_replay_action_register("barrier", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::BarrierAction().execute(action); }); xbt_replay_action_register("bcast", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::BcastAction().execute(action); }); xbt_replay_action_register("reduce", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::ReduceAction().execute(action); }); @@ -745,9 +749,8 @@ void smpi_replay_init(int* argc, char*** argv) XBT_VERB("Delayed start for instance - Sleeping for %f flops ",value ); smpi_execute_flops(value); } else { - //UGLY: force a context switch to be sure that all MSG_processes begin initialization - XBT_DEBUG("Force context switch by smpi_execute_flops - Sleeping for 0.0 flops "); - smpi_execute_flops(0.0); + // Wait for the other actors to initialize also + simgrid::s4u::this_actor::yield(); } } @@ -756,18 +759,19 @@ void smpi_replay_main(int* argc, char*** argv) { static int active_processes = 0; active_processes++; + storage[simgrid::s4u::this_actor::get_pid()] = simgrid::smpi::replay::RequestStorage(); simgrid::xbt::replay_runner(*argc, *argv); /* and now, finalize everything */ /* One active process will stop. Decrease the counter*/ - unsigned int count_requests = storage[simgrid::s4u::this_actor::get_pid() - 1].size(); + unsigned int count_requests = storage[simgrid::s4u::this_actor::get_pid()].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& pair : storage[simgrid::s4u::this_actor::get_pid() - 1].get_store()) { + for (auto const& pair : storage[simgrid::s4u::this_actor::get_pid()].get_store()) { requests[i] = pair.second; i++; }