Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MemoryUtils.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* MemoryUtils.cc (C) 2000-2024 */
9/* */
10/* Fonctions utilitaires de gestion mémoire. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/MemoryAllocator.h"
18#include "arcane/utils/IMemoryRessourceMng.h"
19#include "arcane/utils/String.h"
20#include "arcane/utils/internal/IMemoryRessourceMngInternal.h"
21#include "arcane/utils/internal/MemoryUtilsInternal.h"
22#include "arcane/utils/internal/MemoryResourceMng.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace Arcane
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43namespace
44{
45 IMemoryAllocator* global_accelerator_host_memory_allocator = nullptr;
46 MemoryResourceMng global_default_data_memory_resource_mng;
47 IMemoryRessourceMng* global_data_memory_resource_mng = nullptr;
48 eMemoryResource global_data_memory_resource = eMemoryResource::Host;
49} // namespace
50
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53
56{
57 return global_data_memory_resource;
58}
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
62
65{
66 global_data_memory_resource = v;
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
74{
76 if (name.null())
77 return v;
78 if (name == "Device")
80 else if (name == "Host")
82 else if (name == "HostPinned")
84 else if (name == "UnifiedMemory")
86 else
87 ARCANE_FATAL("Invalid name '{0}' for memory resource. Valid names are "
88 "'Device', 'Host', 'HostPinned' or 'UnifieMemory'.",
89 name);
90 return v;
91}
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95
96IMemoryRessourceMng* MemoryUtils::
97setDataMemoryResourceMng(IMemoryRessourceMng* mng)
98{
100 IMemoryRessourceMng* old = global_data_memory_resource_mng;
101 global_data_memory_resource_mng = mng;
102 return old;
103}
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107
108IMemoryRessourceMng* MemoryUtils::
110{
111 IMemoryRessourceMng* a = global_data_memory_resource_mng;
112 if (!a)
113 return &global_default_data_memory_resource_mng;
114 return a;
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
131{
132 IMemoryRessourceMng* mrm = getDataMemoryResourceMng();
134 if (a)
135 return a;
137}
138
139/*---------------------------------------------------------------------------*/
140/*---------------------------------------------------------------------------*/
141
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
152getAllocator(eMemoryRessource mem_resource)
153{
154 return getDataMemoryResourceMng()->getAllocator(mem_resource);
155}
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177
180{
181 return global_accelerator_host_memory_allocator;
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
189{
190 IMemoryAllocator* old = global_accelerator_host_memory_allocator;
191 global_accelerator_host_memory_allocator = a;
192 return old;
193}
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
197
198Int64 MemoryUtils::impl::
199computeCapacity(Int64 size)
200{
201 double d_size = static_cast<double>(size);
202 double d_new_capacity = d_size * 1.8;
203 if (size > 5000000)
204 d_new_capacity = d_size * 1.2;
205 else if (size > 500000)
206 d_new_capacity = d_size * 1.5;
207 return static_cast<Int64>(d_new_capacity);
208}
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212
214copy(MutableMemoryView destination, eMemoryRessource destination_mem,
215 ConstMemoryView source, eMemoryRessource source_mem, const RunQueue* queue)
216{
217 IMemoryRessourceMng* mrm = getDataMemoryResourceMng();
218 mrm->_internal()->copy(source, destination_mem, destination, source_mem, queue);
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224} // End namespace Arcane
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
File d'exécution pour un accélérateur.
virtual IMemoryRessourceMngInternal * _internal()=0
Interface interne.
virtual IMemoryAllocator * getAllocator(eMemoryResource r)=0
Allocateur mémoire pour la ressource r.
Options pour configurer les allocations.
Gestion des ressources mémoire pour les CPU et accélérateurs.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
IMemoryRessourceMng * setDataMemoryResourceMng(IMemoryRessourceMng *mng)
Positionne le gestionnaire de ressource mémoire pour les données.
IMemoryRessourceMng * getDataMemoryResourceMng()
Gestionnaire de ressource mémoire pour les données.
IMemoryAllocator * getDeviceOrHostAllocator()
Retourne l'allocateur sur l'hôte ou sur le device.
IMemoryAllocator * setAcceleratorHostMemoryAllocator(IMemoryAllocator *a)
Positionne l'allocateur spécifique pour les accélérateurs.
MemoryAllocationOptions getAllocatorForMostlyReadOnlyData()
Allocateur par défaut pour les données essentiellement en lecture.
void setDefaultDataMemoryResource(eMemoryResource mem_resource)
Positionne la ressource mémoire utilisée pour l'allocateur mémoire des données.
MemoryAllocationOptions getAllocationOptions(eMemoryResource mem_resource)
Allocation par défaut pour la ressource mem_resource.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
eMemoryResource getMemoryResourceFromName(const String &name)
Retourne la ressource mémoire par son nom.
IMemoryAllocator * getAcceleratorHostMemoryAllocator()
Allocateur spécifique pour les accélérateurs.
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.
void copy(MutableMemoryView destination, eMemoryResource destination_mem, ConstMemoryView source, eMemoryResource source_mem, const RunQueue *queue=nullptr)
Copie de source vers destination en utilisant la file queue.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
eMemoryLocationHint
Indices sur la localisation mémoire attendue.
@ HostAndDeviceMostlyRead
Indique que la donnée sera utilisée à la fois sur accélérateur et sur CPU et qu'elle ne sera pas souv...
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
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.
@ Device
Alloue sur le device.