Arcane  v3.16.7.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MemoryView.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/* MemoryView.cc (C) 2000-2025 */
9/* */
10/* Vues constantes ou modifiables sur une zone mémoire. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/MemoryView.h"
15
16#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/internal/SpecificMemoryCopyList.h"
19
20#include <cstring>
21
22// TODO: ajouter statistiques sur les tailles de 'datatype' utilisées.
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane::impl
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
34{
35 public:
36
37 using InterfaceType = ISpecificMemoryCopy;
38 template <typename DataType, typename Extent> using SpecificType = SpecificMemoryCopy<DataType, Extent>;
39 using RefType = SpecificMemoryCopyRef<IndexedCopyTraits>;
40};
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45} // namespace Arcane::impl
46
47namespace Arcane
48{
50
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53
54namespace
55{
56 impl::SpecificMemoryCopyList<impl::IndexedCopyTraits> global_copy_list;
57 impl::ISpecificMemoryCopyList* default_global_copy_list = nullptr;
58
59 impl::ISpecificMemoryCopyList* _getDefaultCopyList(const RunQueue* queue)
60 {
61 if (queue && !default_global_copy_list)
62 ARCANE_FATAL("No instance of copier is available for RunQueue");
63 if (default_global_copy_list && queue)
64 return default_global_copy_list;
65 return &global_copy_list;
66 }
67 Int32 _checkDataTypeSize(const TraceInfo& trace, Int32 data_size1, Int32 data_size2)
68 {
69 if (data_size1 != data_size2)
70 throw FatalErrorException(trace, String::format("Datatype size are not equal this={0} v={1}", data_size1, data_size2));
71 return data_size1;
72 }
73} // namespace
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78void impl::ISpecificMemoryCopyList::
79setDefaultCopyListIfNotSet(ISpecificMemoryCopyList* ptr)
80{
81 if (!default_global_copy_list) {
82 default_global_copy_list = ptr;
83 }
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
91{
92 auto b_source = source.bytes();
93 auto b_destination = destination.bytes();
94 Int64 source_size = b_source.size();
95 if (source_size == 0)
96 return;
97 Int64 destination_size = b_destination.size();
98 if (source_size > destination_size)
99 ARCANE_FATAL("Destination is too small source_size={0} destination_size={1}",
100 source_size, destination_size);
101 auto* destination_data = b_destination.data();
102 auto* source_data = b_source.data();
103 ARCANE_CHECK_POINTER(destination_data);
104 ARCANE_CHECK_POINTER(source_data);
105 std::memmove(destination_data, source_data, source_size);
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
113 Span<const Int32> indexes)
114{
115 copyWithIndexedDestination(destination, source, indexes.smallView(), nullptr);
116}
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120
123 SmallSpan<const Int32> indexes, RunQueue* queue)
124{
125
126 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
127
128 Int64 nb_index = indexes.size();
129 if (nb_index == 0)
130 return;
131
132 auto b_source = source.bytes();
133 auto b_destination = destination.bytes();
134
135 _getDefaultCopyList(queue)->copyFrom(one_data_size, { indexes, b_source, b_destination, queue });
136}
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
143 SmallSpan<const Int32> indexes, const RunQueue* queue)
144{
145 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
146
147 Int64 nb_index = indexes.size();
148 if (nb_index == 0)
149 return;
150
151 auto b_source = source.bytes();
152 auto b_destination = destination.bytes();
153
154 _getDefaultCopyList(queue)->fill(one_data_size, { indexes, b_source, b_destination, queue });
155}
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
161fill(MutableMemoryView destination, ConstMemoryView source, const RunQueue* queue)
162{
163 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
164
165 auto b_source = source.bytes();
166 auto b_destination = destination.bytes();
167
168 _getDefaultCopyList(queue)->fill(one_data_size, { {}, b_source, b_destination, queue });
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
176 Span<const Int32> indexes)
177{
178 copyWithIndexedSource(destination, source, indexes.smallView(), nullptr);
179}
180
181/*---------------------------------------------------------------------------*/
182/*---------------------------------------------------------------------------*/
183
187 RunQueue* queue)
188{
189 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, source.datatypeSize(), destination.datatypeSize());
190
191 Int64 nb_index = indexes.size();
192 if (nb_index == 0)
193 return;
194
195 auto b_source = source.bytes();
196 auto b_destination = destination.bytes();
197
198 _getDefaultCopyList(queue)->copyTo(one_data_size, { indexes, b_source, b_destination, queue });
199}
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
205makeMutableMemoryView(void* ptr, Int32 datatype_size, Int64 nb_element)
206{
207 Span<std::byte> bytes(reinterpret_cast<std::byte*>(ptr), datatype_size * nb_element);
208 return { bytes, datatype_size, nb_element };
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
215makeConstMemoryView(const void* ptr, Int32 datatype_size, Int64 nb_element)
216{
217 Span<const std::byte> bytes(reinterpret_cast<const std::byte*>(ptr), datatype_size * nb_element);
218 return { bytes, datatype_size, nb_element };
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
229 SmallSpan<const Int32> indexes, RunQueue* queue)
230{
231 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
232
233 Int64 nb_index = indexes.size();
234 if (nb_index == 0)
235 return;
236
237 _getDefaultCopyList(queue)->copyFrom(one_data_size, { indexes, destination.views(), source.bytes(), queue });
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242
245 SmallSpan<const Int32> indexes, RunQueue* queue)
246{
247 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
248
249 Int64 nb_index = indexes.size();
250 if (nb_index == 0)
251 return;
252
253 _getDefaultCopyList(queue)->fill(one_data_size, { indexes, destination.views(), source.bytes(), queue });
254}
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
260fill(MutableMultiMemoryView destination, ConstMemoryView source, RunQueue* queue)
261{
262 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
263
264 _getDefaultCopyList(queue)->fill(one_data_size, { {}, destination.views(), source.bytes(), queue });
265}
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
272 SmallSpan<const Int32> indexes, RunQueue* queue)
273{
274 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
275
276 Int64 nb_index = indexes.size();
277 if (nb_index == 0)
278 return;
279
280 _getDefaultCopyList(queue)->copyTo(one_data_size, { indexes, source.views(), destination.bytes(), queue });
281}
282
283/*---------------------------------------------------------------------------*/
284/*---------------------------------------------------------------------------*/
285
286extern "C++" ARCANE_UTILS_EXPORT void
287arcanePrintSpecificMemoryStats()
288{
289 if (arcaneIsCheck()) {
290 // N'affiche que pour les tests
291 //global_copy_list.printStats();
292 }
293}
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
298} // End namespace Arcane
299
300/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
#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.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
Definition MemoryView.h:38
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
Definition MemoryView.h:116
constexpr SpanType bytes() const
Vue sous forme d'octets.
Definition MemoryView.h:107
Liste de vues constantes sur des zones mémoires contigues.
Definition MemoryView.h:259
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
Definition MemoryView.h:277
constexpr SmallSpan< const Span< const std::byte > > views() const
Vues en octets sur la zone mémoire.
Definition MemoryView.h:274
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
Definition MemoryView.h:156
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
Definition MemoryView.h:224
constexpr SpanType bytes() const
Vue sous forme d'octets.
Definition MemoryView.h:215
Liste de vues modifiables sur des zones mémoires contigues.
Definition MemoryView.h:295
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
Definition MemoryView.h:309
constexpr SmallSpan< Span< std::byte > > views() const
Vues en octets sur la zone mémoire.
Definition MemoryView.h:306
Vue d'un tableau d'éléments de type T.
Definition Span.h:673
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:273
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:212
__host__ __device__ void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:264
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
void fill(MutableMemoryView destination, ConstMemoryView source, const RunQueue *run_queue=nullptr)
Remplit une zone mémoire avec une valeur.
void copyWithIndexedDestination(MutableMemoryView destination, ConstMemoryView source, SmallSpan< const Int32 > indexes, RunQueue *run_queue=nullptr)
Copie mémoire avec indirection.
void copyHostWithIndexedSource(MutableMemoryView destination, ConstMemoryView source, Span< const Int32 > indexes)
Copie sur l'hôte des données avec indirection.
void fillIndexed(MutableMemoryView destination, ConstMemoryView source, SmallSpan< const Int32 > indexes, const RunQueue *run_queue=nullptr)
Remplit une zone mémoire indexée avec une valeur.
void copyHostWithIndexedDestination(MutableMemoryView destination, ConstMemoryView source, Span< const Int32 > indexes)
Copie dans l'instance les données indexées de v.
void copyHost(MutableMemoryView destination, ConstMemoryView source)
Copie dans destination les données de source.
Definition MemoryView.cc:90
void copyWithIndexedSource(MutableMemoryView destination, ConstMemoryView source, SmallSpan< const Int32 > indexes, RunQueue *run_queue=nullptr)
Copie sur l'hôte des données avec indirection.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
MutableMemoryView makeMutableMemoryView(void *ptr, Int32 datatype_size, Int64 nb_element)
Créé une vue mémoire modifiable.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
std::int64_t Int64
Type entier signé sur 64 bits.
ConstMemoryView makeConstMemoryView(const void *ptr, Int32 datatype_size, Int64 nb_element)
Créé une vue mémoire en lecture seule.
std::int32_t Int32
Type entier signé sur 32 bits.