Arcane  v4.1.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MemoryResourceMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MemoryResourceMng.cc (C) 2000-2025 */
9/* */
10/* Gestion des ressources mémoire pour les CPU et accélérateurs. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/common/internal/MemoryResourceMng.h"
15
16#include "arccore/base/FatalErrorException.h"
17#include "arccore/base/PlatformUtils.h"
18#include "arccore/base/MemoryView.h"
19#include "arccore/common/Array.h"
20#include "arccore/common/AlignedMemoryAllocator.h"
22#include "arccore/common/internal/MemoryUtilsInternal.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace
33{
34 bool _isHost(eMemoryResource r)
35 {
36 // Si on ne sait pas, considère qu'on est accessible depuis l'hôte.
38 return true;
40 return true;
41 return false;
42 }
43
44} // namespace
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
50: public IMemoryCopier
51{
52 public:
53
56 [[maybe_unused]] const RunQueue* queue) override
57 {
58 // Sans support accélérateur, on peut juste faire un 'memcpy' si la mémoire
59 // est accessible depuis le CPU
60
61 if (!_isHost(from_mem))
62 ARCCORE_FATAL("Source buffer is not accessible from host and no copier provided (location={0})",
63 from_mem);
64
65 if (!_isHost(to_mem))
66 ARCCORE_FATAL("Destination buffer is not accessible from host and no copier provided (location={0})",
67 to_mem);
68
69 MemoryUtils::copyHost(to, from);
70 }
71};
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
76MemoryResourceMng::
77MemoryResourceMng()
78: m_default_memory_copier(new DefaultHostMemoryCopier())
79, m_copier(m_default_memory_copier.get())
80{
81 // Par défaut, on utilise l'allocateur CPU. Les allocateurs spécifiques pour
82 // les accélérateurs seront positionnés lorsqu'on aura choisi le runtime
83 // accélérateur
84 IMemoryAllocator* a = AlignedMemoryAllocator::Simd();
85 setAllocator(eMemoryResource::Host, a);
86}
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
91int MemoryResourceMng::
92_checkValidResource(eMemoryResource r)
93{
94 int x = (int)r;
95 if (x <= 0 || x >= ARCCORE_NB_MEMORY_RESOURCE)
96 ARCCORE_FATAL("Invalid value '{0}'. Valid range is '1' to '{1}'", x, ARCCORE_NB_MEMORY_RESOURCE - 1);
97 return x;
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
104getAllocator(eMemoryResource r, bool throw_if_not_found)
105{
106 int x = _checkValidResource(r);
108
109 // Si pas d'allocateur spécifique et qu'on n'est pas sur accélérateur,
110 // utilise Platform::getAcceleratorHostMemoryAllocator().
111 if (!a && !m_is_accelerator) {
114 a = m_allocators[static_cast<int>(mem)];
115 if (!a)
116 a = m_allocators[static_cast<int>(eMemoryResource::Host)];
117 }
118 }
119
120 if (!a && throw_if_not_found)
121 ARCCORE_FATAL("Allocator for resource '{0}' is not available", r);
122
123 return a;
124}
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
140{
141 int x = _checkValidResource(r);
142 return m_memory_pools[x];
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
150{
151 int x = _checkValidResource(r);
152 m_allocators[x] = allocator;
153}
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
160{
161 int x = _checkValidResource(r);
162 m_memory_pools[x] = pool;
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168void MemoryResourceMng::
169copy(ConstMemoryView from, eMemoryResource from_mem,
170 MutableMemoryView to, eMemoryResource to_mem, const RunQueue* queue)
171{
172 Int64 from_size = from.bytes().size();
173 Int64 to_size = to.bytes().size();
174 if (from_size > to_size)
175 ARCCORE_FATAL("Destination copy is too small (to_size={0} from_size={1})", to_size, from_size);
176
177 m_copier->copy(from, from_mem, to, to_mem, queue);
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
185{
188 mrm->_internal()->copy(from, mem_type, to, mem_type, nullptr);
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194} // namespace Arcane
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires de gestion mémoire.
static AlignedMemoryAllocator * Simd()
Allocateur garantissant l'alignement pour utiliser la vectorisation sur la plateforme cible.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr SpanType bytes() const
Vue sous forme d'octets.
void copy(ConstMemoryView from, eMemoryResource from_mem, MutableMemoryView to, eMemoryResource to_mem, const RunQueue *queue) override
Copie les données de from vers to avec la queue queue.
Interface d'un allocateur pour la mémoire.
Interface pour les copies mémoire avec support des accélérateurs.
virtual void copy(ConstMemoryView from, eMemoryResource from_mem, MutableMemoryView to, eMemoryResource to_mem, const RunQueue *queue)=0
Copie les données de from vers to avec la queue queue.
Interface d'un pool mémoire.
Definition IMemoryPool.h:31
Gestion des ressources mémoire pour les CPU et accélérateurs.
virtual IMemoryResourceMngInternal * _internal()=0
Interface interne.
FixedArray< IMemoryPool *, ARCCORE_NB_MEMORY_RESOURCE > m_memory_pools
Liste des pools mémoire.
void setAllocator(eMemoryResource r, IMemoryAllocator *allocator) override
Positionne l'allocateur pour la ressource r.
static void genericCopy(ConstMemoryView from, MutableMemoryView to)
Copie générique utilisant platform::getDataMemoryRessourceMng()
FixedArray< IMemoryAllocator *, ARCCORE_NB_MEMORY_RESOURCE > m_allocators
Liste des allocateurs.
IMemoryPool * getMemoryPoolOrNull(eMemoryResource r) override
Pool mémoire pour la ressource r.
IMemoryAllocator * getAllocator(eMemoryResource r) override
Allocateur mémoire pour la ressource r.
void setMemoryPool(eMemoryResource r, IMemoryPool *pool) override
Positionne le pool mémoire pour la ressource r.
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr SpanType bytes() const
Vue sous forme d'octets.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:325
ARCCORE_COMMON_EXPORT IMemoryRessourceMng * getDataMemoryResourceMng()
Gestionnaire de ressource mémoire pour les données.
ARCCORE_COMMON_EXPORT void copyHost(MutableMemoryView destination, ConstMemoryView source)
Copie dans destination les données de source.
ARCCORE_COMMON_EXPORT eMemoryResource getDefaultDataMemoryResource()
Ressource mémoire utilisée par l'allocateur par défaut pour les données.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
eMemoryResource
Liste des ressources mémoire disponibles.
@ HostPinned
Alloue sur l'hôte.
@ Unknown
Valeur inconnue ou non initialisée.
@ Host
Alloue sur l'hôte.
@ UnifiedMemory
Alloue en utilisant la mémoire unifiée.