From 9df3f18b909012a944b85248cc2fff8988a8f83a Mon Sep 17 00:00:00 2001 From: Christian Heinrich Date: Fri, 20 Apr 2018 13:02:24 +0200 Subject: [PATCH 1/1] [SMPI] Replay: Move ArgParsers + macro to simgrid/smpi/replay.hpp --- examples/smpi/replay/replay.cpp | 1 + include/simgrid/smpi/replay.hpp | 156 ++++++++++++++++++++++++ src/smpi/internals/smpi_replay.cpp | 185 ++++------------------------- tools/cmake/DefinePackages.cmake | 2 + 4 files changed, 184 insertions(+), 160 deletions(-) create mode 100644 include/simgrid/smpi/replay.hpp diff --git a/examples/smpi/replay/replay.cpp b/examples/smpi/replay/replay.cpp index 48923f933d..e6175e437f 100644 --- a/examples/smpi/replay/replay.cpp +++ b/examples/smpi/replay/replay.cpp @@ -3,6 +3,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include #include "xbt/replay.hpp" #include "smpi/smpi.h" diff --git a/include/simgrid/smpi/replay.hpp b/include/simgrid/smpi/replay.hpp new file mode 100644 index 0000000000..0b4d32f8d8 --- /dev/null +++ b/include/simgrid/smpi/replay.hpp @@ -0,0 +1,156 @@ +/* Copyright (c) 2009-2018. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ +#include "private.hpp" +#include + +#include + +#define CHECK_ACTION_PARAMS(action, mandatory, optional) \ +{ \ + if (action.size() < static_cast(mandatory + 2)) { \ + std::stringstream ss; \ + for (const auto& elem : action) { \ + ss << elem << " "; \ + } \ + THROWF(arg_error, 0, "%s replay failed.\n" \ + "%zu items were given on the line. First two should be process_id and action. " \ + "This action needs after them %lu mandatory arguments, and accepts %lu optional ones. \n" \ + "The full line that was given is:\n %s\n" \ + "Please contact the Simgrid team if support is needed", \ + __func__, action.size(), static_cast(mandatory), static_cast(optional), \ + ss.str().c_str()); \ + } \ +} + +namespace simgrid { +namespace smpi { +namespace replay { +extern MPI_Datatype MPI_DEFAULT_TYPE; + +class RequestStorage; // Forward decl + +/** + * Base class for all parsers. + */ +class ActionArgParser { +public: + virtual ~ActionArgParser() = default; + virtual void parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 0, 0) } +}; + +class WaitTestParser : public ActionArgParser { +public: + int src; + int dst; + int tag; + + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class SendRecvParser : public ActionArgParser { +public: + /* communication partner; if we send, this is the receiver and vice versa */ + int partner; + double size; + int tag; + MPI_Datatype datatype1 = MPI_DEFAULT_TYPE; + + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class ComputeParser : public ActionArgParser { +public: + /* communication partner; if we send, this is the receiver and vice versa */ + double flops; + + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class CollCommParser : public ActionArgParser { +public: + double size; + double comm_size; + double comp_size; + int send_size; + int recv_size; + int root = 0; + MPI_Datatype datatype1 = MPI_DEFAULT_TYPE; + MPI_Datatype datatype2 = MPI_DEFAULT_TYPE; + + virtual void parse(simgrid::xbt::ReplayAction& action, std::string name) = 0; +}; + +class BcastArgParser : public CollCommParser { +public: + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class ReduceArgParser : public CollCommParser { +public: + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class AllReduceArgParser : public CollCommParser { +public: + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class AllToAllArgParser : public CollCommParser { +public: + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class GatherArgParser : public CollCommParser { +public: + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class GatherVArgParser : public CollCommParser { +public: + int recv_size_sum; + std::shared_ptr> recvcounts; + std::vector disps; + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class ScatterArgParser : public CollCommParser { +public: + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class ScatterVArgParser : public CollCommParser { +public: + int recv_size_sum; + int send_size_sum; + std::shared_ptr> sendcounts; + std::vector disps; + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class ReduceScatterArgParser : public CollCommParser { +public: + int recv_size_sum; + std::shared_ptr> recvcounts; + std::vector disps; + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + +class AllToAllVArgParser : public CollCommParser { +public: + int recv_size_sum; + int send_size_sum; + std::shared_ptr> recvcounts; + std::shared_ptr> sendcounts; + std::vector senddisps; + std::vector recvdisps; + int send_buf_size; + int recv_buf_size; + void parse(simgrid::xbt::ReplayAction& action, std::string name) override; +}; + + +} +} +} diff --git a/src/smpi/internals/smpi_replay.cpp b/src/smpi/internals/smpi_replay.cpp index 8459a7f268..96bc12123c 100644 --- a/src/smpi/internals/smpi_replay.cpp +++ b/src/smpi/internals/smpi_replay.cpp @@ -11,12 +11,12 @@ #include "smpi_process.hpp" #include "smpi_request.hpp" #include "xbt/replay.hpp" +#include #include #include #include #include -#include #include #include @@ -65,24 +65,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_replay,smpi,"Trace Replay with SMPI"); typedef std::tuple req_key_t; typedef std::unordered_map>> req_storage_t; -static MPI_Datatype MPI_DEFAULT_TYPE; - -#define CHECK_ACTION_PARAMS(action, mandatory, optional) \ - { \ - if (action.size() < static_cast(mandatory + 2)) { \ - std::stringstream ss; \ - for (const auto& elem : action) { \ - ss << elem << " "; \ - } \ - THROWF(arg_error, 0, "%s replay failed.\n" \ - "%zu items were given on the line. First two should be process_id and action. " \ - "This action needs after them %lu mandatory arguments, and accepts %lu optional ones. \n" \ - "The full line that was given is:\n %s\n" \ - "Please contact the Simgrid team if support is needed", \ - __func__, action.size(), static_cast(mandatory), static_cast(optional), \ - ss.str().c_str()); \ - } \ - } static void log_timed_action(simgrid::xbt::ReplayAction& action, double clock) { @@ -102,6 +84,7 @@ namespace simgrid { namespace smpi { namespace replay { +MPI_Datatype MPI_DEFAULT_TYPE; class RequestStorage { private: @@ -157,39 +140,15 @@ public: } }; -/** - * Base class for all parsers. - */ -class ActionArgParser { -public: - virtual ~ActionArgParser() = default; - virtual void parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 0, 0) } -}; - -class WaitTestParser : public ActionArgParser { -public: - int src; - int dst; - int tag; - - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void WaitTestParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 3, 0) src = std::stoi(action[2]); dst = std::stoi(action[3]); tag = std::stoi(action[4]); } -}; -class SendRecvParser : public ActionArgParser { -public: - /* communication partner; if we send, this is the receiver and vice versa */ - int partner; - double size; - int tag; - MPI_Datatype datatype1 = MPI_DEFAULT_TYPE; - - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void SendRecvParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 3, 1) partner = std::stoi(action[2]); @@ -198,35 +157,15 @@ public: if (action.size() > 5) datatype1 = simgrid::smpi::Datatype::decode(action[5]); } -}; -class ComputeParser : public ActionArgParser { -public: - /* communication partner; if we send, this is the receiver and vice versa */ - double flops; - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void ComputeParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 1, 0) flops = parse_double(action[2]); } -}; -class CollCommParser : public ActionArgParser { -public: - double size; - double comm_size; - double comp_size; - int send_size; - int recv_size; - int root = 0; - MPI_Datatype datatype1 = MPI_DEFAULT_TYPE; - MPI_Datatype datatype2 = MPI_DEFAULT_TYPE; -}; - -class BcastArgParser : public CollCommParser { -public: - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void BcastArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 1, 2) size = parse_double(action[2]); @@ -234,11 +173,8 @@ public: if (action.size() > 4) datatype1 = simgrid::smpi::Datatype::decode(action[4]); } -}; -class ReduceArgParser : public CollCommParser { -public: - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void ReduceArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 2, 2) comm_size = parse_double(action[2]); @@ -247,11 +183,8 @@ public: if (action.size() > 5) datatype1 = simgrid::smpi::Datatype::decode(action[5]); } -}; -class AllReduceArgParser : public CollCommParser { -public: - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void AllReduceArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 2, 1) comm_size = parse_double(action[2]); @@ -259,11 +192,8 @@ public: if (action.size() > 4) datatype1 = simgrid::smpi::Datatype::decode(action[4]); } -}; -class AllToAllArgParser : public CollCommParser { -public: - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void AllToAllArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { CHECK_ACTION_PARAMS(action, 2, 1) comm_size = MPI_COMM_WORLD->size(); @@ -275,11 +205,8 @@ public: if (action.size() > 5) datatype2 = simgrid::smpi::Datatype::decode(action[5]); } -}; -class GatherArgParser : public CollCommParser { -public: - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void GatherArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { /* The structure of the gather action for the rank 0 (total 4 processes) is the following: 0 gather 68 68 0 0 0 @@ -309,14 +236,8 @@ public: datatype2 = simgrid::smpi::Datatype::decode(action[5]); } } -}; -class GatherVArgParser : public CollCommParser { -public: - int recv_size_sum; - std::shared_ptr> recvcounts; - std::vector disps; - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void GatherVArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { /* The structure of the gatherv action for the rank 0 (total 4 processes) is the following: 0 gather 68 68 10 10 10 0 0 0 @@ -370,11 +291,8 @@ public: } recv_size_sum = std::accumulate(recvcounts->begin(), recvcounts->end(), 0); } -}; -class ScatterArgParser : public CollCommParser { -public: - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void ScatterArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { /* The structure of the scatter action for the rank 0 (total 4 processes) is the following: 0 gather 68 68 0 0 0 @@ -395,15 +313,8 @@ public: if (action.size() > 6) datatype2 = simgrid::smpi::Datatype::decode(action[6]); } -}; -class ScatterVArgParser : public CollCommParser { -public: - int recv_size_sum; - int send_size_sum; - std::shared_ptr> sendcounts; - std::vector disps; - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void ScatterVArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { /* The structure of the scatterv action for the rank 0 (total 4 processes) is the following: 0 gather 68 10 10 10 68 0 0 0 @@ -430,14 +341,8 @@ public: send_size_sum = std::accumulate(sendcounts->begin(), sendcounts->end(), 0); root = (action.size() > 3 + comm_size) ? std::stoi(action[3 + comm_size]) : 0; } -}; -class ReduceScatterArgParser : public CollCommParser { -public: - int recv_size_sum; - std::shared_ptr> recvcounts; - std::vector disps; - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void ReduceScatterArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { /* The structure of the reducescatter action for the rank 0 (total 4 processes) is the following: 0 reduceScatter 275427 275427 275427 204020 11346849 0 @@ -458,19 +363,8 @@ public: } recv_size_sum = std::accumulate(recvcounts->begin(), recvcounts->end(), 0); } -}; -class AllToAllVArgParser : public CollCommParser { -public: - int recv_size_sum; - int send_size_sum; - std::shared_ptr> recvcounts; - std::shared_ptr> sendcounts; - std::vector senddisps; - std::vector recvdisps; - int send_buf_size; - int recv_buf_size; - void parse(simgrid::xbt::ReplayAction& action, std::string name) override + void AllToAllVArgParser::parse(simgrid::xbt::ReplayAction& action, std::string name) { /* The structure of the allToAllV action for the rank 0 (total 4 processes) is the following: 0 allToAllV 100 1 7 10 12 100 1 70 10 5 @@ -501,46 +395,17 @@ public: send_size_sum = std::accumulate(sendcounts->begin(), sendcounts->end(), 0); recv_size_sum = std::accumulate(recvcounts->begin(), recvcounts->end(), 0); } -}; - -/** - * Base class for all ReplayActions. - * Note that this class actually implements the behavior of each action - * while the parsing of the replay arguments is done in the @ActionArgParser class. - * In other words: The logic goes here, the setup is done by the ActionArgParser. - */ -template class ReplayAction { -protected: - const std::string name; - const int my_proc_id; - T args; - -public: - explicit ReplayAction(std::string name) : name(name), my_proc_id(simgrid::s4u::this_actor::get_pid()) {} - virtual ~ReplayAction() = default; - virtual void execute(simgrid::xbt::ReplayAction& action) - { - // Needs to be re-initialized for every action, hence here - double start_time = smpi_process()->simulated_elapsed(); - args.parse(action, name); - kernel(action); - if (name != "Init") - log_timed_action(action, start_time); - } - - virtual void kernel(simgrid::xbt::ReplayAction& action) = 0; - - void* send_buffer(int size) - { - return smpi_get_tmp_sendbuffer(size); - } - - void* recv_buffer(int size) - { - return smpi_get_tmp_recvbuffer(size); - } -}; +template +void ReplayAction::execute(simgrid::xbt::ReplayAction& action) +{ + // Needs to be re-initialized for every action, hence here + double start_time = smpi_process()->simulated_elapsed(); + args.parse(action, name); + kernel(action); + if (name != "Init") + log_timed_action(action, start_time); +} class WaitAction : public ReplayAction { private: diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 43d0ae06ae..d2338eb64d 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -253,6 +253,7 @@ set(SMPI_SRC src/smpi/include/smpi_status.hpp src/smpi/include/smpi_win.hpp src/smpi/include/smpi_topo.hpp + src/smpi/plugins/sampi_loadbalancer.cpp src/surf/network_smpi.cpp src/surf/network_ib.cpp ) @@ -669,6 +670,7 @@ set(headers_to_install include/simgrid/plugins/file_system.h include/simgrid/plugins/live_migration.h include/simgrid/plugins/load.h + include/simgrid/smpi/replay.hpp include/simgrid/instr.h include/simgrid/msg.h include/simgrid/simdag.h -- 2.20.1