Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MemoryUtils.h
Aller à la documentation de ce fichier.
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.h (C) 2000-2024 */
9/* */
10/* Fonctions utilitaires de gestion mémoire. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_MEMORYUTILS_H
13#define ARCANE_UTILS_MEMORYUTILS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/MemoryRessource.h"
18#include "arcane/utils/MemoryView.h"
19
20#include "arccore/collections/MemoryAllocationArgs.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::MemoryUtils
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \brief Ressource mémoire utilisée par l'allocateur par défaut pour les données.
32 *
33 * Par défaut, si un runtime accélérateur est initialisé, la ressource
34 * associé est eMemoryResource::UnifiedMemory. Sinon, il s'agit de
35 * eMemoryResource::Host.
36 *
37 * \sa getDefaultDataAllocator();
38 */
39extern "C++" ARCANE_UTILS_EXPORT eMemoryResource
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44/*!
45 * \brief Retourne la ressource mémoire par son nom.
46 *
47 * Le nom correspond au nom de la valeur de l'énumération (par exemple
48 * 'Device' pour eMemoryResource::Device.
49 *
50 * Si \a name est nul, retourn eMemoryResource::Unknown.
51 * Si \a name ne correspondant pas à une valeur valide, lève une exception.
52 */
53extern "C++" ARCANE_UTILS_EXPORT eMemoryResource
54getMemoryResourceFromName(const String& name);
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58/*!
59 * \brief Allocateur par défaut pour les données.
60 *
61 * L'allocateur par défaut pour les données est un allocateur qui permet
62 * d'accéder à la zone mémoire à la fois par l'hôte et l'accélérateur.
63 *
64 * Il est possible de récupérer la ressource mémoire associée via
65 * getDefaultDataMemoryResource();
66 *
67 * Cet appel est équivalent à getAllocator(getDefaultDataMemoryResource()).
68 *
69 * Il est garanti que l'alignement est au moins celui retourné par
70 * AlignedMemoryAllocator::Simd().
71 */
72extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77/*!
78 * \brief Allocateur par défaut pour les données avec informations sur
79 * la localisation attendue.
80 *
81 * Cette fonction retourne l'allocateur de getDefaulDataAllocator() mais
82 * ajoute les informations de gestion mémoire spécifiées par \a hint.
83 */
84extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
85getDefaultDataAllocator(eMemoryLocationHint hint);
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89/*!
90 * \brief Retourne l'allocateur sur l'hôte ou sur le device.
91 *
92 * Si un runtime accélérateur est initialisé, l'allocateur retourné permet
93 * d'allouer en utilisant la mémoire de l'accélérateur par défaut
94 * (eMemoryResource::Device). Sinon, utilise l'allocateur de l'hôte
95 * (eMemoryResource::Host).
96 */
97extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102/*!
103 * \brief Allocateur par défaut pour les données essentiellement en
104 * lecture.
105 *
106 * Cet appel est équivalent à getDefaultDataAllocator(eMemoryLocationHint::HostAndDeviceMostlyRead).
107 */
108extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113/*!
114 * \brief Allocateur spécifique pour les accélérateurs.
115 *
116 * \deprecated Use MemoryUtils::getDefaultDataAllocator() instead.
117 */
118extern "C++" ARCANE_DEPRECATED_REASON("Y2024: Use getDefaultDataAllocator() instead.")
119ARCANE_UTILS_EXPORT IMemoryAllocator*
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
124/*!
125 * \brief Allocation par défaut pour la ressource \a mem_resource.
126 *
127 * Lève une exception si aucune allocateur n'est disponible pour la ressource
128 * (par exemple si on demande eMemoryResource::Device et qu'il n'y a pas de
129 * support pour les accélérateurs.
130 *
131 * La ressource eMemoryResource::UnifiedMemory est toujours disponible. Si
132 * aucun runtime accélérateur n'est chargé, alors c'est équivalent à
133 * eMemoryResource::Host.
134 */
135extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
136getAllocationOptions(eMemoryResource mem_resource);
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140/*!
141 * \brief Allocateur par défaut pour la ressource \a mem_resource.
142 *
143 * \sa getAllocationOptions().
144 */
145extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
146getAllocator(eMemoryResource mem_resource);
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151namespace impl
152{
153 //! Calcule une capacité adaptée pour une taille de \a size
154 extern "C++" ARCANE_UTILS_EXPORT Int64
155 computeCapacity(Int64 size);
156} // namespace impl
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160/*!
161 * \brief Redimensionne un tableau en ajoutant une réserve de mémoire.
162 *
163 * Le tableau \a array est redimensionné uniquement si \a new_size est
164 * supérieure à la taille actuelle du tableau ou si \a force_resize est vrai.
165 *
166 * Si le tableau est redimensionné, on réserve une capacité supplémentaire
167 * pour éviter de réallouer à chaque fois.
168 *
169 * \retval 2 si on a réalloué via reserve()
170 * \retval 1 si on a re-dimensionné sans réallouer.
171 * \retval 0 si aucune opération n'a eu lieu.
172 */
173template <typename DataType> inline Int32
174checkResizeArrayWithCapacity(Array<DataType>& array, Int64 new_size, bool force_resize)
175{
176 Int32 ret_value = 0;
177 Int64 s = array.largeSize();
178 if (new_size > s || force_resize) {
179 ret_value = 1;
180 if (new_size > array.capacity()) {
181 array.reserve(impl::computeCapacity(new_size));
182 ret_value = 2;
183 }
184 array.resize(new_size);
185 }
186 return ret_value;
187}
188
189/*---------------------------------------------------------------------------*/
190/*---------------------------------------------------------------------------*/
191/*!
192 * \brief Redimensionne un tableau en ajoutant une réserve de mémoire.
193 *
194 * Cet appel est équivalent à checkResizeArrayWithCapacity(array, new_size, false).
195 */
196template <typename DataType> inline Int32
198{
199 return checkResizeArrayWithCapacity(array, new_size, false);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204/*!
205 * \brief Copie de \a source vers \a destination en utilisant la file \a queue.
206 *
207 * Il est possible de spécifier la ressource mémoire où se trouve la source
208 * et la destination. Si on ne les connait pas, il est préférable d'utiliser
209 * la surcharge copy(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue).
210 */
211extern "C++" ARCANE_UTILS_EXPORT void
212copy(MutableMemoryView destination, eMemoryResource destination_mem,
213 ConstMemoryView source, eMemoryResource source_mem,
214 const RunQueue* queue = nullptr);
215
216/*---------------------------------------------------------------------------*/
217/*---------------------------------------------------------------------------*/
218
219//! Copie de \a source vers \a destination en utilisant la file \a queue.
220inline void
221copy(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue = nullptr)
222{
223 eMemoryResource mem_type = eMemoryResource::Unknown;
224 copy(destination, mem_type, source, mem_type, queue);
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230//! Copie de \a source vers \a destination en utilisant la file \a queue.
231template <typename DataType> inline void
232copy(Span<DataType> destination, Span<const DataType> source, const RunQueue* queue = nullptr)
233{
234 ConstMemoryView input(asBytes(source));
235 MutableMemoryView output(asWritableBytes(destination));
236 copy(output, input, queue);
237}
238
239//! Copie de \a source vers \a destination en utilisant la file \a queue.
240template <typename DataType> inline void
241copy(SmallSpan<DataType> destination, SmallSpan<const DataType> source, const RunQueue* queue = nullptr)
242{
243 copy(Span<DataType>(destination), Span<const DataType>(source), queue);
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
249} // namespace Arcane::MemoryUtils
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254#endif
File d'exécution pour un accélérateur.
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
Int64 largeSize() const
Nombre d'éléments du vecteur (en 64 bits)
Classe de base des vecteurs 1D de données.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue d'un tableau d'éléments de type T.
Definition Span.h:670
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Espace de noms pour les fonctions de gestion mémoire et des allocateurs.
IMemoryAllocator * getDeviceOrHostAllocator()
Retourne l'allocateur sur l'hôte ou sur le device.
MemoryAllocationOptions getAllocatorForMostlyReadOnlyData()
Allocateur par défaut pour les données essentiellement en lecture.
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.
Int32 checkResizeArrayWithCapacity(Array< DataType > &array, Int64 new_size, bool force_resize)
Redimensionne un tableau en ajoutant une réserve de mémoire.
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.
eMemoryResource
Liste des ressources mémoire disponibles.