X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3a1ea70a418f393ca1677074e928c664022295bd..ea74f5d95928a521a588737e81f1de94eef25d19:/src/smpi/internals/smpi_shared.cpp diff --git a/src/smpi/internals/smpi_shared.cpp b/src/smpi/internals/smpi_shared.cpp index 869f72de8f..4f9658bef8 100644 --- a/src/smpi/internals/smpi_shared.cpp +++ b/src/smpi/internals/smpi_shared.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2007-2022. 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. */ @@ -33,11 +33,13 @@ * \ | | * ---- */ -#include +#include #include +#include #include "private.hpp" #include "xbt/config.hpp" +#include "xbt/file.hpp" #include @@ -45,10 +47,10 @@ #ifndef WIN32 #include #endif -#include -#include -#include - +#include +#include +#include +#include "smpi_utils.hpp" #ifndef MAP_ANONYMOUS #define MAP_ANONYMOUS MAP_ANON #endif @@ -79,7 +81,7 @@ struct shared_data_t { }; std::unordered_map> allocs; -typedef decltype(allocs)::value_type shared_data_key_type; +using shared_data_key_type = decltype(allocs)::value_type; struct shared_metadata_t { size_t size; @@ -90,16 +92,15 @@ struct shared_metadata_t { }; std::map allocs_metadata; -std::map calls; +std::map> calls; #ifndef WIN32 -static int smpi_shared_malloc_bogusfile = -1; -static int smpi_shared_malloc_bogusfile_huge_page = -1; -static unsigned long smpi_shared_malloc_blocksize = 1UL << 20; +int smpi_shared_malloc_bogusfile = -1; +int smpi_shared_malloc_bogusfile_huge_page = -1; +unsigned long smpi_shared_malloc_blocksize = 1UL << 20; #endif } - void smpi_shared_destroy() { allocs.clear(); @@ -155,7 +156,7 @@ constexpr unsigned HUGE_PAGE_SIZE = 1U << 21; * The others are not. */ -void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int nb_shared_blocks) +void* smpi_shared_malloc_partial(size_t size, const size_t* shared_block_offsets, int nb_shared_blocks) { std::string huge_page_mount_point = simgrid::config::get_value("smpi/shared-malloc-hugepage"); bool use_huge_page = not huge_page_mount_point.empty(); @@ -208,11 +209,8 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int smpi_shared_malloc_bogusfile = mkstemp(name); XBT_DEBUG("bogusfile : %s\n", name); unlink(name); - const char* dumb = new char[smpi_shared_malloc_blocksize](); // zero initialized - ssize_t err = write(smpi_shared_malloc_bogusfile, dumb, smpi_shared_malloc_blocksize); - if(err<0) - xbt_die("Could not write bogus file for shared malloc"); - delete[] dumb; + xbt_assert(ftruncate(smpi_shared_malloc_bogusfile, smpi_shared_malloc_blocksize) == 0, + "Could not write bogus file for shared malloc"); } int mmap_base_flag = MAP_FIXED | MAP_SHARED | MAP_POPULATE; @@ -306,20 +304,57 @@ void* smpi_shared_malloc_partial(size_t size, size_t* shared_block_offsets, int void* smpi_shared_malloc_intercept(size_t size, const char* file, int line) { - if( smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()) - return ::operator new(size); - else + if( smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()){ + void* ptr = xbt_malloc(size); + if(not smpi_cfg_trace_call_use_absolute_path()) + simgrid::smpi::utils::account_malloc_size(size, simgrid::xbt::Path(file).get_base_name(), line, ptr); + else + simgrid::smpi::utils::account_malloc_size(size, file, line, ptr); + return ptr; + } else { + simgrid::smpi::utils::account_shared_size(size); return smpi_shared_malloc(size, file, line); + } } void* smpi_shared_calloc_intercept(size_t num_elm, size_t elem_size, const char* file, int line) { - if( smpi_cfg_auto_shared_malloc_thresh() == 0 || elem_size*num_elm < smpi_cfg_auto_shared_malloc_thresh()){ - void* ptr = ::operator new(elem_size*num_elm); - memset(ptr, 0, elem_size*num_elm); + size_t size = elem_size * num_elm; + if (smpi_cfg_auto_shared_malloc_thresh() == 0 || size < smpi_cfg_auto_shared_malloc_thresh()) { + void* ptr = xbt_malloc0(size); + if(not smpi_cfg_trace_call_use_absolute_path()) + simgrid::smpi::utils::account_malloc_size(size, simgrid::xbt::Path(file).get_base_name(), line, ptr); + else + simgrid::smpi::utils::account_malloc_size(size, file, line, ptr); return ptr; - } else - return smpi_shared_malloc(elem_size*num_elm, file, line); + } else { + simgrid::smpi::utils::account_shared_size(size); + return memset(smpi_shared_malloc(size, file, line), 0, size); + } +} + +void* smpi_shared_realloc_intercept(void* data, size_t size, const char* file, int line) +{ + if (size == 0) { + smpi_shared_free(data); + return nullptr; + } + if (data == nullptr) + return smpi_shared_malloc_intercept(size, file, line); + + auto meta = allocs_metadata.find(data); + if (meta == allocs_metadata.end()) { + XBT_DEBUG("Classical realloc(%p, %zu)", data, size); + return xbt_realloc(data, size); + } + + XBT_DEBUG("Shared realloc(%p, %zu) (old size: %zu)", data, size, meta->second.size); + void* ptr = smpi_shared_malloc_intercept(size, file, line); + if (ptr != data) { + memcpy(ptr, data, std::min(size, meta->second.size)); + smpi_shared_free(data); + } + return ptr; } void* smpi_shared_malloc(size_t size, const char* file, int line) @@ -328,11 +363,11 @@ void* smpi_shared_malloc(size_t size, const char* file, int line) return smpi_shared_malloc_local(size, file, line); } else if (smpi_cfg_shared_malloc() == SharedMallocType::GLOBAL) { int nb_shared_blocks = 1; - size_t shared_block_offsets[2] = {0, size}; - return smpi_shared_malloc_partial(size, shared_block_offsets, nb_shared_blocks); + const std::array shared_block_offsets = {{0, size}}; + return smpi_shared_malloc_partial(size, shared_block_offsets.data(), nb_shared_blocks); } XBT_DEBUG("Classic allocation of %zu bytes", size); - return ::operator new(size); + return xbt_malloc(size); } int smpi_is_shared(const void* ptr, std::vector> &private_blocks, size_t *offset){ @@ -403,10 +438,11 @@ std::vector> merge_private_blocks(const std::vectorsecond.data->second; @@ -417,7 +453,7 @@ void smpi_shared_free(void *ptr) if (data->count <= 0) { close(data->fd); allocs.erase(allocs.find(meta->second.data->first)); - allocs_metadata.erase(ptr); + allocs_metadata.erase(meta); XBT_DEBUG("Shared free - Local - with removal - of %p", ptr); } else { XBT_DEBUG("Shared free - Local - no removal - of %p, count = %d", ptr, data->count); @@ -431,16 +467,16 @@ void smpi_shared_free(void *ptr) munmap(ptr, meta->second.size); if(meta->second.data->second.count==0){ delete meta->second.data; - allocs_metadata.erase(ptr); + allocs_metadata.erase(meta); } }else{ - ::operator delete(ptr); + xbt_free(ptr); return; } } else { XBT_DEBUG("Classic deallocation of %p", ptr); - ::operator delete(ptr); + xbt_free(ptr); } } #endif