Arcane  v3.15.3.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
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
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
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.
Référence à une instance.
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.