X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4d648ebbbe5705878080b9cbf1ca61497323c592..7fa992c7d6bdbfc6ee571301440b6fa017b7cd28:/src/smpi/plugins/ampi/ampi.cpp diff --git a/src/smpi/plugins/ampi/ampi.cpp b/src/smpi/plugins/ampi/ampi.cpp index e0e44e01b2..f12f6a485f 100644 --- a/src/smpi/plugins/ampi/ampi.cpp +++ b/src/smpi/plugins/ampi/ampi.cpp @@ -1,9 +1,8 @@ -/* Copyright (c) 2018-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2018-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. */ -#include #include #include #include @@ -15,50 +14,69 @@ #include "ampi.hpp" #include -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(plugin_pampi, smpi, "Logging specific to the AMPI functions"); +class AllocTracker { + std::vector memory_size_; + std::map alloc_table_; // Keep track of all allocations + +public: + void record(void* ptr, size_t size) + { + alloc_table_.emplace(ptr, size); + if (not simgrid::s4u::this_actor::is_maestro()) { + auto actor = static_cast(simgrid::s4u::this_actor::get_pid()); + if (actor >= memory_size_.size()) + memory_size_.resize(actor + 1, 0); + memory_size_[actor] += size; + } + } + + void forget(void* ptr) + { + auto elm = alloc_table_.find(ptr); + xbt_assert(elm != alloc_table_.end()); + if (not simgrid::s4u::this_actor::is_maestro()) { + auto actor = static_cast(simgrid::s4u::this_actor::get_pid()); + memory_size_.at(actor) -= elm->second; // size + } + alloc_table_.erase(elm); + } + + size_t summary() const + { + if (simgrid::s4u::this_actor::is_maestro()) + return 0; + auto actor = static_cast(simgrid::s4u::this_actor::get_pid()); + return actor < memory_size_.size() ? memory_size_[actor] : 0; + } +}; + +static AllocTracker alloc_tracker; -static std::vector memory_size(500, 0); // FIXME cheinrich This needs to be dynamic -static std::map alloc_table; // Keep track of all allocations -extern "C" XBT_PUBLIC void* _sampi_malloc(size_t); // FIXME Use declarations from sampi.h instead -extern "C" XBT_PUBLIC void _sampi_free(void* ptr); -extern "C" XBT_PUBLIC void* _sampi_calloc(size_t num_elm, size_t elem_size); -extern "C" XBT_PUBLIC void* _sampi_realloc(void* ptr, size_t size); extern "C" void* _sampi_malloc(size_t size) { void* result = xbt_malloc(size); - alloc_table.insert({result, size}); - if (not simgrid::s4u::this_actor::is_maestro()) { - memory_size[simgrid::s4u::this_actor::get_pid()] += size; - } + alloc_tracker.record(result, size); return result; } extern "C" void _sampi_free(void* ptr) { - size_t alloc_size = alloc_table.at(ptr); - int my_proc_id = simgrid::s4u::this_actor::get_pid(); - memory_size[my_proc_id] -= alloc_size; + alloc_tracker.forget(ptr); xbt_free(ptr); } extern "C" void* _sampi_calloc(size_t num_elm, size_t elem_size) { - void* result = xbt_malloc0(num_elm * elem_size); - alloc_table.insert({result, num_elm * elem_size}); - if (not simgrid::s4u::this_actor::is_maestro()) { - memory_size[simgrid::s4u::this_actor::get_pid()] += num_elm * elem_size; - } + size_t size = num_elm * elem_size; + void* result = xbt_malloc0(size); + alloc_tracker.record(result, size); return result; } extern "C" void* _sampi_realloc(void* ptr, size_t size) { + alloc_tracker.forget(ptr); void* result = xbt_realloc(ptr, size); - int old_size = alloc_table.at(ptr); - alloc_table.erase(ptr); - alloc_table.insert({result, size}); - if (not simgrid::s4u::this_actor::is_maestro()) { - memory_size[simgrid::s4u::this_actor::get_pid()] += size - old_size; - } + alloc_tracker.record(result, size); return result; } @@ -66,12 +84,12 @@ namespace simgrid { namespace smpi { namespace plugin { namespace ampi { -simgrid::xbt::signal on_iteration_in; -simgrid::xbt::signal on_iteration_out; -} -} -} -} +xbt::signal on_iteration_in; +xbt::signal on_iteration_out; +} // namespace ampi +} // namespace plugin +} // namespace smpi +} // namespace simgrid /* FIXME The following contains several times "rank() + 1". This works for one * instance, but we need to find a way to deal with this for several instances and @@ -80,26 +98,22 @@ simgrid::xbt::signal on_iteration_out; */ int APMPI_Iteration_in(MPI_Comm comm) { - smpi_bench_end(); + const SmpiBenchGuard suspend_bench; TRACE_Iteration_in(comm->rank() + 1, new simgrid::instr::NoOpTIData("iteration_in")); // implemented on instr_smpi.c - smpi_bench_begin(); return 1; } int APMPI_Iteration_out(MPI_Comm comm) { - smpi_bench_end(); + const SmpiBenchGuard suspend_bench; TRACE_Iteration_out(comm->rank() + 1, new simgrid::instr::NoOpTIData("iteration_out")); - smpi_bench_begin(); return 1; } void APMPI_Migrate(MPI_Comm comm) { - smpi_bench_end(); - int my_proc_id = simgrid::s4u::this_actor::get_pid(); - TRACE_migration_call(comm->rank() + 1, new simgrid::instr::AmpiMigrateTIData(memory_size[my_proc_id])); - smpi_bench_begin(); + const SmpiBenchGuard suspend_bench; + TRACE_migration_call(comm->rank() + 1, new simgrid::instr::AmpiMigrateTIData(alloc_tracker.summary())); } int AMPI_Iteration_in(MPI_Comm comm)