X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3d565eeaa3e81cd3b49592cfe6899962527c06a5..49e2303ab8fb6ac8f8f7a0fbbaa73528256396a7:/src/smpi/internals/instr_smpi.cpp diff --git a/src/smpi/internals/instr_smpi.cpp b/src/smpi/internals/instr_smpi.cpp index 57ac211726..4fd7b76f61 100644 --- a/src/smpi/internals/instr_smpi.cpp +++ b/src/smpi/internals/instr_smpi.cpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2010-2018. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2020. 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. */ @@ -16,9 +15,11 @@ #include #include +#include "src/smpi/include/smpi_actor.hpp" + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_smpi, instr, "Tracing SMPI"); -static std::unordered_map*> keys; +static std::unordered_map> keys; static std::map smpi_colors = {{"recv", "1 0 0"}, {"irecv", "1 0.52 0.52"}, @@ -35,7 +36,7 @@ static std::map smpi_colors = {{"recv", "1 0 0"}, {"allreduce", "1 0 1"}, {"alltoall", "0.52 0 1"}, {"alltoallv", "0.78 0.52 1"}, - {"barrier", "0 0.78 0.78"}, + {"barrier", "0 0.39 0.78"}, {"bcast", "0 0.78 0.39"}, {"gather", "1 1 0"}, {"gatherv", "1 1 0.52"}, @@ -55,7 +56,6 @@ static std::map smpi_colors = {{"recv", "1 0 0"}, {"put", "0.3 1 0"}, {"get", "0 1 0.3"}, {"accumulate", "1 0.3 0"}, - {"migration", "0.2 0.5 0.2"}, {"rput", "0.3 1 0"}, {"rget", "0 1 0.3"}, {"raccumulate", "1 0.3 0"}, @@ -74,11 +74,14 @@ static std::map smpi_colors = {{"recv", "1 0 0"}, {"win_flush", "1 0 0.3"}, {"win_flush_local", "1 0 0.8"}, {"win_flush_all", "1 0.8 0"}, - {"win_flush_local_all", "1 0 0.3"} + {"win_flush_local_all", "1 0 0.3"}, + + {"file_read", "1 1 0.3"} }; -static const char* instr_find_color(std::string state) +static const char* instr_find_color(const char* c_state) { + std::string state(c_state); boost::algorithm::to_lower(state); if (state.substr(0, 5) == "pmpi_") state = state.substr(5, std::string::npos); // Remove pmpi_ to allow for exact matches @@ -87,32 +90,20 @@ static const char* instr_find_color(std::string state) return smpi_colors.find(state)->second.c_str(); } for (const auto& pair : smpi_colors) { // Is an entry of our map a substring of this state name? - if (std::strstr(state.c_str(), pair.first.c_str()) != 0) + if (std::strstr(state.c_str(), pair.first.c_str()) != nullptr) return pair.second.c_str(); } return "0.5 0.5 0.5"; // Just in case we find nothing in the map ... } -XBT_PRIVATE container_t smpi_container(int rank) +XBT_PRIVATE simgrid::instr::Container* smpi_container(int rank) { return simgrid::instr::Container::by_name(std::string("rank-") + std::to_string(rank)); } static std::string TRACE_smpi_put_key(int src, int dst, int tag, int send) { - // get the deque for src#dst - std::string aux = - std::to_string(src) + "#" + std::to_string(dst) + "#" + std::to_string(tag) + "#" + std::to_string(send); - auto it = keys.find(aux); - std::deque* d; - - if (it == keys.end()) { - d = new std::deque; - keys[aux] = d; - } else - d = it->second; - //generate the key static unsigned long long counter = 0; counter++; @@ -120,7 +111,9 @@ static std::string TRACE_smpi_put_key(int src, int dst, int tag, int send) std::to_string(src) + "_" + std::to_string(dst) + "_" + std::to_string(tag) + "_" + std::to_string(counter); //push it - d->push_back(key); + std::string aux = + std::to_string(src) + "#" + std::to_string(dst) + "#" + std::to_string(tag) + "#" + std::to_string(send); + keys[aux].push_back(key); return key; } @@ -135,44 +128,17 @@ static std::string TRACE_smpi_get_key(int src, int dst, int tag, int send) // first posted key = TRACE_smpi_put_key(src, dst, tag, send); } else { - key = it->second->front(); - it->second->pop_front(); + key = it->second.front(); + it->second.pop_front(); + if (it->second.empty()) + keys.erase(it); } return key; } -static std::unordered_map process_category; - -void TRACE_internal_smpi_set_category (const char *category) -{ - if (not TRACE_smpi_is_enabled()) - return; - - //declare category - TRACE_category (category); - - if (category != nullptr) - process_category[SIMIX_process_self()] = category; -} - -const char *TRACE_internal_smpi_get_category () +void TRACE_smpi_setup_container(int rank, const_sg_host_t host) { - if (not TRACE_smpi_is_enabled()) - return nullptr; - - auto it = process_category.find(SIMIX_process_self()); - return (it == process_category.end()) ? nullptr : it->second.c_str(); -} - -void TRACE_smpi_release() -{ - for (auto const& elm : keys) - delete elm.second; -} - -void TRACE_smpi_setup_container(int rank, sg_host_t host) -{ - container_t father = simgrid::instr::Container::get_root(); + auto* father = simgrid::instr::Container::get_root(); if (TRACE_smpi_is_grouped()) { father = simgrid::instr::Container::by_name_or_null(host->get_name()); xbt_assert(father != nullptr, "Could not find a parent for mpi rank 'rank-%d' at function %s", rank, __func__); @@ -180,14 +146,28 @@ void TRACE_smpi_setup_container(int rank, sg_host_t host) father->create_child(std::string("rank-") + std::to_string(rank), "MPI"); // This container is of type MPI } -void TRACE_smpi_init(int rank) +void TRACE_smpi_init(int rank, const std::string& calling_func) { if (not TRACE_smpi_is_enabled()) return; + auto self = simgrid::s4u::Actor::self(); + TRACE_smpi_setup_container(rank, sg_host_self()); + simgrid::s4u::this_actor::on_exit([self](bool) { smpi_container(self->get_pid())->remove_from_parent(); }); + + simgrid::instr::StateType* state = smpi_container(rank)->get_state("MPI_STATE"); + + state->add_entity_value(calling_func, instr_find_color(calling_func.c_str())); + state->push_event(calling_func, new simgrid::instr::NoOpTIData("init")); + state->pop_event(); + if (TRACE_smpi_is_computing()) + state->add_entity_value("computing", instr_find_color("computing")); + if (TRACE_smpi_is_sleeping()) + state->add_entity_value("sleeping", instr_find_color("sleeping")); + #if HAVE_PAPI - container_t container = simgrid::instr::Container::by_name(str); + const simgrid::instr::Container* container = smpi_container(rank); papi_counter_t counters = smpi_process()->papi_counters(); for (auto const& it : counters) { @@ -195,49 +175,11 @@ void TRACE_smpi_init(int rank) * Check whether this variable already exists or not. Otherwise, it will be created * multiple times but only the last one would be used... */ - if (s_type::getOrNull(it.first.c_str(), container->type_) == nullptr) { - Type::variableNew(it.first.c_str(), "", container->type_); - } + container->type_->by_name_or_create(it.first, ""); } #endif } -void TRACE_smpi_finalize(int rank) -{ - if (not TRACE_smpi_is_enabled()) - return; - - smpi_container(rank)->remove_from_parent(); -} - -void TRACE_smpi_computing_init(int rank) -{ - //first use, initialize the color in the trace - if (TRACE_smpi_is_enabled() && TRACE_smpi_is_computing()) - smpi_container(rank)->get_state("MPI_STATE")->add_entity_value("computing", instr_find_color("computing")); -} - -void TRACE_smpi_sleeping_init(int rank) -{ - //first use, initialize the color in the trace - if (TRACE_smpi_is_enabled() && TRACE_smpi_is_sleeping()) - smpi_container(rank)->get_state("MPI_STATE")->add_entity_value("sleeping", instr_find_color("sleeping")); -} - -void TRACE_smpi_computing_in(int rank, double amount) -{ - if (TRACE_smpi_is_enabled() && TRACE_smpi_is_computing()) - smpi_container(rank) - ->get_state("MPI_STATE") - ->push_event("computing", new simgrid::instr::CpuTIData("compute", amount)); -} - -void TRACE_smpi_computing_out(int rank) -{ - if (TRACE_smpi_is_enabled() && TRACE_smpi_is_computing()) - smpi_container(rank)->get_state("MPI_STATE")->pop_event(); -} - void TRACE_smpi_sleeping_in(int rank, double duration) { if (TRACE_smpi_is_enabled() && TRACE_smpi_is_sleeping()) @@ -291,44 +233,3 @@ void TRACE_smpi_recv(int src, int dst, int tag) XBT_DEBUG("Recv tracing from %d to %d, tag %d, with key %s", src, dst, tag, key.c_str()); simgrid::instr::Container::get_root()->get_link("MPI_LINK")->end_event(smpi_container(dst), "PTP", key); } - -/**************** Functions to trace the migration of tasks. *****************/ -void TRACE_smpi_send_process_data_in(int rank) -{ - if (not TRACE_smpi_is_enabled()) return; - - smpi_container(rank)->get_state("MIGRATE_STATE")->add_entity_value("migration", instr_find_color("migration")); - smpi_container(rank)->get_state("MIGRATE_STATE")->push_event("migration"); -} - -void TRACE_smpi_send_process_data_out(int rank) -{ - if (not TRACE_smpi_is_enabled()) return; - - /* Clean the process state. */ - smpi_container(rank)->get_state("MIGRATE_STATE")->pop_event(); -} - -void TRACE_smpi_process_change_host(int rank, sg_host_t new_host) -{ - if (!TRACE_smpi_is_enabled()) return; - - /** The key is (most likely) used to match the events in the trace */ - static long long int counter = 0; - std::string key = std::to_string(counter); - counter++; - - // start link (= tell the trace that this rank moves from A to B) - container_t cont = smpi_container(rank); - simgrid::instr::Container::get_root()->get_link("MIGRATE_LINK")->start_event(cont, "M", key); - - // Destroy container of this rank on this host - cont->remove_from_parent(); - - // Setup container on new host - TRACE_smpi_setup_container(rank, new_host); - - // end link - cont = smpi_container(rank); // This points to the newly created container - simgrid::instr::Container::get_root()->get_link("MIGRATE_LINK")->end_event(cont, "M", key); -}