Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
BasicSerializer.h
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/* BasicSerializer.h (C) 2000-2025 */
9/* */
10/* Implémentation simple de 'ISerializer'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_SERIALIZE_BASICSERIALIZER_H
13#define ARCCORE_SERIALIZE_BASICSERIALIZER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/serialize/ISerializer.h"
18
19#include "arccore/base/Float16.h"
20#include "arccore/base/BFloat16.h"
21#include "arccore/base/Float128.h"
22#include "arccore/base/Int128.h"
23#include "arccore/collections/Array.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34/*!
35 * \internal
36 * \brief Tampon pour sérialiser un type de donnée \a DataType.
37 */
38template <class DataType>
39class BasicSerializerDataT
40{
41 public:
42 BasicSerializerDataT()
43 : m_reserved_size(0)
44 , m_current_position(0)
45 {}
46
47 public:
48 void put(Span<const DataType> values)
49 {
50 Int64 n = values.size();
51 Int64 cp = m_current_position;
52 Int64 max_size = 1 + m_buffer.size();
53 arccoreCheckAt(n + cp, max_size);
54
55 DataType* ptr = m_buffer.data() + cp;
56 const DataType* vptr = values.data();
57 for (Int64 i = 0; i < n; ++i)
58 ptr[i] = vptr[i];
59 m_current_position += n;
60 }
61
62 void get(Span<DataType> values)
63 {
64 Int64 n = values.size();
65 Int64 cp = m_current_position;
66 Int64 max_size = 1 + m_buffer.size();
67 arccoreCheckAt(n + cp, max_size);
68
69 const DataType* ptr = m_buffer.data() + cp;
70 DataType* vptr = values.data();
71 for (Int64 i = 0; i < n; ++i)
72 vptr[i] = ptr[i];
73 m_current_position += n;
74 }
75
76 public:
77 Int64 m_reserved_size;
78 Int64 m_current_position;
79 Span<DataType> m_buffer;
80};
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84/*!
85 * \internal
86 * \brief Implémentation basique de 'ISerializer'
87 */
88class ARCCORE_SERIALIZE_EXPORT BasicSerializer
89: public ISerializer
90{
92 typedef BasicSerializer ThatClass;
95
96 public:
97
98 // Classe temporaire pour afficher les tailles des buffers.
99 class SizesPrinter
100 {
101 public:
102 explicit SizesPrinter(const BasicSerializer& sbuf) : m_sbuf(sbuf){}
103 const BasicSerializer& buf() const { return m_sbuf; }
104 private:
105 const BasicSerializer& m_sbuf;
106 };
107
108 public:
109
110 class Impl;
111 class Impl2;
112
113 public:
114
115 BasicSerializer();
116 BasicSerializer(const BasicSerializer& sb);
117 ~BasicSerializer() override;
118
119 private:
120
121 void operator=(const BasicSerializer& sb);
122
123 public:
124
126
127 public:
128 void reserveSpan(eDataType dt, Int64 n) override;
129 void reserveSpan(eBasicDataType dt, Int64 n) override;
130 void reserve(eBasicDataType dt, Int64 n) override;
131 void reserve(eDataType dt, Int64 n) override;
132 void reserveInteger(Int64 n) override
133 {
134#ifdef ARCANE_64BIT
135 reserve(DT_Int64, n);
136#else
137 reserve(DT_Int32, n);
138#endif
139 }
140 void reserve(const String& str) override;
141
142 void reserveArray(Span<const Real> values) override;
143 void reserveArray(Span<const Int16> values) override;
144 void reserveArray(Span<const Int32> values) override;
145 void reserveArray(Span<const Int64> values) override;
146 void reserveArray(Span<const Byte> values) override;
147 void reserveArray(Span<const Int8> values) override;
148 void reserveArray(Span<const Float16> values) override;
149 void reserveArray(Span<const BFloat16> values) override;
150 void reserveArray(Span<const Float32> values) override;
151 void reserveArray(Span<const Float128> values) override;
152 void reserveArray(Span<const Int128> values) override;
153
154 void put(Span<const Real> values) override;
155 void put(Span<const Int16> values) override;
156 void put(Span<const Int32> values) override;
157 void put(Span<const Int64> values) override;
158 void put(Span<const Byte> values) override;
159 void putSpan(Span<const Int8> values) override;
160 void putSpan(Span<const Float16> values) override;
161 void putSpan(Span<const BFloat16> values) override;
162 void putSpan(Span<const Float32> values) override;
163 void putSpan(Span<const Float128> values) override;
164 void putSpan(Span<const Int128> values) override;
165 void put(const String& value) override;
166
167 void put(Real value) override
168 {
169 putReal(value);
170 }
171 void put(Int64 value) override
172 {
173 putInt64(value);
174 }
175 void put(Int32 value) override
176 {
177 putInt32(value);
178 }
179 void put(Int16 value) override
180 {
181 putInt16(value);
182 }
183 void put(Byte value) override
184 {
185 putByte(value);
186 }
187 void put(Int8 value) override
188 {
189 putInt8(value);
190 }
191 void put(Float16 value) override
192 {
193 putFloat16(value);
194 }
195 void put(BFloat16 value) override
196 {
197 putBFloat16(value);
198 }
199 void put(Float32 value) override
200 {
201 putFloat32(value);
202 }
203 void put(Float128 value) override
204 {
205 putFloat128(value);
206 }
207 void put(Int128 value) override
208 {
209 putInt128(value);
210 }
211
212 void putReal(Real value) override
213 {
214 put(ConstArrayView<Real>(1, &value));
215 }
216 void putInt64(Int64 value) override
217 {
218 put(ConstArrayView<Int64>(1, &value));
219 }
220 void putInt32(Int32 value) override
221 {
222 put(ConstArrayView<Int32>(1, &value));
223 }
224 void putInt16(Int16 value) override
225 {
226 put(ConstArrayView<Int16>(1, &value));
227 }
228 void putInteger(Integer value) override
229 {
230#ifdef ARCANE_64BIT
231 put(ConstArrayView<Int64>(1, &value));
232#else
233 put(ConstArrayView<Int32>(1, &value));
234#endif
235 }
236 void putByte(Byte value) override
237 {
238 put(ConstArrayView<Byte>(1, &value));
239 }
240 void putInt8(Int8 value) override
241 {
242 putSpan(ConstArrayView<Int8>(1, &value));
243 }
244 void putFloat16(Float16 value) override
245 {
247 }
248 void putBFloat16(BFloat16 value) override
249 {
251 }
252 void putFloat32(Float32 value) override
253 {
255 }
256 void putFloat128(Float128 value) override
257 {
259 }
260 void putInt128(Int128 value) override
261 {
263 }
264
265 void putArray(Span<const Real> values) override;
266 void putArray(Span<const Int16> values) override;
267 void putArray(Span<const Int32> values) override;
268 void putArray(Span<const Int64> values) override;
269 void putArray(Span<const Byte> values) override;
270 void putArray(Span<const Int8> values) override;
271 void putArray(Span<const Float16> values) override;
272 void putArray(Span<const BFloat16> values) override;
273 void putArray(Span<const Float32> values) override;
274 void putArray(Span<const Float128> values) override;
275 void putArray(Span<const Int128> values) override;
276
277 void get(ArrayView<Real> values) override { ThatClass::getSpan(values); }
278 void get(ArrayView<Int64> values) override { ThatClass::getSpan(values); }
279 void get(ArrayView<Int32> values) override { ThatClass::getSpan(values); }
280 void get(ArrayView<Int16> values) override { ThatClass::getSpan(values); }
281 void get(ArrayView<Byte> values) override { ThatClass::getSpan(values); }
282
283 void getSpan(Span<Real> values) override;
284 void getSpan(Span<Int16> values) override;
285 void getSpan(Span<Int32> values) override;
286 void getSpan(Span<Int64> values) override;
287 void getSpan(Span<Byte> values) override;
288 void getSpan(Span<Int8> values) override;
289 void getSpan(Span<Float16> values) override;
290 void getSpan(Span<BFloat16> values) override;
291 void getSpan(Span<Float32> values) override;
292 void getSpan(Span<Float128> values) override;
293 void getSpan(Span<Int128> values) override;
294
295 void getArray(Array<Real>& values) override;
296 void getArray(Array<Int16>& values) override;
297 void getArray(Array<Int32>& values) override;
298 void getArray(Array<Int64>& values) override;
299 void getArray(Array<Byte>& values) override;
300 void getArray(Array<Int8>& values) override;
301 void getArray(Array<Float16>& values) override;
302 void getArray(Array<BFloat16>& values) override;
303 void getArray(Array<Float32>& values) override;
304 void getArray(Array<Float128>& values) override;
305 void getArray(Array<Int128>& values) override;
306
307 void get(String& values) override;
308
309 Real getReal() override
310 {
311 Real r = 0.;
312 get(ArrayView<Real>(1, &r));
313 return r;
314 }
315 Int64 getInt64() override
316 {
317 Int64 r = 0;
318 get(ArrayView<Int64>(1, &r));
319 return r;
320 }
321 Int32 getInt32() override
322 {
323 Int32 r = 0;
324 get(ArrayView<Int32>(1, &r));
325 return r;
326 }
327 Int16 getInt16() override
328 {
329 Int16 r = 0;
330 get(ArrayView<Int16>(1, &r));
331 return r;
332 }
334 {
335#ifdef ARCANE_64BIT
336 return getInt64();
337#else
338 return getInt32();
339#endif
340 }
341 Byte getByte() override
342 {
343 Byte r = 0;
344 get(ArrayView<Byte>(1, &r));
345 return r;
346 }
347 Int8 getInt8() override
348 {
349 Int8 r = 0;
350 getSpan(ArrayView<Int8>(1, &r));
351 return r;
352 }
354 {
355 Float16 r = {};
357 return r;
358 }
360 {
361 BFloat16 r = {};
363 return r;
364 }
366 {
367 Float32 r = {};
369 return r;
370 }
372 {
373 Float128 r = {};
375 return r;
376 }
377 Int128 getInt128() override
378 {
379 Int128 r = {};
381 return r;
382 }
383
384 void allocateBuffer() override;
385
386 eMode mode() const override;
387 void setMode(eMode new_mode) override;
388 eReadMode readMode() const override;
389 void setReadMode(eReadMode new_read_mode) override;
390
391 public:
392 /*!
393 * \brief Indique si on sérialise le type de donnée pour
394 * garantir la cohérence.
395 *
396 * Si actif, cela nécessite que les appels à reserve() et
397 * reserveArray() soient cohérents avec les put(). Comme ce
398 * n'est pas le cas historiquement, cette option n'est pas active
399 * par défaut.
400 *
401 * Il n'est utile de positionner cette option qu'en écriture. En lecture,
402 * l'information est contenue dans le sérialiseur.
403 */
404 void setSerializeTypeInfo(bool v);
405 bool isSerializeTypeInfo() const;
406
407 private:
408
409 // Méthode obsolète dans l'interface. A supprimer dès que possible
410 void allocateBuffer(Int64 nb_real, Int64 nb_int16, Int64 nb_int32,
411 Int64 nb_int64, Int64 nb_byte) override;
412
413 public:
414
415 ARCCORE_DEPRECATED_2020("internal method")
416 Span<Real> realBuffer();
417 ARCCORE_DEPRECATED_2020("internal method")
418 Span<Int64> int64Buffer();
419 ARCCORE_DEPRECATED_2020("internal method")
420 Span<Int32> int32Buffer();
421 ARCCORE_DEPRECATED_2020("internal method")
422 Span<Int16> int16Buffer();
423 ARCCORE_DEPRECATED_2020("internal method")
424 Span<Byte> byteBuffer();
425
426 public:
427
428 ConstArrayView<Byte> copyAndGetSizesBuffer();
429 Span<Byte> globalBuffer();
430 Span<const Byte> globalBuffer() const;
431 ARCCORE_DEPRECATED_2020("Do not use. get total size with totalSize()")
432 ConstArrayView<Int64> sizesBuffer();
433 Int64 totalSize() const;
434 void preallocate(Int64 size);
435 void releaseBuffer();
436 void setFromSizes();
437 void printSizes(std::ostream& o) const;
438
439 friend inline std::ostream&
440 operator<<(std::ostream& o,const BasicSerializer::SizesPrinter& x)
441 {
442 x.buf().printSizes(o);
443 return o;
444 }
445
446 public:
447
448 /*!
449 * \brief Initialise le sérialiseur en lecture à partir des données \a buf.
450 *
451 * Le tableau \a buf doit avoir été obtenu via l'appel à globalBuffer()
452 * d'un sérialiseur en écriture.
453 */
454 void initFromBuffer(Span<const Byte> buf);
455 void copy(const ISerializer* from) override;
456 void copy(const BasicSerializer& rhs);
457 /*!
458 * \brief Taille du padding et de l'alignement.
459 *
460 * Il est garanti que chaque tableau (buffer) géré par ce sérialiseur
461 * a une taille en octet multiple de paddingSize() et un
462 * alignement sur paddingSize().
463 */
464 static ARCCORE_CONSTEXPR Integer paddingSize() { return 128; }
465
466 // TEMPORAIRE tant qu'on utilise le AllGather de Arcane. Ensuite à mettre privé
467 protected:
468
469 Impl2* m_p2;
470
471 Impl* _p() const;
472};
473
474/*---------------------------------------------------------------------------*/
475/*---------------------------------------------------------------------------*/
476
477} // End namespace Arccore
478
479/*---------------------------------------------------------------------------*/
480/*---------------------------------------------------------------------------*/
481
482#endif
Vue modifiable d'un tableau d'un type T.
Classe de base des vecteurs 1D de données.
void putInt128(Int128 value) override
Ajoute value.
void putInt16(Int16 value) override
Ajoute l'entier value.
void put(Float16 value) override
Ajoute value.
void get(ArrayView< Int32 > values) override
Récupère le tableau values.
void putSpan(Span< const Int8 > values) override
Ajoute le tableau values.
Float16 getFloat16() override
Récupère un Float16.
void get(ArrayView< Int64 > values) override
Récupère le tableau values.
void put(Int8 value) override
Ajoute value.
void put(Int64 value) override
Ajoute value.
void putBFloat16(BFloat16 value) override
Ajoute value.
void putInt64(Int64 value) override
Ajoute l'entier value.
void put(Int16 value) override
Ajoute value.
void getSpan(Span< Real > values) override
Récupère le tableau values.
static ARCCORE_CONSTEXPR Integer paddingSize()
Taille du padding et de l'alignement.
void put(Int128 value) override
Ajoute value.
void put(Span< const Real > values) override
Ajoute le tableau values.
void put(Float32 value) override
Ajoute value.
Real getReal() override
Récupère un réel.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void putInt32(Int32 value) override
Ajoute l'entier value.
void putFloat16(Float16 value) override
Ajoute value.
void reserveSpan(eDataType dt, Int64 n) override
Réserve de la mémoire pour n valeurs de dt.
void get(ArrayView< Byte > values) override
Récupère le tableau values.
BFloat16 getBFloat16() override
Récupère un BFloat16.
void putFloat128(Float128 value) override
Ajoute value.
Int64 getInt64() override
Récupère une taille.
void put(Float128 value) override
Ajoute value.
void putFloat32(Float32 value) override
Ajoute value.
Int16 getInt16() override
Récupère un entier sur 16 bits.
Integer getInteger() override
Récupère une taille.
void get(ArrayView< Real > values) override
Récupère le tableau values.
Int32 getInt32() override
Récupère un entier naturel.
void put(Int32 value) override
Ajoute value.
void putReal(Real value) override
Ajoute le réel value.
Int8 getInt8() override
Récupère un Int8.
void putInteger(Integer value) override
Ajoute l'entier value.
Int128 getInt128() override
Récupère un Float32.
void putInt8(Int8 value) override
Ajoute value.
Byte getByte() override
Récupère un octet.
void get(ArrayView< Int16 > values) override
Récupère le tableau values.
Float32 getFloat32() override
Récupère un Float32.
Float128 getFloat128() override
Récupère un Float32.
void put(Real value) override
Ajoute value.
void putByte(Byte value) override
Ajoute l'octet value.
void put(BFloat16 value) override
Ajoute value.
void put(Byte value) override
Ajoute value.
Vue constante d'un tableau de type T.
Type flottant demi-précision.
virtual void reserve(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void reserveSpan(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:212
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:422
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int8_t Int8
Type entier signé sur 8 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
eBasicDataType
Type d'une donnée de base.
__host__ __device__ void arccoreCheckAt(Int64 i, Int64 max_size)
Vérifie un éventuel débordement de tableau.
std::int16_t Int16
Type entier signé sur 16 bits.
double Real
Type représentant un réel.
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
float Float32
Type flottant IEEE-753 simple précision.
std::int32_t Int32
Type entier signé sur 32 bits.