From de76e8e769a510745e1a51131d8ed6cc36db7c2c Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Tue, 23 May 2017 01:03:34 +0200 Subject: [PATCH] smpi_replay: make it easier to override some actions There is even an example. --- examples/smpi/replay/replay.c | 15 ++++++++++++++- include/smpi/smpi.h | 4 +++- src/smpi/smpi_replay.cpp | 34 +++++++++++++++++++--------------- src/xbt/xbt_replay.cpp | 5 +---- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/examples/smpi/replay/replay.c b/examples/smpi/replay/replay.c index ea0d438e3e..078385a595 100644 --- a/examples/smpi/replay/replay.c +++ b/examples/smpi/replay/replay.c @@ -14,11 +14,24 @@ static void action_blah(const char* const* args) args is a strings array containing the blank-separated parameters found in the trace for this event instance. */ } +action_fun previous_send; +static void overriding_send(const char* const* args) +{ + (*previous_send)(args); // Just call the overriden symbol. That's a toy example. +} + int main(int argc, char *argv[]) { + /* Setup things and register default actions */ + smpi_replay_init(&argc, &argv); + /* Connect your callback function to the "blah" event in the trace files */ xbt_replay_action_register("blah", action_blah); + /* The send action is an override, so we have to first save its previous value in a global */ + previous_send = xbt_replay_action_get("send"); + xbt_replay_action_register("send", overriding_send); + /* The regular run of the replayer */ - smpi_replay_run(&argc, &argv); + smpi_replay_main(&argc, &argv); return 0; } diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index 2b54c71c4e..55d2e81b39 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -918,7 +918,9 @@ XBT_PUBLIC(int) smpi_process_index(); XBT_PUBLIC(void) smpi_process_init(int *argc, char ***argv); /* Trace replay specific stuff */ -XBT_PUBLIC(void) smpi_replay_run(int *argc, char***argv); +XBT_PUBLIC(void) smpi_replay_init(int* argc, char*** argv); // Only initialization +XBT_PUBLIC(void) smpi_replay_main(int* argc, char*** argv); // Launch the replay once init is done +XBT_PUBLIC(void) smpi_replay_run(int* argc, char*** argv); // Both init and start XBT_PUBLIC(void) SMPI_app_instance_register(const char *name, xbt_main_func_t code, int num_processes); XBT_PUBLIC(void) SMPI_init(); diff --git a/src/smpi/smpi_replay.cpp b/src/smpi/smpi_replay.cpp index 059bd0c453..558d0ece1e 100644 --- a/src/smpi/smpi_replay.cpp +++ b/src/smpi/smpi_replay.cpp @@ -905,8 +905,9 @@ static void action_allToAllv(const char *const *action) { }} // namespace simgrid::smpi -void smpi_replay_run(int *argc, char***argv){ - /* First initializes everything */ +/** @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); smpi_process()->mark_as_initialized(); smpi_process()->set_replaying(true); @@ -916,10 +917,8 @@ void smpi_replay_run(int *argc, char***argv){ TRACE_smpi_computing_init(rank); instr_extra_data extra = xbt_new0(s_instr_extra_data_t,1); extra->type = TRACING_INIT; - char *operation =bprintf("%s_init",__FUNCTION__); - TRACE_smpi_collective_in(rank, -1, operation, extra); - TRACE_smpi_collective_out(rank, -1, operation); - xbt_free(operation); + TRACE_smpi_collective_in(rank, -1, "smpi_replay_run_init", extra); + TRACE_smpi_collective_out(rank, -1, "smpi_replay_run_init"); xbt_replay_action_register("init", simgrid::smpi::action_init); xbt_replay_action_register("finalize", simgrid::smpi::action_finalize); xbt_replay_action_register("comm_size", simgrid::smpi::action_comm_size); @@ -947,10 +946,7 @@ void smpi_replay_run(int *argc, char***argv){ //if we have a delayed start, sleep here. if(*argc>2){ - char *endptr; - double value = strtod((*argv)[2], &endptr); - if (*endptr != '\0') - THROWF(unknown_error, 0, "%s is not a double", (*argv)[2]); + double value = xbt_str_parse_double((*argv)[2], "%s is not a double"); XBT_VERB("Delayed start for instance - Sleeping for %f flops ",value ); smpi_execute_flops(value); } else { @@ -958,8 +954,11 @@ void smpi_replay_run(int *argc, char***argv){ XBT_DEBUG("Force context switch by smpi_execute_flops - Sleeping for 0.0 flops "); smpi_execute_flops(0.0); } +} - /* Actually run the replay */ +/** @brief actually run the replay after initialization */ +void smpi_replay_main(int* argc, char*** argv) +{ simgrid::xbt::replay_runner(*argc, *argv); /* and now, finalize everything */ @@ -989,12 +988,17 @@ void smpi_replay_run(int *argc, char***argv){ instr_extra_data extra_fin = xbt_new0(s_instr_extra_data_t,1); extra_fin->type = TRACING_FINALIZE; - operation =bprintf("%s_finalize",__FUNCTION__); - TRACE_smpi_collective_in(rank, -1, operation, extra_fin); + TRACE_smpi_collective_in(smpi_process()->index(), -1, "smpi_replay_run_finalize", extra_fin); smpi_process()->finalize(); - TRACE_smpi_collective_out(rank, -1, operation); + TRACE_smpi_collective_out(smpi_process()->index(), -1, "smpi_replay_run_finalize"); TRACE_smpi_finalize(smpi_process()->index()); - xbt_free(operation); +} + +/** @brief chain a replay initialization and a replay start */ +void smpi_replay_run(int* argc, char*** argv) +{ + smpi_replay_init(argc, argv); + smpi_replay_main(argc, argv); } diff --git a/src/xbt/xbt_replay.cpp b/src/xbt/xbt_replay.cpp index 86f8c7c9d8..c05deb6ee5 100644 --- a/src/xbt/xbt_replay.cpp +++ b/src/xbt/xbt_replay.cpp @@ -36,7 +36,7 @@ public: { XBT_VERB("Prepare to replay file '%s'", filename); fs = new std::ifstream(filename, std::ifstream::in); - xbt_assert(fs->is_open(), "Cannot read file %s", filename); + xbt_assert(fs->is_open(), "Cannot read replay file '%s'", filename); } ~ReplayReader() { @@ -125,9 +125,6 @@ static void handle_action(ReplayAction* action) /** * \ingroup XBT_replay * \brief function used internally to actually run the replay - - * \param argc argc . - * \param argv argv */ int replay_runner(int argc, char* argv[]) { -- 2.20.1