diff --git a/arcane/src/arcane/accelerator/core/ReduceMemoryImpl.cc b/arcane/src/arcane/accelerator/core/ReduceMemoryImpl.cc index 3a2bffde0b..2058d282ed 100644 --- a/arcane/src/arcane/accelerator/core/ReduceMemoryImpl.cc +++ b/arcane/src/arcane/accelerator/core/ReduceMemoryImpl.cc @@ -15,7 +15,7 @@ #include "arcane/utils/CheckedConvert.h" #include "arcane/utils/PlatformUtils.h" -#include "arcane/utils/IMemoryRessourceMng.h" +#include "arcane/utils/MemoryUtils.h" #include "arcane/accelerator/core/Runner.h" #include "arcane/accelerator/core/Memory.h" @@ -32,7 +32,7 @@ namespace { IMemoryAllocator* _getAllocator(eMemoryRessource r) { - return platform::getDataMemoryRessourceMng()->getAllocator(r); + return MemoryUtils::getAllocator(r); } } // namespace diff --git a/arcane/src/arcane/impl/VariableSynchronizer.cc b/arcane/src/arcane/impl/VariableSynchronizer.cc index 2ef7fb1f3a..e174494ced 100644 --- a/arcane/src/arcane/impl/VariableSynchronizer.cc +++ b/arcane/src/arcane/impl/VariableSynchronizer.cc @@ -1,6 +1,6 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- @@ -17,8 +17,8 @@ #include "arcane/utils/NotSupportedException.h" #include "arcane/utils/FatalErrorException.h" #include "arcane/utils/ITraceMng.h" -#include "arcane/utils/IMemoryRessourceMng.h" #include "arcane/utils/ValueConvert.h" +#include "arcane/utils/MemoryUtils.h" #include "arcane/utils/internal/MemoryBuffer.h" #include "arcane/core/VariableSynchronizerEventArgs.h" @@ -282,7 +282,7 @@ _buildMessage(Ref& sync_info) // implémentations MPI (i.e: BXI) ne le supportent pas. if (m_runner) { buffer_copier->setRunQueue(internal_pm->defaultQueue()); - allocator = platform::getDataMemoryRessourceMng()->getAllocator(eMemoryRessource::Device); + allocator = MemoryUtils::getAllocator(eMemoryRessource::Device); } // Créé une instance de l'implémentation diff --git a/arcane/src/arcane/materials/MeshMaterialSynchronizeBuffer.cc b/arcane/src/arcane/materials/MeshMaterialSynchronizeBuffer.cc index 561eda5a65..8c996374a4 100644 --- a/arcane/src/arcane/materials/MeshMaterialSynchronizeBuffer.cc +++ b/arcane/src/arcane/materials/MeshMaterialSynchronizeBuffer.cc @@ -1,11 +1,11 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* MeshMaterialSynchronizeBuffer.cc (C) 2000-2023 */ +/* MeshMaterialSynchronizeBuffer.cc (C) 2000-2024 */ /* */ /* Gestion des buffers pour la synchronisation de variables matériaux. */ /*---------------------------------------------------------------------------*/ @@ -15,7 +15,7 @@ #include "arcane/utils/UniqueArray.h" #include "arcane/utils/PlatformUtils.h" -#include "arcane/utils/IMemoryRessourceMng.h" +#include "arcane/utils/MemoryUtils.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -200,7 +200,7 @@ namespace impl extern "C++" ARCANE_MATERIALS_EXPORT Ref makeMultiBufferMeshMaterialSynchronizeBufferRef(eMemoryRessource memory_ressource) { - auto* a = platform::getDataMemoryRessourceMng()->getAllocator(memory_ressource); + auto* a = MemoryUtils::getAllocator(memory_ressource); auto* v = new MultiBufferMeshMaterialSynchronizeBuffer(a); return makeRef(v); } @@ -214,7 +214,7 @@ makeMultiBufferMeshMaterialSynchronizeBufferRef() extern "C++" ARCANE_MATERIALS_EXPORT Ref makeOneBufferMeshMaterialSynchronizeBufferRef(eMemoryRessource memory_ressource) { - auto* a = platform::getDataMemoryRessourceMng()->getAllocator(memory_ressource); + auto* a = MemoryUtils::getAllocator(memory_ressource); auto* v = new OneBufferMeshMaterialSynchronizeBuffer(a); return makeRef(v); } diff --git a/arcane/src/arcane/materials/internal/IndexSelecter.h b/arcane/src/arcane/materials/internal/IndexSelecter.h index e949769606..e5bec1f6e6 100644 --- a/arcane/src/arcane/materials/internal/IndexSelecter.h +++ b/arcane/src/arcane/materials/internal/IndexSelecter.h @@ -5,17 +5,19 @@ // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* IndexSelecter.h (C) 2000-2024 */ +/* IndexSelecter.h (C) 2000-2024 */ /* */ /* Selection d'index avec API accélérateur */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------*/ -/*---------------------------------------------------------------------------*/ -#include "arcane/accelerator/Filter.h" -#include "arcane/utils/IMemoryRessourceMng.h" +#include "arcane/utils/MemoryUtils.h" + #include "arcane/accelerator/core/Memory.h" +#include "arcane/accelerator/GenericFilterer.h" + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ namespace Arcane::Accelerator { @@ -38,8 +40,8 @@ class IndexSelecter m_is_accelerator_policy = isAcceleratorPolicy(runqueue->executionPolicy()); m_memory_host = eMemoryRessource(m_is_accelerator_policy ? eMemoryRessource::HostPinned : eMemoryRessource::Host); m_memory_device = eMemoryRessource(m_is_accelerator_policy ? eMemoryRessource::Device : eMemoryRessource::Host); - m_localid_select_device = UniqueArray(platform::getDataMemoryRessourceMng()->getAllocator(m_memory_device)); - m_localid_select_host = UniqueArray(platform::getDataMemoryRessourceMng()->getAllocator(m_memory_host)); + m_localid_select_device = UniqueArray(MemoryUtils::getAllocator(m_memory_device)); + m_localid_select_host = UniqueArray(MemoryUtils::getAllocator(m_memory_host)); } ~IndexSelecter() diff --git a/arcane/src/arcane/parallel/thread/SharedMemoryMessageQueue.cc b/arcane/src/arcane/parallel/thread/SharedMemoryMessageQueue.cc index b8fd8469ca..af6b559632 100644 --- a/arcane/src/arcane/parallel/thread/SharedMemoryMessageQueue.cc +++ b/arcane/src/arcane/parallel/thread/SharedMemoryMessageQueue.cc @@ -18,7 +18,7 @@ #include "arcane/utils/ITraceMng.h" #include "arcane/utils/ValueConvert.h" -#include "arcane/utils/internal/MemoryRessourceMng.h" +#include "arcane/utils/internal/MemoryResourceMng.h" #include "arcane/parallel/thread/SharedMemoryMessageQueue.h" #include "arcane/parallel/thread/IAsyncQueue.h" @@ -73,7 +73,7 @@ copyFromSender(SharedMemoryMessageRequest* sender) ARCANE_FATAL("Not enough memory for receiving message receive={0} send={1}", receive_size,send_size); - MemoryRessourceMng::genericCopy(ConstMemoryView(send_span), MutableMemoryView(receive_span)); + MemoryResourceMng::genericCopy(ConstMemoryView(send_span), MutableMemoryView(receive_span)); } /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/tests/accelerator/NumArrayUnitTest.cc b/arcane/src/arcane/tests/accelerator/NumArrayUnitTest.cc index 8e2c41e0ae..e64f6ab74d 100644 --- a/arcane/src/arcane/tests/accelerator/NumArrayUnitTest.cc +++ b/arcane/src/arcane/tests/accelerator/NumArrayUnitTest.cc @@ -15,6 +15,7 @@ #include "arcane/utils/PlatformUtils.h" #include "arcane/utils/ValueChecker.h" #include "arcane/utils/IMemoryRessourceMng.h" +#include "arcane/utils/MemoryUtils.h" #include "arcane/core/BasicUnitTest.h" #include "arcane/core/ServiceFactory.h" @@ -608,7 +609,7 @@ _executeTest4(eMemoryRessource mem_kind) constexpr int n1 = 1000; constexpr double expected_sum1 = 999000.0; - IMemoryAllocator* allocator = platform::getDataMemoryRessourceMng()->getAllocator(mem_kind); + IMemoryAllocator* allocator = MemoryUtils::getAllocator(mem_kind); { SharedArray t1; diff --git a/arcane/src/arcane/utils/IMemoryRessourceMng.h b/arcane/src/arcane/utils/IMemoryRessourceMng.h index a69cddd3d8..e9419e74e4 100644 --- a/arcane/src/arcane/utils/IMemoryRessourceMng.h +++ b/arcane/src/arcane/utils/IMemoryRessourceMng.h @@ -5,16 +5,15 @@ // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* IMemoryRessourceMng.h (C) 2000-2024 */ +/* IMemoryResourceMng.h (C) 2000-2024 */ /* */ /* Gestion des ressources mémoire pour les CPU et accélérateurs. */ /*---------------------------------------------------------------------------*/ -#ifndef ARCANE_UTILS_IMEMORYRESSOURCEMNG_H -#define ARCANE_UTILS_IMEMORYRESSOURCEMNG_H +#ifndef ARCANE_UTILS_IMEMORYRESOURCEMNG_H +#define ARCANE_UTILS_IMEMORYRESOURCEMNG_H /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -#include "arcane/utils/MemoryRessource.h" #include "arcane/utils/UtilsTypes.h" /*---------------------------------------------------------------------------*/ @@ -27,13 +26,14 @@ class IMemoryRessourceMngInternal; /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /*! + * \internal * \brief Gestion des ressources mémoire pour les CPU et accélérateurs. */ -class ARCANE_UTILS_EXPORT IMemoryRessourceMng +class ARCANE_UTILS_EXPORT IMemoryResourceMng { public: - virtual ~IMemoryRessourceMng() = default; + virtual ~IMemoryResourceMng() = default; public: @@ -42,7 +42,7 @@ class ARCANE_UTILS_EXPORT IMemoryRessourceMng * * Lève une exception si aucun allocateur pour la ressource \a v existe. */ - virtual IMemoryAllocator* getAllocator(eMemoryRessource r) = 0; + virtual IMemoryAllocator* getAllocator(eMemoryResource r) = 0; /*! * \brief Allocateur mémoire pour la ressource \a r. @@ -51,7 +51,7 @@ class ARCANE_UTILS_EXPORT IMemoryRessourceMng * exception si \a throw_if_not_found est vrai ou retourne \a nullptr * si \a throw_if_not_found est faux. */ - virtual IMemoryAllocator* getAllocator(eMemoryRessource r, bool throw_if_not_found) = 0; + virtual IMemoryAllocator* getAllocator(eMemoryResource r, bool throw_if_not_found) = 0; public: diff --git a/arcane/src/arcane/utils/MemoryRessourceMng.cc b/arcane/src/arcane/utils/MemoryResourceMng.cc similarity index 75% rename from arcane/src/arcane/utils/MemoryRessourceMng.cc rename to arcane/src/arcane/utils/MemoryResourceMng.cc index 152e6e771c..68fd1e3413 100644 --- a/arcane/src/arcane/utils/MemoryRessourceMng.cc +++ b/arcane/src/arcane/utils/MemoryResourceMng.cc @@ -5,19 +5,20 @@ // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* MemoryRessourceMng.cc (C) 2000-2024 */ +/* MemoryResourceMng.cc (C) 2000-2024 */ /* */ /* Gestion des ressources mémoire pour les CPU et accélérateurs. */ /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -#include "arcane/utils/internal/MemoryRessourceMng.h" +#include "arcane/utils/internal/MemoryResourceMng.h" #include "arcane/utils/FatalErrorException.h" #include "arcane/utils/PlatformUtils.h" #include "arcane/utils/Array.h" #include "arcane/utils/MemoryView.h" #include "arcane/utils/MemoryAllocator.h" +#include "arcane/utils/internal/MemoryUtilsInternal.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -30,42 +31,18 @@ namespace Arcane namespace { - const char* _toName(eMemoryRessource r) - { - switch (r) { - case eMemoryRessource::Unknown: - return "Unknown"; - case eMemoryRessource::Host: - return "Host"; - case eMemoryRessource::HostPinned: - return "HostPinned"; - case eMemoryRessource::Device: - return "Device"; - case eMemoryRessource::UnifiedMemory: - return "UnifiedMemory"; - } - return "Invalid"; - } - inline bool _isHost(eMemoryRessource r) { // Si on sait pas, considère qu'on est accessible de puis l'hôte. - if (r == eMemoryRessource::Unknown) + if (r == eMemoryResource::Unknown) return true; - if (r == eMemoryRessource::Host || r == eMemoryRessource::UnifiedMemory || r == eMemoryRessource::HostPinned) + if (r == eMemoryResource::Host || r == eMemoryResource::UnifiedMemory || r == eMemoryResource::HostPinned) return true; return false; } } // namespace -extern "C++" ARCANE_UTILS_EXPORT std::ostream& -operator<<(std::ostream& o, eMemoryRessource r) -{ - o << _toName(r); - return o; -} - /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -74,8 +51,8 @@ class DefaultHostMemoryCopier { public: - void copy(ConstMemoryView from, eMemoryRessource from_mem, - MutableMemoryView to, eMemoryRessource to_mem, + void copy(ConstMemoryView from, eMemoryResource from_mem, + MutableMemoryView to, eMemoryResource to_mem, [[maybe_unused]] const RunQueue* queue) override { // Sans support accélérateur, on peut juste faire un 'memcpy' si la mémoire @@ -96,8 +73,8 @@ class DefaultHostMemoryCopier /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -MemoryRessourceMng:: -MemoryRessourceMng() +MemoryResourceMng:: +MemoryResourceMng() : m_default_memory_copier(new DefaultHostMemoryCopier()) , m_copier(m_default_memory_copier.get()) { @@ -111,22 +88,22 @@ MemoryRessourceMng() /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -int MemoryRessourceMng:: -_checkValidRessource(eMemoryRessource r) +int MemoryResourceMng:: +_checkValidResource(eMemoryResource r) { int x = (int)r; - if (x <= 0 || x >= NB_MEMORY_RESSOURCE) - ARCANE_FATAL("Invalid value '{0}'. Valid range is '1' to '{1}'", x, NB_MEMORY_RESSOURCE - 1); + if (x <= 0 || x >= Arccore::ARCCORE_NB_MEMORY_RESOURCE) + ARCANE_FATAL("Invalid value '{0}'. Valid range is '1' to '{1}'", x, Arccore::ARCCORE_NB_MEMORY_RESOURCE - 1); return x; } /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -IMemoryAllocator* MemoryRessourceMng:: -getAllocator(eMemoryRessource r, bool throw_if_not_found) +IMemoryAllocator* MemoryResourceMng:: +getAllocator(eMemoryResource r, bool throw_if_not_found) { - int x = _checkValidRessource(r); + int x = _checkValidResource(r); IMemoryAllocator* a = m_allocators[x]; // Si pas d'allocateur spécifique et qu'on n'est pas sur accélérateur, @@ -148,8 +125,8 @@ getAllocator(eMemoryRessource r, bool throw_if_not_found) /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -IMemoryAllocator* MemoryRessourceMng:: -getAllocator(eMemoryRessource r) +IMemoryAllocator* MemoryResourceMng:: +getAllocator(eMemoryResource r) { return getAllocator(r, true); } @@ -157,19 +134,19 @@ getAllocator(eMemoryRessource r) /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -void MemoryRessourceMng:: -setAllocator(eMemoryRessource r, IMemoryAllocator* allocator) +void MemoryResourceMng:: +setAllocator(eMemoryResource r, IMemoryAllocator* allocator) { - int x = _checkValidRessource(r); + int x = _checkValidResource(r); m_allocators[x] = allocator; } /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -void MemoryRessourceMng:: -copy(ConstMemoryView from, eMemoryRessource from_mem, - MutableMemoryView to, eMemoryRessource to_mem, const RunQueue* queue) +void MemoryResourceMng:: +copy(ConstMemoryView from, eMemoryResource from_mem, + MutableMemoryView to, eMemoryResource to_mem, const RunQueue* queue) { Int64 from_size = from.bytes().size(); Int64 to_size = to.bytes().size(); @@ -182,11 +159,11 @@ copy(ConstMemoryView from, eMemoryRessource from_mem, /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -void MemoryRessourceMng:: +void MemoryResourceMng:: genericCopy(ConstMemoryView from, MutableMemoryView to) { - IMemoryRessourceMng* mrm = platform::getDataMemoryRessourceMng(); - eMemoryRessource mem_type = eMemoryRessource::Unknown; + IMemoryResourceMng* mrm = MemoryUtils::getDataMemoryResourceMng(); + eMemoryResource mem_type = eMemoryResource::Unknown; mrm->_internal()->copy(from, mem_type, to, mem_type, nullptr); } diff --git a/arcane/src/arcane/utils/MemoryUtils.cc b/arcane/src/arcane/utils/MemoryUtils.cc index 7821dc8a21..c05835340c 100644 --- a/arcane/src/arcane/utils/MemoryUtils.cc +++ b/arcane/src/arcane/utils/MemoryUtils.cc @@ -17,6 +17,8 @@ #include "arcane/utils/MemoryAllocator.h" #include "arcane/utils/IMemoryRessourceMng.h" #include "arcane/utils/internal/IMemoryRessourceMngInternal.h" +#include "arcane/utils/internal/MemoryUtilsInternal.h" +#include "arcane/utils/internal/MemoryResourceMng.h" /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -24,13 +26,44 @@ namespace Arcane { +namespace +{ + IMemoryAllocator* global_accelerator_host_memory_allocator = nullptr; + MemoryResourceMng global_default_data_memory_resource_mng; + IMemoryRessourceMng* global_data_memory_resource_mng = nullptr; +} // namespace + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +IMemoryRessourceMng* MemoryUtils:: +setDataMemoryResourceMng(IMemoryRessourceMng* mng) +{ + ARCANE_CHECK_POINTER(mng); + IMemoryRessourceMng* old = global_data_memory_resource_mng; + global_data_memory_resource_mng = mng; + return old; +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +IMemoryRessourceMng* MemoryUtils:: +getDataMemoryResourceMng() +{ + IMemoryRessourceMng* a = global_data_memory_resource_mng; + if (!a) + return &global_default_data_memory_resource_mng; + return a; +} + /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ IMemoryAllocator* MemoryUtils:: getDefaultDataAllocator() { - return platform::getDefaultDataAllocator(); + return getDataMemoryResourceMng()->getAllocator(eMemoryResource::UnifiedMemory); } /*---------------------------------------------------------------------------*/ @@ -39,11 +72,11 @@ getDefaultDataAllocator() IMemoryAllocator* MemoryUtils:: getDeviceOrHostAllocator() { - IMemoryRessourceMng* mrm = platform::getDataMemoryRessourceMng(); - IMemoryAllocator* a = mrm->getAllocator(eMemoryRessource::Device,false); + IMemoryRessourceMng* mrm = getDataMemoryResourceMng(); + IMemoryAllocator* a = mrm->getAllocator(eMemoryResource::Device, false); if (a) return a; - return mrm->getAllocator(eMemoryRessource::Host); + return mrm->getAllocator(eMemoryResource::Host); } /*---------------------------------------------------------------------------*/ @@ -58,11 +91,19 @@ getDefaultDataAllocator(eMemoryLocationHint hint) /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ +IMemoryAllocator* MemoryUtils:: +getAllocator(eMemoryRessource mem_resource) +{ + return getDataMemoryResourceMng()->getAllocator(mem_resource); +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + MemoryAllocationOptions MemoryUtils:: -getAllocationOptions(eMemoryRessource mem_ressource) +getAllocationOptions(eMemoryRessource mem_resource) { - IMemoryAllocator* allocator = platform::getDataMemoryRessourceMng()->getAllocator(mem_ressource); - return MemoryAllocationOptions(allocator); + return MemoryAllocationOptions(getAllocator(mem_resource)); } /*---------------------------------------------------------------------------*/ @@ -77,6 +118,26 @@ getAllocatorForMostlyReadOnlyData() /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ +IMemoryAllocator* MemoryUtils:: +getAcceleratorHostMemoryAllocator() +{ + return global_accelerator_host_memory_allocator; +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +IMemoryAllocator* MemoryUtils:: +setAcceleratorHostMemoryAllocator(IMemoryAllocator* a) +{ + IMemoryAllocator* old = global_accelerator_host_memory_allocator; + global_accelerator_host_memory_allocator = a; + return old; +} + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + Int64 MemoryUtils::impl:: computeCapacity(Int64 size) { @@ -96,7 +157,7 @@ void MemoryUtils:: copy(MutableMemoryView destination, eMemoryRessource destination_mem, ConstMemoryView source, eMemoryRessource source_mem, const RunQueue* queue) { - IMemoryRessourceMng* mrm = platform::getDataMemoryRessourceMng(); + IMemoryRessourceMng* mrm = getDataMemoryResourceMng(); mrm->_internal()->copy(source, destination_mem, destination, source_mem, queue); } diff --git a/arcane/src/arcane/utils/MemoryUtils.h b/arcane/src/arcane/utils/MemoryUtils.h index ed5033a21b..004cb5128b 100644 --- a/arcane/src/arcane/utils/MemoryUtils.h +++ b/arcane/src/arcane/utils/MemoryUtils.h @@ -47,8 +47,8 @@ getDefaultDataAllocator(); * * Si un runtime accélérateur est initialisé, l'allocateur retourné permet * d'allouer en utilisant la mémoire de l'accélérateur par défaut - * (eMemoryRessource::Device). Sinon, utilise l'allocateur de l'hôte - * (eMemoryRessource::Host). + * (eMemoryResource::Device). Sinon, utilise l'allocateur de l'hôte + * (eMemoryResource::Host). */ extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* getDeviceOrHostAllocator(); @@ -79,18 +79,39 @@ getAllocatorForMostlyReadOnlyData(); /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /*! - * \brief Allocateur par défaut pour la ressource \a mem_ressource. + * \brief Allocateur spécifique pour les accélérateurs. + * + * Si non nul, cet allocateur permet d'allouer de la mémoire sur l'hôte en + * utilisant le runtime spécique de l'allocateur. + */ +extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* +getAcceleratorHostMemoryAllocator(); + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +/*! + * \brief Allocation par défaut pour la ressource \a mem_resource. * * Lève une exception si aucune allocateur n'est disponible pour la ressource - * (par exemple si on demande eMemoryRessource::Device et qu'il n'y a pas de + * (par exemple si on demande eMemoryResource::Device et qu'il n'y a pas de * support pour les accélérateurs. * - * La ressource eMemoryRessource::UnifiedMemory est toujours disponible. Si + * La ressource eMemoryResource::UnifiedMemory est toujours disponible. Si * aucun runtime accélérateur n'est chargé, alors c'est équivalent à - * eMemoryRessource::Host. + * eMemoryResource::Host. */ extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions -getAllocationOptions(eMemoryRessource mem_ressource); +getAllocationOptions(eMemoryResource mem_resource); + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +/*! + * \brief Allocateur par défaut pour la ressource \a mem_resource. + * + * \sa getAllocationOptions(). + */ +extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* +getAllocator(eMemoryResource mem_resource); /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -143,8 +164,8 @@ checkResizeArrayWithCapacity(Array& array, Int64 new_size, bool force_ * la surcharge copy(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue). */ extern "C++" ARCANE_UTILS_EXPORT void -copy(MutableMemoryView destination, eMemoryRessource destination_mem, - ConstMemoryView source, eMemoryRessource source_mem, +copy(MutableMemoryView destination, eMemoryResource destination_mem, + ConstMemoryView source, eMemoryResource source_mem, const RunQueue* queue = nullptr); /*---------------------------------------------------------------------------*/ @@ -154,7 +175,7 @@ copy(MutableMemoryView destination, eMemoryRessource destination_mem, inline void copy(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue = nullptr) { - eMemoryRessource mem_type = eMemoryRessource::Unknown; + eMemoryResource mem_type = eMemoryResource::Unknown; copy(destination, mem_type, source, mem_type, queue); } diff --git a/arcane/src/arcane/utils/PlatformUtils.cc b/arcane/src/arcane/utils/PlatformUtils.cc index 747cd9acef..dea44616b8 100644 --- a/arcane/src/arcane/utils/PlatformUtils.cc +++ b/arcane/src/arcane/utils/PlatformUtils.cc @@ -22,7 +22,8 @@ #include "arcane/utils/NotSupportedException.h" #include "arcane/utils/Array.h" #include "arcane/utils/StringList.h" -#include "arcane/utils/internal/MemoryRessourceMng.h" +#include "arcane/utils/MemoryUtils.h" +#include "arcane/utils/internal/MemoryUtilsInternal.h" #include @@ -90,10 +91,7 @@ namespace platform ISymbolizerService* global_symbolizer_service = nullptr; IProfilingService* global_profiling_service = nullptr; IProcessorAffinityService* global_processor_affinity_service = nullptr; - IMemoryAllocator* global_accelerator_host_memory_allocator = nullptr; IDynamicLibraryLoader* global_dynamic_library_loader = nullptr; - MemoryRessourceMng global_default_data_memory_ressource_mng; - IMemoryRessourceMng* global_data_memory_ressource_mng = nullptr; IPerformanceCounterService* global_performance_counter_service = nullptr; bool global_has_color_console = false; } @@ -224,7 +222,7 @@ setPerformanceCounterService(IPerformanceCounterService* service) extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* platform:: getAcceleratorHostMemoryAllocator() { - return global_accelerator_host_memory_allocator; + return MemoryUtils::getAcceleratorHostMemoryAllocator(); } /*---------------------------------------------------------------------------*/ @@ -233,18 +231,16 @@ getAcceleratorHostMemoryAllocator() extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* platform:: setAcceleratorHostMemoryAllocator(IMemoryAllocator* a) { - IMemoryAllocator* old = global_accelerator_host_memory_allocator; - global_accelerator_host_memory_allocator = a; - return old; + return MemoryUtils::setAcceleratorHostMemoryAllocator(a); } /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* platform:: +IMemoryAllocator* platform:: getDefaultDataAllocator() { - return getDataMemoryRessourceMng()->getAllocator(eMemoryRessource::UnifiedMemory); + return MemoryUtils::getDefaultDataAllocator(); } /*---------------------------------------------------------------------------*/ @@ -253,22 +249,16 @@ getDefaultDataAllocator() extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng* platform:: setDataMemoryRessourceMng(IMemoryRessourceMng* mng) { - ARCANE_CHECK_POINTER(mng); - IMemoryRessourceMng* old = global_data_memory_ressource_mng; - global_data_memory_ressource_mng = mng; - return old; + return MemoryUtils::setDataMemoryResourceMng(mng); } /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ -extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng* platform:: +IMemoryRessourceMng* platform:: getDataMemoryRessourceMng() { - IMemoryRessourceMng* a = global_data_memory_ressource_mng; - if (!a) - return &global_default_data_memory_ressource_mng; - return a; + return MemoryUtils::getDataMemoryResourceMng(); } /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/utils/PlatformUtils.h b/arcane/src/arcane/utils/PlatformUtils.h index 431b9c402b..6106937a50 100644 --- a/arcane/src/arcane/utils/PlatformUtils.h +++ b/arcane/src/arcane/utils/PlatformUtils.h @@ -255,18 +255,24 @@ callDotNETGarbageCollector(); * * Si non nul, cet allocateur permet d'allouer de la mémoire sur l'hôte en * utilisant le runtime spécique de l'allocateur. + * + * \todo rendre obsolète (utiliser MemoryUtils::getAcceleratorHostMemoryAllocator() + * à la place). */ -extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* -getAcceleratorHostMemoryAllocator(); +extern "C++" ARCANE_UTILS_EXPORT +IMemoryAllocator* getAcceleratorHostMemoryAllocator(); /*! * \brief Positionne l'allocateur spécifique pour les accélérateurs. * * Retourne l'ancien allocateur utilisé. L'allocateur spécifié doit rester * valide durant toute la durée de vie de l'application. + * + * \deprecated Cette méthode est interne à Arcane. */ -extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* -setAcceleratorHostMemoryAllocator(IMemoryAllocator* a); +extern "C++" ARCANE_UTILS_EXPORT +ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane") +IMemoryAllocator* setAcceleratorHostMemoryAllocator(IMemoryAllocator* a); /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -293,9 +299,12 @@ getDefaultDataAllocator(); * Le gestionnaire doit rester valide durant toute l'exécution du programme. * * Retourne l'ancien gestionnaire. + * + * * \deprecated Cette méthode est interne à Arcane. */ -extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng* -setDataMemoryRessourceMng(IMemoryRessourceMng* mng); +extern "C++" ARCANE_UTILS_EXPORT +ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane") +IMemoryRessourceMng* setDataMemoryRessourceMng(IMemoryRessourceMng* mng); /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ @@ -304,9 +313,12 @@ setDataMemoryRessourceMng(IMemoryRessourceMng* mng); * * Il est garanti que l'alignement est au moins celui retourné par * AlignedMemoryAllocator::Simd(). + * + * \deprecated Cette méthode est interne à Arcane. */ -extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng* -getDataMemoryRessourceMng(); +extern "C++" ARCANE_UTILS_EXPORT +ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane. Use methods from MemoryUtils instead.") +IMemoryRessourceMng* getDataMemoryRessourceMng(); /*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/utils/UtilsTypes.h b/arcane/src/arcane/utils/UtilsTypes.h index 3fa0491a6c..2d53bc0c5f 100644 --- a/arcane/src/arcane/utils/UtilsTypes.h +++ b/arcane/src/arcane/utils/UtilsTypes.h @@ -266,7 +266,8 @@ class DefaultLayout; template class RightLayoutN; template class LeftLayoutN; template class MDDimType; -class IMemoryRessourceMng; +class IMemoryResourceMng; +using IMemoryRessourceMng = IMemoryResourceMng; template class ExtentsV; template class MDSpan; diff --git a/arcane/src/arcane/utils/internal/MemoryRessourceMng.h b/arcane/src/arcane/utils/internal/MemoryResourceMng.h similarity index 81% rename from arcane/src/arcane/utils/internal/MemoryRessourceMng.h rename to arcane/src/arcane/utils/internal/MemoryResourceMng.h index 545249f2b2..6ee70f8335 100644 --- a/arcane/src/arcane/utils/internal/MemoryRessourceMng.h +++ b/arcane/src/arcane/utils/internal/MemoryResourceMng.h @@ -32,27 +32,27 @@ namespace Arcane /*! * \brief Gestion des ressources mémoire pour les CPU et accélérateurs. */ -class ARCANE_UTILS_EXPORT MemoryRessourceMng -: public IMemoryRessourceMng +class ARCANE_UTILS_EXPORT MemoryResourceMng +: public IMemoryResourceMng , public IMemoryRessourceMngInternal { public: - MemoryRessourceMng(); + MemoryResourceMng(); public: - IMemoryAllocator* getAllocator(eMemoryRessource r) override; - IMemoryAllocator* getAllocator(eMemoryRessource r, bool throw_if_not_found) override; + IMemoryAllocator* getAllocator(eMemoryResource r) override; + IMemoryAllocator* getAllocator(eMemoryResource r, bool throw_if_not_found) override; public: - void copy(ConstMemoryView from, eMemoryRessource from_mem, - MutableMemoryView to, eMemoryRessource to_mem, const RunQueue* queue) override; + void copy(ConstMemoryView from, eMemoryResource from_mem, + MutableMemoryView to, eMemoryResource to_mem, const RunQueue* queue) override; public: - void setAllocator(eMemoryRessource r, IMemoryAllocator* allocator) override; + void setAllocator(eMemoryResource r, IMemoryAllocator* allocator) override; void setCopier(IMemoryCopier* copier) override { m_copier = copier; } void setIsAccelerator(bool v) override { m_is_accelerator = v; } @@ -68,14 +68,14 @@ class ARCANE_UTILS_EXPORT MemoryRessourceMng private: - FixedArray m_allocators; + FixedArray m_allocators; std::unique_ptr m_default_memory_copier; IMemoryCopier* m_copier = nullptr; bool m_is_accelerator = false; private: - inline int _checkValidRessource(eMemoryRessource r); + inline int _checkValidResource(eMemoryResource r); }; /*---------------------------------------------------------------------------*/ diff --git a/arcane/src/arcane/utils/internal/MemoryUtilsInternal.h b/arcane/src/arcane/utils/internal/MemoryUtilsInternal.h new file mode 100644 index 0000000000..f46c2e1a3c --- /dev/null +++ b/arcane/src/arcane/utils/internal/MemoryUtilsInternal.h @@ -0,0 +1,67 @@ +// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- +//----------------------------------------------------------------------------- +// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// See the top-level COPYRIGHT file for details. +// SPDX-License-Identifier: Apache-2.0 +//----------------------------------------------------------------------------- +/*---------------------------------------------------------------------------*/ +/* MemoryUtilsInternal.h (C) 2000-2024 */ +/* */ +/* Fonctions utilitaires de gestion mémoire internes à Arcane. */ +/*---------------------------------------------------------------------------*/ +#ifndef ARCANE_UTILS_INTERNAL_MEMORYUTILSINTERNAL_H +#define ARCANE_UTILS_INTERNAL_MEMORYUTILSINTERNAL_H +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +#include "arcane/utils/MemoryRessource.h" + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +namespace Arcane::MemoryUtils +{ + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +/*! + * \brief Positionne le gestionnaire de ressource mémoire pour les données. + * + * Le gestionnaire doit rester valide durant toute l'exécution du programme. + * + * Retourne l'ancien gestionnaire. + */ +extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng* +setDataMemoryResourceMng(IMemoryRessourceMng* mng); + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +/*! + * \brief Gestionnaire de ressource mémoire pour les données. + * + * Il est garanti que l'alignement est au moins celui retourné par + * AlignedMemoryAllocator::Simd(). + */ +extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng* +getDataMemoryResourceMng(); + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +/*! + * \brief Positionne l'allocateur spécifique pour les accélérateurs. + * + * Retourne l'ancien allocateur utilisé. L'allocateur spécifié doit rester + * valide durant toute la durée de vie de l'application. + */ +extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator* +setAcceleratorHostMemoryAllocator(IMemoryAllocator* a); + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +} // namespace Arcane::MemoryUtils + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ + +#endif diff --git a/arcane/src/arcane/utils/srcs.cmake b/arcane/src/arcane/utils/srcs.cmake index 1b7aee06fb..127a83b641 100644 --- a/arcane/src/arcane/utils/srcs.cmake +++ b/arcane/src/arcane/utils/srcs.cmake @@ -92,7 +92,7 @@ set(ARCANE_SOURCES MemoryInfo.cc MemoryInfo.h MemoryRessource.h - MemoryRessourceMng.cc + MemoryResourceMng.cc MemoryUtils.h MemoryUtils.cc Numeric.cc @@ -334,7 +334,8 @@ set(ARCANE_SOURCES DirectedGraphT.h DirectedAcyclicGraphT.h internal/ApplicationInfoProperties.h - internal/MemoryRessourceMng.h + internal/MemoryResourceMng.h + internal/MemoryUtilsInternal.h internal/IMemoryRessourceMngInternal.h internal/IMemoryCopier.h internal/ProfilingInternal.h