From 52bd452d0037d90d50f48280b256628ae86eb576 Mon Sep 17 00:00:00 2001 From: chaix Date: Wed, 20 Jul 2022 11:34:26 +0300 Subject: [PATCH] Quick and dirty support of SendRecv in time-independent traces --- src/smpi/include/smpi_replay.hpp | 24 ++++++++++++-- src/smpi/internals/smpi_replay.cpp | 52 ++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/smpi/include/smpi_replay.hpp b/src/smpi/include/smpi_replay.hpp index 1f00a1921b..c5c52891fc 100644 --- a/src/smpi/include/smpi_replay.hpp +++ b/src/smpi/include/smpi_replay.hpp @@ -58,7 +58,7 @@ public: void parse(xbt::ReplayAction& action, const std::string& name) override; }; -class SendRecvParser : public ActionArgParser { +class SendOrRecvParser : public ActionArgParser { public: /* communication partner; if we send, this is the receiver and vice versa */ int partner; @@ -103,6 +103,18 @@ public: MPI_Datatype datatype2; }; +class SendRecvParser : public ActionArgParser { +public: + int dst; + int src; + int sendcount; + int recvcount; + MPI_Datatype datatype1; + MPI_Datatype datatype2; + + void parse(xbt::ReplayAction& action, const std::string& name) override; +}; + class BcastArgParser : public CollCommParser { public: void parse(xbt::ReplayAction& action, const std::string& name) override; @@ -219,7 +231,7 @@ public: void kernel(xbt::ReplayAction& action) override; }; -class SendAction : public ReplayAction { +class SendAction : public ReplayAction { RequestStorage& req_storage; public: @@ -227,7 +239,7 @@ public: void kernel(xbt::ReplayAction& action) override; }; -class RecvAction : public ReplayAction { +class RecvAction : public ReplayAction { RequestStorage& req_storage; public: @@ -282,6 +294,12 @@ public: void kernel(xbt::ReplayAction& action) override; }; +class SendRecvAction : public ReplayAction { +public: + explicit SendRecvAction() : ReplayAction("sendrecv") {} + void kernel(xbt::ReplayAction& action) override; +}; + class BarrierAction : public ReplayAction { public: explicit BarrierAction() : ReplayAction("barrier") {} diff --git a/src/smpi/internals/smpi_replay.cpp b/src/smpi/internals/smpi_replay.cpp index 218f14d988..b78e173eb1 100644 --- a/src/smpi/internals/smpi_replay.cpp +++ b/src/smpi/internals/smpi_replay.cpp @@ -162,7 +162,7 @@ void WaitTestParser::parse(simgrid::xbt::ReplayAction& action, const std::string tag = std::stoi(action[4]); } -void SendRecvParser::parse(simgrid::xbt::ReplayAction& action, const std::string&) +void SendOrRecvParser::parse(simgrid::xbt::ReplayAction& action, const std::string&) { CHECK_ACTION_PARAMS(action, 3, 1) partner = std::stoi(action[2]); @@ -190,6 +190,17 @@ void LocationParser::parse(simgrid::xbt::ReplayAction& action, const std::string line = std::stoi(action[3]); } +void SendRecvParser::parse(simgrid::xbt::ReplayAction& action, const std::string&) +{ + CHECK_ACTION_PARAMS(action, 6, 0) + sendcount = parse_integer(action[2]); + dst = std::stoi(action[3]); + recvcount = parse_integer(action[4]); + src = std::stoi(action[5]); + datatype1 = parse_datatype(action, 6); + datatype2 = parse_datatype(action, 7); +} + void BcastArgParser::parse(simgrid::xbt::ReplayAction& action, const std::string&) { CHECK_ACTION_PARAMS(action, 1, 2) @@ -445,7 +456,7 @@ void WaitAction::kernel(simgrid::xbt::ReplayAction& action) void SendAction::kernel(simgrid::xbt::ReplayAction&) { - const SendRecvParser& args = get_args(); + const SendOrRecvParser& args = get_args(); aid_t dst_traced = MPI_COMM_WORLD->group()->actor(args.partner); TRACE_smpi_comm_in( @@ -468,7 +479,7 @@ void SendAction::kernel(simgrid::xbt::ReplayAction&) void RecvAction::kernel(simgrid::xbt::ReplayAction&) { - const SendRecvParser& args = get_args(); + const SendOrRecvParser& args = get_args(); TRACE_smpi_comm_in( get_pid(), __func__, new simgrid::instr::Pt2PtTIData(get_name(), args.partner, args.size, args.tag, Datatype::encode(args.datatype1))); @@ -499,6 +510,40 @@ void RecvAction::kernel(simgrid::xbt::ReplayAction&) } } +void SendRecvAction::kernel(simgrid::xbt::ReplayAction&) +{ + XBT_DEBUG("Enters SendRecv"); + const SendRecvParser& args = get_args(); + aid_t my_proc_id = simgrid::s4u::this_actor::get_pid(); + aid_t src_traced = MPI_COMM_WORLD->group()->actor(args.src); + aid_t dst_traced = MPI_COMM_WORLD->group()->actor(args.dst); + + MPI_Status status; + int sendtag=0; + int recvtag=0; + + // FIXME: Hack the way to trace this one + auto dst_hack = std::make_shared>(); + auto src_hack = std::make_shared>(); + dst_hack->push_back(dst_traced); + src_hack->push_back(src_traced); + TRACE_smpi_comm_in(my_proc_id, __func__, + new simgrid::instr::VarCollTIData( + "sendRecv", -1, args.sendcount, + dst_hack, args.recvcount, src_hack, + simgrid::smpi::Datatype::encode(args.datatype1), simgrid::smpi::Datatype::encode(args.datatype2))); + + TRACE_smpi_send(my_proc_id, my_proc_id, dst_traced, sendtag, args.sendcount * args.datatype1->size()); + + simgrid::smpi::Request::sendrecv(nullptr, args.sendcount, args.datatype1, args.dst, sendtag, nullptr, args.recvcount, args.datatype2, args.src, + recvtag, MPI_COMM_WORLD, &status); + + TRACE_smpi_recv(src_traced, my_proc_id, recvtag); + TRACE_smpi_comm_out(my_proc_id); + XBT_DEBUG("Exits SendRecv"); + +} + void ComputeAction::kernel(simgrid::xbt::ReplayAction&) { const ComputeParser& args = get_args(); @@ -824,6 +869,7 @@ void smpi_replay_init(const char* instance_id, int rank, double start_delay_flop 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("sendRecv", [](simgrid::xbt::ReplayAction& action) { simgrid::smpi::replay::SendRecvAction().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); }); -- 2.20.1