Arcane  v4.1.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
arcane/src/arcane/utils/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
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
209 SmallSpan<const Int32> indexes, RunQueue* queue)
210{
211 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
212
213 Int64 nb_index = indexes.size();
214 if (nb_index == 0)
215 return;
216
217 _getDefaultCopyList(queue)->copyFrom(one_data_size, { indexes, destination.views(), source.bytes(), queue });
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
225 SmallSpan<const Int32> indexes, RunQueue* queue)
226{
227 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
228
229 Int64 nb_index = indexes.size();
230 if (nb_index == 0)
231 return;
232
233 _getDefaultCopyList(queue)->fill(one_data_size, { indexes, destination.views(), source.bytes(), queue });
234}
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
240fill(MutableMultiMemoryView destination, ConstMemoryView source, RunQueue* queue)
241{
242 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
243
244 _getDefaultCopyList(queue)->fill(one_data_size, { {}, destination.views(), source.bytes(), queue });
245}
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
252 SmallSpan<const Int32> indexes, RunQueue* queue)
253{
254 Int32 one_data_size = _checkDataTypeSize(A_FUNCINFO, destination.datatypeSize(), source.datatypeSize());
255
256 Int64 nb_index = indexes.size();
257 if (nb_index == 0)
258 return;
259
260 _getDefaultCopyList(queue)->copyTo(one_data_size, { indexes, source.views(), destination.bytes(), queue });
261}
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
265
266extern "C++" ARCANE_UTILS_EXPORT void
267arcanePrintSpecificMemoryStats()
268{
269 if (arcaneIsCheck()) {
270 // N'affiche que pour les tests
271 //global_copy_list.printStats();
272 }
273}
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277
278} // End namespace Arcane
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
#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.
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
constexpr SpanType bytes() const
Vue sous forme d'octets.
Liste de vues constantes sur des zones mémoires contigues.
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
constexpr SmallSpan< const Span< const std::byte > > views() const
Vues en octets sur la zone mémoire.
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
constexpr SpanType bytes() const
Vue sous forme d'octets.
Liste de vues modifiables sur des zones mémoires contigues.
constexpr Int32 datatypeSize() const
Taille du type de donnée associé (1 par défaut)
constexpr SmallSpan< Span< std::byte > > views() const
Vues en octets sur la zone mémoire.
Vue d'un tableau d'éléments de type T.
Definition Span.h:774
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:369
__host__ __device__ void fill(T o)
Remplit le tableau avec la valeur o.
Definition Span.h:360
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:304
Vue d'un tableau d'éléments de type T.
Definition Span.h:612
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.
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 -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.