X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6d3020209fdad39e81987f91d375f482be14dee6..f01052cf1a094dd5df8869e4b26431b1efb6abb0:/src/instr/instr_config.cpp diff --git a/src/instr/instr_config.cpp b/src/instr/instr_config.cpp index 667dc2ad81..3c22b9b5ce 100644 --- a/src/instr/instr_config.cpp +++ b/src/instr/instr_config.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2021. 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. */ @@ -9,7 +9,6 @@ #include "simgrid/version.h" #include "src/instr/instr_private.hpp" #include "surf/surf.hpp" -#include "xbt/virtu.h" /* xbt::cmdline */ #include #ifdef WIN32 @@ -24,8 +23,7 @@ XBT_LOG_NEW_CATEGORY(instr, "Logging the behavior of the tracing system (used fo XBT_LOG_NEW_DEFAULT_SUBCATEGORY (instr_config, instr, "Configuration"); std::ofstream tracing_file; -std::map tracing_files; // TI specific -double prefix = 0.0; // TI specific +std::map tracing_files; // TI specific constexpr char OPT_TRACING_BASIC[] = "tracing/basic"; constexpr char OPT_TRACING_COMMENT_FILE[] = "tracing/comment-file"; @@ -38,7 +36,8 @@ static simgrid::config::Flag trace_enabled{ "tracing", "Enable the tracing system. You have to enable this option to use other tracing options.", false}; static simgrid::config::Flag trace_actor_enabled{ - "tracing/msg/process", // FIXME rename this flag + "tracing/actor", + {"tracing/msg/process"}, // XBT_ATTRIB_DEPRECATED_v330(option alias) "Trace the behavior of all categorized actors, grouping them by host. " "Can be used to track actor location if the simulator does actor migration.", false}; @@ -73,8 +72,8 @@ static simgrid::config::Flag trace_uncategorized{ "To use if the simulator does not use tracing categories but resource utilization have to be traced.", false}; -static simgrid::config::Flag trace_disable_destroy{ - OPT_TRACING_DISABLE_DESTROY, {"tracing/disable_destroy"}, "Disable platform containers destruction.", false}; +static simgrid::config::Flag trace_disable_destroy{OPT_TRACING_DISABLE_DESTROY, + "Disable platform containers destruction.", false}; static simgrid::config::Flag trace_basic{OPT_TRACING_BASIC, "Avoid extended events (impoverished trace file).", false}; @@ -88,8 +87,6 @@ static simgrid::config::Flag trace_disable_link{"tracing/disable_link", "Do not trace link bandwidth and latency.", false}; static simgrid::config::Flag trace_disable_power{"tracing/disable_power", "Do not trace host power.", false}; -simgrid::instr::TraceFormat simgrid::instr::trace_format = simgrid::instr::TraceFormat::Paje; - bool TRACE_needs_platform () { return TRACE_actor_is_enabled() || TRACE_vm_is_enabled() || TRACE_categorized() || TRACE_uncategorized() || @@ -166,36 +163,16 @@ bool TRACE_disable_speed() return trace_disable_power && trace_enabled; } -bool TRACE_disable_destroy () -{ - return trace_disable_destroy && trace_enabled; -} - -bool TRACE_basic () -{ - return trace_basic && trace_enabled; -} - bool TRACE_display_sizes () { return trace_display_sizes && trace_smpi_enabled && trace_enabled; } -int TRACE_precision () -{ - return simgrid::config::get_value("tracing/precision"); -} - -std::string TRACE_get_filename() -{ - return simgrid::config::get_value("tracing/filename"); -} - static void print_line(const char* option, const char* desc, const char* longdesc) { std::string str = std::string("--cfg=") + option + " "; - int len = str.size(); + int len = static_cast(str.size()); XBT_HELP("%s%*.*s %s", str.c_str(), 30 - len, 30 - len, "", desc); if (longdesc != nullptr) { XBT_HELP("%s\n", longdesc); @@ -232,23 +209,32 @@ void TRACE_help() namespace simgrid { namespace instr { - static bool trace_active = false; +TraceFormat trace_format = TraceFormat::Paje; +int trace_precision; + /************* * Callbacks * *************/ -xbt::signal Container::on_creation; -xbt::signal Container::on_destruction; - -static void on_container_creation_paje(Container& c) +xbt::signal Container::on_creation; +xbt::signal Container::on_destruction; +xbt::signal Type::on_creation; +xbt::signal LinkType::on_creation; +xbt::signal PajeEvent::on_creation; +xbt::signal PajeEvent::on_destruction; +xbt::signal StateEvent::on_destruction; +xbt::signal EntityValue::on_creation; + +static void on_container_creation_paje(const Container& c) { - double timestamp = SIMIX_get_clock(); + double timestamp = simgrid_get_clock(); std::stringstream stream; - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_CreateContainer, timestamp); + XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, static_cast(PajeEventType::CreateContainer), + timestamp); - stream << std::fixed << std::setprecision(TRACE_precision()) << PAJE_CreateContainer << " "; - stream << timestamp << " " << c.get_id() << " " << c.type_->get_id() << " " << c.father_->get_id() << " \""; + stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::CreateContainer << " "; + stream << timestamp << " " << c.get_id() << " " << c.get_type()->get_id() << " " << c.get_parent()->get_id() << " \""; if (c.get_name().find("rank-") != 0) stream << c.get_name() << "\""; else @@ -259,31 +245,30 @@ static void on_container_creation_paje(Container& c) tracing_file << stream.str() << std::endl; } -static void on_container_destruction_paje(Container& c) +static void on_container_destruction_paje(const Container& c) { - // obligation to dump previous events because they might reference the container that is about to be destroyed - TRACE_last_timestamp_to_dump = SIMIX_get_clock(); - TRACE_paje_dump_buffer(true); - // trace my destruction, but not if user requests so or if the container is root - if (not TRACE_disable_destroy() && &c != Container::get_root()) { + if (not trace_disable_destroy && &c != Container::get_root()) { std::stringstream stream; - double timestamp = SIMIX_get_clock(); + double timestamp = simgrid_get_clock(); - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_DestroyContainer, timestamp); + XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, static_cast(PajeEventType::DestroyContainer), + timestamp); - stream << std::fixed << std::setprecision(TRACE_precision()) << PAJE_DestroyContainer << " "; - stream << timestamp << " " << c.type_->get_id() << " " << c.get_id(); + stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::DestroyContainer << " "; + stream << timestamp << " " << c.get_type()->get_id() << " " << c.get_id(); XBT_DEBUG("Dump %s", stream.str().c_str()); tracing_file << stream.str() << std::endl; } } -static void on_container_creation_ti(Container& c) +static void on_container_creation_ti(const Container& c) { - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_CreateContainer, SIMIX_get_clock()); + XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, static_cast(PajeEventType::CreateContainer), + simgrid_get_clock()); // if we are in the mode with only one file static std::ofstream* ti_unique_file = nullptr; + static double prefix = 0.0; if (tracing_files.empty()) { // generate unique run id with time @@ -305,14 +290,9 @@ static void on_container_creation_ti(Container& c) tracing_files.insert({&c, ti_unique_file}); } -static void on_container_destruction_ti(Container& c) +static void on_container_destruction_ti(const Container& c) { - // obligation to dump previous events because they might reference the container that is about to be destroyed - TRACE_last_timestamp_to_dump = SIMIX_get_clock(); - TRACE_paje_dump_buffer(true); - - if (not TRACE_disable_destroy() && &c != Container::get_root()) { - XBT_DEBUG("%s: event_type=%u, timestamp=%f", __func__, PAJE_DestroyContainer, SIMIX_get_clock()); + if (not trace_disable_destroy && &c != Container::get_root()) { if (not simgrid::config::get_value("tracing/smpi/format/ti-one-file") || tracing_files.size() == 1) { tracing_files.at(&c)->close(); delete tracing_files.at(&c); @@ -321,52 +301,99 @@ static void on_container_destruction_ti(Container& c) } } +static void on_entity_value_creation(const EntityValue& value) +{ + std::stringstream stream; + XBT_DEBUG("%s: event_type=%u", __func__, static_cast(PajeEventType::DefineEntityValue)); + stream << std::fixed << std::setprecision(trace_precision) << PajeEventType::DefineEntityValue; + stream << " " << value.get_id() << " " << value.get_parent()->get_id() << " " << value.get_name(); + if (not value.get_color().empty()) + stream << " \"" << value.get_color() << "\""; + XBT_DEBUG("Dump %s", stream.str().c_str()); + tracing_file << stream.str() << std::endl; +} + +static void on_event_creation(PajeEvent& event) +{ + XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast(event.eventType_), trace_precision, + event.timestamp_); + event.stream_ << std::fixed << std::setprecision(trace_precision); + event.stream_ << event.eventType_ << " " << event.timestamp_ << " "; + event.stream_ << event.get_type()->get_id() << " " << event.get_container()->get_id(); +} + +static void on_event_destruction(const PajeEvent& event) +{ + XBT_DEBUG("Dump %s", event.stream_.str().c_str()); + tracing_file << event.stream_.str() << std::endl; +} + +static void on_state_event_destruction(const StateEvent& event) +{ + if (event.has_extra()) + *tracing_files.at(event.get_container()) << event.stream_.str() << std::endl; +} + +static void on_type_creation(const Type& type, PajeEventType event_type) +{ + if (event_type == PajeEventType::DefineLinkType) + return; // this kind of type has to be handled differently + + std::stringstream stream; + stream << std::fixed << std::setprecision(trace_precision); + XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast(event_type), trace_precision, 0.); + stream << event_type << " " << type.get_id() << " " << type.get_parent()->get_id() << " " << type.get_name(); + if (type.is_colored()) + stream << " \"" << type.get_color() << "\""; + XBT_DEBUG("Dump %s", stream.str().c_str()); + tracing_file << stream.str() << std::endl; +} + +static void on_link_type_creation(const Type& type, const Type& source, const Type& dest) +{ + std::stringstream stream; + XBT_DEBUG("%s: event_type=%u, timestamp=%.*f", __func__, static_cast(PajeEventType::DefineLinkType), + trace_precision, 0.); + stream << PajeEventType::DefineLinkType << " " << type.get_id() << " " << type.get_parent()->get_id(); + stream << " " << source.get_id() << " " << dest.get_id() << " " << type.get_name(); + XBT_DEBUG("Dump %s", stream.str().c_str()); + tracing_file << stream.str() << std::endl; +} + static void on_simulation_start() { - if (trace_active) + if (trace_active || not TRACE_is_enabled()) return; - // tracing system must be: - // - enabled (with --cfg=tracing:yes) - // - already configured (simgrid::instr::init already called) - if (TRACE_is_enabled()) { - define_callbacks(); - - XBT_DEBUG("Tracing starts"); - - /* init the tracing module to generate the right output */ - std::string format = config::get_value("tracing/smpi/format"); - XBT_DEBUG("Tracing format %s", format.c_str()); - - /* Connect the callbacks associated to the creation/destruction of containers*/ - if (format == "Paje") { - Container::on_creation.connect(on_container_creation_paje); - Container::on_destruction.connect(on_container_destruction_paje); - } else { - Container::on_creation.connect(on_container_creation_ti); - Container::on_destruction.connect(on_container_destruction_ti); - } + define_callbacks(); - /* open the trace file(s) */ - std::string filename = TRACE_get_filename(); - tracing_file.open(filename.c_str(), std::ofstream::out); - if (tracing_file.fail()) { - throw TracingError(XBT_THROW_POINT, - xbt::string_printf("Tracefile %s could not be opened for writing.", filename.c_str())); - } + XBT_DEBUG("Tracing starts"); + trace_precision = config::get_value("tracing/precision"); - XBT_DEBUG("Filename %s is open for writing", filename.c_str()); - - if (format == "Paje") { - /* output generator version */ - tracing_file << "#This file was generated using SimGrid-" << SIMGRID_VERSION_MAJOR << "." << SIMGRID_VERSION_MINOR - << "." << SIMGRID_VERSION_PATCH << std::endl; - tracing_file << "#["; - for (auto str : simgrid::xbt::cmdline) { - tracing_file << str << " "; - } - tracing_file << "]" << std::endl; - } + /* init the tracing module to generate the right output */ + std::string format = config::get_value("tracing/smpi/format"); + XBT_DEBUG("Tracing format %s", format.c_str()); + + /* open the trace file(s) */ + std::string filename = simgrid::config::get_value("tracing/filename"); + tracing_file.open(filename.c_str(), std::ofstream::out); + if (tracing_file.fail()) { + throw TracingError(XBT_THROW_POINT, + xbt::string_printf("Tracefile %s could not be opened for writing.", filename.c_str())); + } + + XBT_DEBUG("Filename %s is open for writing", filename.c_str()); + + if (format == "Paje") { + Container::on_creation.connect(on_container_creation_paje); + Container::on_destruction.connect(on_container_destruction_paje); + EntityValue::on_creation.connect(on_entity_value_creation); + Type::on_creation.connect(on_type_creation); + LinkType::on_creation.connect(on_link_type_creation); + PajeEvent::on_creation.connect(on_event_creation); + PajeEvent::on_destruction.connect(on_event_destruction); + + paje::dump_generator_version(); /* output one line comment */ std::string comment = simgrid::config::get_value("tracing/comment"); @@ -374,17 +401,17 @@ static void on_simulation_start() tracing_file << "# " << comment << std::endl; /* output comment file */ - dump_comment_file(simgrid::config::get_value(OPT_TRACING_COMMENT_FILE)); - - if (format == "Paje") { - /* output Pajé header */ - TRACE_header(TRACE_basic(), TRACE_display_sizes()); - } else - trace_format = TraceFormat::Ti; - - trace_active = true; - XBT_DEBUG("Tracing is on"); + paje::dump_comment_file(config::get_value(OPT_TRACING_COMMENT_FILE)); + paje::dump_header(trace_basic, TRACE_display_sizes()); + } else { + trace_format = TraceFormat::Ti; + Container::on_creation.connect(on_container_creation_ti); + Container::on_destruction.connect(on_container_destruction_ti); + StateEvent::on_destruction.connect(on_state_event_destruction); } + + trace_active = true; + XBT_DEBUG("Tracing is on"); } static void on_simulation_end() @@ -393,17 +420,17 @@ static void on_simulation_end() return; /* dump trace buffer */ - TRACE_last_timestamp_to_dump = surf_get_clock(); - TRACE_paje_dump_buffer(true); + last_timestamp_to_dump = surf_get_clock(); + dump_buffer(true); - const Type* root_type = Container::get_root()->type_; + const Type* root_type = Container::get_root()->get_type(); /* destroy all data structures of tracing (and free) */ delete Container::get_root(); delete root_type; /* close the trace files */ tracing_file.close(); - XBT_DEBUG("Filename %s is closed", TRACE_get_filename().c_str()); + XBT_DEBUG("Filename %s is closed", config::get_value("tracing/filename").c_str()); /* de-activate trace */ trace_active = false; @@ -429,18 +456,17 @@ void init() config::declare_flag(OPT_TRACING_FORMAT_TI_ONEFILE, "(smpi only) For replay format only : output to one file only", false); - config::alias(OPT_TRACING_FORMAT_TI_ONEFILE, {"tracing/smpi/format/ti_one_file"}); config::declare_flag("tracing/comment", "Add a comment line to the top of the trace file.", ""); config::declare_flag(OPT_TRACING_COMMENT_FILE, "Add the contents of a file as comments to the top of the trace.", ""); - config::alias(OPT_TRACING_COMMENT_FILE, {"tracing/comment_file"}); config::declare_flag("tracing/precision", "Numerical precision used when timestamping events " "(expressed in number of digits after decimal point)", 6); - /* Connect callbacks */ + /* Connect Engine callbacks */ s4u::Engine::on_platform_creation.connect(on_simulation_start); + s4u::Engine::on_time_advance.connect([](double /*time_delta*/) { dump_buffer(false); }); s4u::Engine::on_deadlock.connect(on_simulation_end); s4u::Engine::on_simulation_end.connect(on_simulation_end); }