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