Arcane  v4.1.2.0
Documentation utilisateur
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
54 void copy(ConstMemoryView from, eMemoryResource from_mem,
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
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
103IMemoryAllocator* MemoryResourceMng::
104getAllocator(eMemoryResource r, bool throw_if_not_found)
105{
106 int x = _checkValidResource(r);
107 IMemoryAllocator* a = m_allocators[x];
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
129IMemoryAllocator* MemoryResourceMng::
130getAllocator(eMemoryResource r)
131{
132 return getAllocator(r, true);
133}
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138IMemoryPool* MemoryResourceMng::
139getMemoryPoolOrNull(eMemoryResource r)
140{
141 int x = _checkValidResource(r);
142 return m_memory_pools[x];
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148void MemoryResourceMng::
149setAllocator(eMemoryResource r, IMemoryAllocator* allocator)
150{
151 int x = _checkValidResource(r);
152 m_allocators[x] = allocator;
153}
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158void MemoryResourceMng::
159setMemoryPool(eMemoryResource r, IMemoryPool* pool)
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
183void MemoryResourceMng::
184genericCopy(ConstMemoryView from, MutableMemoryView to)
185{
186 IMemoryResourceMng* mrm = MemoryUtils::getDataMemoryResourceMng();
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.
Interface d'un allocateur pour la mémoire.
Interface d'un pool mémoire.
Definition IMemoryPool.h:31
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
void copyHost(MutableMemoryView destination, ConstMemoryView source)
Copie dans destination les données de source.
IMemoryAllocator * getAllocator(eMemoryResource mem_resource)
Allocateur par défaut pour la ressource mem_resource.
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.