Arcane  v3.15.0.0
Documentation développeur
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/base/Float128.h"
22#include "arccore/base/Int128.h"
23#include "arccore/collections/Array.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arccore
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
37template <class DataType>
39{
40 public:
42 : m_reserved_size(0)
43 , m_current_position(0)
44 {}
45
46 public:
47 void put(Span<const DataType> values)
48 {
49 Int64 n = values.size();
50 Int64 cp = m_current_position;
51 Int64 max_size = 1 + m_buffer.size();
52 arccoreCheckAt(n + cp, max_size);
53
54 DataType* ptr = m_buffer.data() + cp;
55 const DataType* vptr = values.data();
56 for (Int64 i = 0; i < n; ++i)
57 ptr[i] = vptr[i];
58 m_current_position += n;
59 }
60
61 void get(Span<DataType> values)
62 {
63 Int64 n = values.size();
64 Int64 cp = m_current_position;
65 Int64 max_size = 1 + m_buffer.size();
66 arccoreCheckAt(n + cp, max_size);
67
68 const DataType* ptr = m_buffer.data() + cp;
69 DataType* vptr = values.data();
70 for (Int64 i = 0; i < n; ++i)
71 vptr[i] = ptr[i];
72 m_current_position += n;
73 }
74
75 public:
76 Int64 m_reserved_size;
77 Int64 m_current_position;
78 Span<DataType> m_buffer;
79};
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
87class ARCCORE_SERIALIZE_EXPORT BasicSerializer
88: public ISerializer
89{
90 friend class BasicSerializeGatherMessage;
92 using ISerializer::reserveSpan;
93 using ISerializer::putSpan;
94
95 public:
96
97 // Classe temporaire pour afficher les tailles des buffers.
99 {
100 public:
101 explicit SizesPrinter(const BasicSerializer& sbuf) : m_sbuf(sbuf){}
102 const BasicSerializer& buf() const { return m_sbuf; }
103 private:
104 const BasicSerializer& m_sbuf;
105 };
106
107 public:
108
109 class Impl;
110 class Impl2;
111
112 public:
113
116 ~BasicSerializer() override;
117
118 private:
119
120 void operator=(const BasicSerializer& sb);
121
122 public:
123
124 using ISerializer::reserve;
125
126 public:
127 void reserveSpan(eDataType dt, Int64 n) override;
128 void reserveSpan(eBasicDataType dt, Int64 n) override;
129 void reserve(eBasicDataType dt, Int64 n) override;
130 void reserve(eDataType dt, Int64 n) override;
131 void reserveInteger(Int64 n) override
132 {
133#ifdef ARCANE_64BIT
134 reserve(DT_Int64, n);
135#else
136 reserve(DT_Int32, n);
137#endif
138 }
139 void reserve(const String& str) override;
140
141 void reserveArray(Span<const Real> values) override;
142 void reserveArray(Span<const Int16> values) override;
143 void reserveArray(Span<const Int32> values) override;
144 void reserveArray(Span<const Int64> values) override;
145 void reserveArray(Span<const Byte> values) override;
146 void reserveArray(Span<const Int8> values) override;
147 void reserveArray(Span<const Float16> values) override;
148 void reserveArray(Span<const BFloat16> values) override;
149 void reserveArray(Span<const Float32> values) override;
150 void reserveArray(Span<const Float128> values) override;
151 void reserveArray(Span<const Int128> values) override;
152
153 void put(Span<const Real> values) override;
154 void put(Span<const Int16> values) override;
155 void put(Span<const Int32> values) override;
156 void put(Span<const Int64> values) override;
157 void put(Span<const Byte> values) override;
158 void putSpan(Span<const Int8> values) override;
159 void putSpan(Span<const Float16> values) override;
160 void putSpan(Span<const BFloat16> values) override;
161 void putSpan(Span<const Float32> values) override;
162 void putSpan(Span<const Float128> values) override;
163 void putSpan(Span<const Int128> values) override;
164 void put(const String& value) override;
165
166 void put(Real value) override
167 {
168 putReal(value);
169 }
170 void put(Int64 value) override
171 {
172 putInt64(value);
173 }
174 void put(Int32 value) override
175 {
176 putInt32(value);
177 }
178 void put(Int16 value) override
179 {
180 putInt16(value);
181 }
182 void put(Byte value) override
183 {
184 putByte(value);
185 }
186 void put(Int8 value) override
187 {
188 putInt8(value);
189 }
190 void put(Float16 value) override
191 {
192 putFloat16(value);
193 }
194 void put(BFloat16 value) override
195 {
196 putBFloat16(value);
197 }
198 void put(Float32 value) override
199 {
200 putFloat32(value);
201 }
202 void put(Float128 value) override
203 {
204 putFloat128(value);
205 }
206 void put(Int128 value) override
207 {
208 putInt128(value);
209 }
210
211 void putReal(Real value) override
212 {
213 put(RealConstArrayView(1, &value));
214 }
215 void putInt64(Int64 value) override
216 {
217 put(Int64ConstArrayView(1, &value));
218 }
219 void putInt32(Int32 value) override
220 {
221 put(Int32ConstArrayView(1, &value));
222 }
223 void putInt16(Int16 value) override
224 {
225 put(Int16ConstArrayView(1, &value));
226 }
227 void putInteger(Integer value) override
228 {
229#ifdef ARCANE_64BIT
230 put(Int64ConstArrayView(1, &value));
231#else
232 put(Int32ConstArrayView(1, &value));
233#endif
234 }
235 void putByte(Byte value) override
236 {
237 put(ByteConstArrayView(1, &value));
238 }
239 void putInt8(Int8 value) override
240 {
241 putSpan(ConstArrayView<Int8>(1, &value));
242 }
243 void putFloat16(Float16 value) override
244 {
245 putSpan(ConstArrayView<Float16>(1, &value));
246 }
247 void putBFloat16(BFloat16 value) override
248 {
249 putSpan(ConstArrayView<BFloat16>(1, &value));
250 }
251 void putFloat32(Float32 value) override
252 {
253 putSpan(ConstArrayView<Float32>(1, &value));
254 }
255 void putFloat128(Float128 value) override
256 {
257 putSpan(ConstArrayView<Float128>(1, &value));
258 }
259 void putInt128(Int128 value) override
260 {
261 putSpan(ConstArrayView<Int128>(1, &value));
262 }
263
264 void putArray(Span<const Real> values) override;
265 void putArray(Span<const Int16> values) override;
266 void putArray(Span<const Int32> values) override;
267 void putArray(Span<const Int64> values) override;
268 void putArray(Span<const Byte> values) override;
269 void putArray(Span<const Int8> values) override;
270 void putArray(Span<const Float16> values) override;
271 void putArray(Span<const BFloat16> values) override;
272 void putArray(Span<const Float32> values) override;
273 void putArray(Span<const Float128> values) override;
274 void putArray(Span<const Int128> values) override;
275
276 void get(RealArrayView values) override { ThatClass::getSpan(values); }
277 void get(Int64ArrayView values) override { ThatClass::getSpan(values); }
278 void get(Int32ArrayView values) override { ThatClass::getSpan(values); }
279 void get(Int16ArrayView values) override { ThatClass::getSpan(values); }
280 void get(ByteArrayView values) override { ThatClass::getSpan(values); }
281
282 void getSpan(Span<Real> values) override;
283 void getSpan(Span<Int16> values) override;
284 void getSpan(Span<Int32> values) override;
285 void getSpan(Span<Int64> values) override;
286 void getSpan(Span<Byte> values) override;
287 void getSpan(Span<Int8> values) override;
288 void getSpan(Span<Float16> values) override;
289 void getSpan(Span<BFloat16> values) override;
290 void getSpan(Span<Float32> values) override;
291 void getSpan(Span<Float128> values) override;
292 void getSpan(Span<Int128> values) override;
293
294 void getArray(Array<Real>& values) override;
295 void getArray(Array<Int16>& values) override;
296 void getArray(Array<Int32>& values) override;
297 void getArray(Array<Int64>& values) override;
298 void getArray(Array<Byte>& values) override;
299 void getArray(Array<Int8>& values) override;
300 void getArray(Array<Float16>& values) override;
301 void getArray(Array<BFloat16>& values) override;
302 void getArray(Array<Float32>& values) override;
303 void getArray(Array<Float128>& values) override;
304 void getArray(Array<Int128>& values) override;
305
306 void get(String& values) override;
307
308 Real getReal() override
309 {
310 Real r = 0.;
311 get(ArrayView<Real>(1, &r));
312 return r;
313 }
314 Int64 getInt64() override
315 {
316 Int64 r = 0;
317 get(ArrayView<Int64>(1, &r));
318 return r;
319 }
320 Int32 getInt32() override
321 {
322 Int32 r = 0;
323 get(ArrayView<Int32>(1, &r));
324 return r;
325 }
326 Int16 getInt16() override
327 {
328 Int16 r = 0;
329 get(ArrayView<Int16>(1, &r));
330 return r;
331 }
333 {
334#ifdef ARCANE_64BIT
335 return getInt64();
336#else
337 return getInt32();
338#endif
339 }
340 Byte getByte() override
341 {
342 Byte r = 0;
343 get(ArrayView<Byte>(1, &r));
344 return r;
345 }
346 Int8 getInt8() override
347 {
348 Int8 r = 0;
349 getSpan(ArrayView<Int8>(1, &r));
350 return r;
351 }
353 {
354 Float16 r = {};
355 getSpan(ArrayView<Float16>(1, &r));
356 return r;
357 }
359 {
360 BFloat16 r = {};
361 getSpan(ArrayView<BFloat16>(1, &r));
362 return r;
363 }
365 {
366 Float32 r = {};
367 getSpan(ArrayView<Float32>(1, &r));
368 return r;
369 }
371 {
372 Float128 r = {};
373 getSpan(ArrayView<Float128>(1, &r));
374 return r;
375 }
376 Int128 getInt128() override
377 {
378 Int128 r = {};
379 getSpan(ArrayView<Int128>(1, &r));
380 return r;
381 }
382
383 void allocateBuffer() override;
384
385 eMode mode() const override;
386 void setMode(eMode new_mode) override;
387 eReadMode readMode() const override;
388 void setReadMode(eReadMode new_read_mode) override;
389
390 public:
403 void setSerializeTypeInfo(bool v);
404 bool isSerializeTypeInfo() const;
405
406 private:
407
408 // Méthode obsolète dans l'interface. A supprimer dès que possible
409 void allocateBuffer(Int64 nb_real, Int64 nb_int16, Int64 nb_int32,
410 Int64 nb_int64, Int64 nb_byte) override;
411
412 public:
413
414 ARCCORE_DEPRECATED_2020("internal method")
415 Span<Real> realBuffer();
416 ARCCORE_DEPRECATED_2020("internal method")
417 Span<Int64> int64Buffer();
418 ARCCORE_DEPRECATED_2020("internal method")
419 Span<Int32> int32Buffer();
420 ARCCORE_DEPRECATED_2020("internal method")
421 Span<Int16> int16Buffer();
422 ARCCORE_DEPRECATED_2020("internal method")
423 Span<Byte> byteBuffer();
424
425 public:
426
427 ByteConstArrayView copyAndGetSizesBuffer();
428 Span<Byte> globalBuffer();
429 Span<const Byte> globalBuffer() const;
430 ARCCORE_DEPRECATED_2020("Do not use. get total size with totalSize()")
431 Int64ConstArrayView sizesBuffer();
432 Int64 totalSize() const;
433 void preallocate(Int64 size);
434 void releaseBuffer();
435 void setFromSizes();
436 void printSizes(std::ostream& o) const;
437
438 friend inline std::ostream&
439 operator<<(std::ostream& o,const BasicSerializer::SizesPrinter& x)
440 {
441 x.buf().printSizes(o);
442 return o;
443 }
444
445 public:
446
453 void initFromBuffer(Span<const Byte> buf);
454 void copy(const ISerializer* from) override;
455 void copy(const BasicSerializer& rhs);
463 static ARCCORE_CONSTEXPR Integer paddingSize() { return 128; }
464
465 // TEMPORAIRE tant qu'on utilise le AllGather de Arcane. Ensuite à mettre privé
466 protected:
467
468 Impl2* m_p2;
469
470 Impl* _p() const;
471};
472
473/*---------------------------------------------------------------------------*/
474/*---------------------------------------------------------------------------*/
475
476} // End namespace Arccore
477
478/*---------------------------------------------------------------------------*/
479/*---------------------------------------------------------------------------*/
480
481#endif
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Classe de base des vecteurs 1D de données.
Tampon pour sérialiser un type de donnée DataType.
Implémentation basique de 'ISerializer'.
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.
Float128 getFloat128() override
Récupère un Float32.
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(Int128 value) override
Ajoute value.
void put(BFloat16 value) override
Ajoute value.
void putFloat16(Float16 value) override
Ajoute value.
Int128 getInt128() override
Récupère un Float32.
void putInt128(Int128 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 put(Float128 value) override
Ajoute 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 putFloat128(Float128 value) override
Ajoute value.
void put(Real value) override
Ajoute value.
void put(Int32 value) override
Ajoute value.
Type flottant demi-précision.
constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
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
Int32 Integer
Type représentant un entier.
float Float32
Type flottant IEEE-753 simple précision.
ARCCORE_HOST_DEVICE void arccoreCheckAt(Int64 i, Int64 max_size)
Vérifie un éventuel débordement de tableau.
eBasicDataType
Type d'une donnée de base.
std::int64_t Int64
Type entier signé sur 64 bits.
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