Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MemoryUtils.h
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"
19#include "arcane/utils/MemoryView.h"
20
21#include "arccore/collections/MemoryAllocationArgs.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane::MemoryUtils
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Allocateur par défaut pour les données.
33 *
34 * Si un runtime accélérateur est initialisé, l'allocateur retourné permet
35 * d'allouer en mémoire unifiée et donc la zone allouée sera accessible à la
36 * fois sur l'accélérateur et sur l'hôte. Sinon, retourne un allocateur
37 * aligné.
38 *
39 * Il est garanti que l'alignement est au moins celui retourné par
40 * AlignedMemoryAllocator::Simd().
41 */
42extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
43getDefaultDataAllocator();
44
45/*!
46 * \brief Retourne l'allocateur sur l'hôte ou sur le device.
47 *
48 * Si un runtime accélérateur est initialisé, l'allocateur retourné permet
49 * d'allouer en utilisant la mémoire de l'accélérateur par défaut
50 * (eMemoryRessource::Device). Sinon, utilise l'allocateur de l'hôte
51 * (eMemoryRessource::Host).
52 */
53extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
54getDeviceOrHostAllocator();
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58/*!
59 * \brief Allocateur par défaut pour les données avec informations sur
60 * la localisation attendue.
61 *
62 * Cette fonction retourne l'allocateur de getDefaulDataAllocator() mais
63 * ajoute les informations de gestion mémoire spécifiées par \a hint.
64 */
65extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
66getDefaultDataAllocator(eMemoryLocationHint hint);
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70/*!
71 * \brief Allocateur par défaut pour les données essentiellement en
72 * lecture.
73 *
74 * Cet appel est équivalent à getDefaultDataAllocator(eMemoryLocationHint::HostAndDeviceMostlyRead).
75 */
76extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
77getAllocatorForMostlyReadOnlyData();
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81/*!
82 * \brief Allocateur par défaut pour la ressource \a mem_ressource.
83 *
84 * Lève une exception si aucune allocateur n'est disponible pour la ressource
85 * (par exemple si on demande eMemoryRessource::Device et qu'il n'y a pas de
86 * support pour les accélérateurs.
87 *
88 * La ressource eMemoryRessource::UnifiedMemory est toujours disponible. Si
89 * aucun runtime accélérateur n'est chargé, alors c'est équivalent à
90 * eMemoryRessource::Host.
91 */
92extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
93getAllocationOptions(eMemoryRessource mem_ressource);
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
98namespace impl
99{
100 //! Calcule une capacité adaptée pour une taille de \a size
101 extern "C++" ARCANE_UTILS_EXPORT Int64
102 computeCapacity(Int64 size);
103} // namespace impl
104
105/*---------------------------------------------------------------------------*/
106/*---------------------------------------------------------------------------*/
107/*!
108 * \brief Redimensionne un tableau en ajoutant une réserve de mémoire.
109 *
110 * Le tableau \a array est redimensionné uniquement si \a new_size est
111 * supérieure à la taille actuelle du tableau ou si \a force_resize est vrai.
112 *
113 * Si le tableau est redimensionné, on réserve une capacité supplémentaire
114 * pour éviter de réallouer à chaque fois.
115 *
116 * \retval 2 si on a réalloué via reserve()
117 * \retval 1 si on a re-dimensionné sans réallouer.
118 * \retval 0 si aucune opération n'a eu lieu.
119 */
120template <typename DataType> inline Int32
121checkResizeArrayWithCapacity(Array<DataType>& array, Int64 new_size, bool force_resize)
122{
123 Int32 ret_value = 0;
124 Int64 s = array.largeSize();
125 if (new_size > s || force_resize) {
126 ret_value = 1;
127 if (new_size > array.capacity()) {
128 array.reserve(impl::computeCapacity(new_size));
129 ret_value = 2;
130 }
131 array.resize(new_size);
132 }
133 return ret_value;
134}
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
138/*!
139 * \brief Copie de \a source vers \a destination en utilisant la file \a queue.
140 *
141 * Il est possible de spécifier la ressource mémoire où se trouve la source
142 * et la destination. Si on ne les connait pas, il est préférable d'utiliser
143 * la surcharge copy(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue).
144 */
145extern "C++" ARCANE_UTILS_EXPORT void
146copy(MutableMemoryView destination, eMemoryRessource destination_mem,
147 ConstMemoryView source, eMemoryRessource source_mem,
148 const RunQueue* queue = nullptr);
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153//! Copie de \a source vers \a destination en utilisant la file \a queue.
154inline void
155copy(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue = nullptr)
156{
158 copy(destination, mem_type, source, mem_type, queue);
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164//! Copie de \a source vers \a destination en utilisant la file \a queue.
165template <typename DataType> inline void
166copy(Span<DataType> destination, Span<const DataType> source, const RunQueue* queue = nullptr)
167{
168 ConstMemoryView input(asBytes(source));
169 MutableMemoryView output(asWritableBytes(destination));
170 copy(output, input, queue);
171}
172
173//! Copie de \a source vers \a destination en utilisant la file \a queue.
174template <typename DataType> inline void
175copy(SmallSpan<DataType> destination, SmallSpan<const DataType> source, const RunQueue* queue = nullptr)
176{
177 copy(Span<DataType>(destination), Span<const DataType>(source), queue);
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
183} // namespace Arcane::MemoryUtils
184
185/*---------------------------------------------------------------------------*/
186/*---------------------------------------------------------------------------*/
187
188#endif
Déclarations des types utilisés dans Arcane.
char * copy(char *to, const char *from)
Copie from dans to.
eMemoryRessource
Liste des ressources mémoire disponibles.
@ Unknown
Valeur inconnue ou non initialisée.
detail::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
Definition Span.h:881
detail::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets modifiables.
Definition Span.h:916