14#include "arccore/serialize/BasicSerializer.h"
15#include "arccore/serialize/BasicSerializerInternal.h"
17#include "arccore/base/ArgumentException.h"
18#include "arccore/base/FatalErrorException.h"
48:
public BasicSerializer::Impl
62 static constexpr int IDX_NB_BYTE = 4;
63 static constexpr int IDX_NB_FLOAT16 = 5;
64 static constexpr int IDX_NB_FLOAT32 = 6;
65 static constexpr int IDX_NB_FLOAT64 = 7;
66 static constexpr int IDX_NB_FLOAT128 = 8;
67 static constexpr int IDX_NB_INT16 = 9;
68 static constexpr int IDX_NB_INT32 = 10;
69 static constexpr int IDX_NB_INT64 = 11;
70 static constexpr int IDX_NB_INT128 = 12;
71 static constexpr int IDX_NB_INT8 = 13;
72 static constexpr int IDX_NB_BFLOAT16 = 14;
75 static constexpr int IDX_POS_BYTE = 32;
76 static constexpr int IDX_POS_FLOAT16 = 33;
77 static constexpr int IDX_POS_FLOAT32 = 34;
78 static constexpr int IDX_POS_FLOAT64 = 35;
79 static constexpr int IDX_POS_FLOAT128 = 36;
80 static constexpr int IDX_POS_INT16 = 37;
81 static constexpr int IDX_POS_INT32 = 38;
82 static constexpr int IDX_POS_INT64 = 39;
83 static constexpr int IDX_POS_INT128 = 40;
84 static constexpr int IDX_POS_INT8 = 41;
85 static constexpr int IDX_POS_BFLOAT16 = 42;
87 static constexpr Integer NB_SIZE_ELEM = 128;
99 Int64 m_original_size = 0;
100 Int64 m_padded_size = 0;
134 Span<Int32> getInt32Buffer()
override {
return m_int32_view; }
135 Span<Int64> getInt64Buffer()
override {
return m_int64_view; }
136 Span<Byte> getByteBuffer()
override {
return m_byte_view; }
137 Span<Int8> getInt8Buffer()
override {
return m_int8_view; }
138 Span<Float16> getFloat16Buffer()
override {
return m_float16_view; }
139 Span<BFloat16> getBFloat16Buffer()
override {
return m_bfloat16_view; }
140 Span<Float32> getFloat32Buffer()
override {
return m_float32_view; }
146 Int64 nb_float16 = 0;
147 Int64 nb_bfloat16 = 0;
148 Int64 nb_float32 = 0;
149 allocateBuffer(nb_real,nb_int16,nb_int32,nb_int64,nb_byte,nb_int8,nb_float16,nb_bfloat16,nb_float32);
156 SizeInfo size_info = getPaddingSize(NB_SIZE_ELEM,
sizeof(
Int64));
157 Int64 total = size_info.m_padded_size;
159 Int64 real_position = total;
160 SizeInfo padded_real_size = getPaddingSize(nb_real,
sizeof(
Real));
161 total += padded_real_size.m_padded_size;
163 Int64 int16_position = total;
164 SizeInfo padded_int16_size = getPaddingSize(nb_int16,
sizeof(
Int16));
165 total += padded_int16_size.m_padded_size;
167 Int64 int32_position = total;
168 SizeInfo padded_int32_size = getPaddingSize(nb_int32,
sizeof(
Int32));
169 total += padded_int32_size.m_padded_size;
171 Int64 int64_position = total;
172 SizeInfo padded_int64_size = getPaddingSize(nb_int64,
sizeof(
Int64));
173 total += padded_int64_size.m_padded_size;
175 Int64 byte_position = total;
176 SizeInfo padded_byte_size = getPaddingSize(nb_byte,
sizeof(
Byte));
177 total += padded_byte_size.m_padded_size;
179 Int64 int8_position = total;
180 SizeInfo padded_int8_size = getPaddingSize(nb_int8,
sizeof(
Int8));
181 total += padded_int8_size.m_padded_size;
183 Int64 float16_position = total;
184 SizeInfo padded_float16_size = getPaddingSize(nb_float16,
sizeof(Float16));
185 total += padded_float16_size.m_padded_size;
187 Int64 bfloat16_position = total;
188 SizeInfo padded_bfloat16_size = getPaddingSize(nb_bfloat16,
sizeof(BFloat16));
189 total += padded_bfloat16_size.m_padded_size;
191 Int64 float32_position = total;
192 SizeInfo padded_float32_size = getPaddingSize(nb_float32,
sizeof(
Float32));
193 total += padded_float32_size.m_padded_size;
249 void copy(Impl* rhs)
override
264 Span<Byte> globalBuffer()
override
269 Span<const Byte> globalBuffer()
const override
279 void preallocate(
Int64 size)
override
285 void releaseBuffer()
override
290 void setFromSizes()
override
294 ARCCORE_FATAL(
"Bad tag id '{0}' for serializer (expected={1})."
295 "The data are not from a BasicSerializer. SizeView={2}",
299 ARCCORE_FATAL(
"Bad version '{0}' for serializer. Only version 1 is allowed",version_id);
344 Int64 totalSize()
const override
349 void printSizes(std::ostream& o)
const override
352 Int64 total_size = totalSize();
354 o <<
" bytes " << bytes.
size()
355 <<
" total_size " << total_size
356 <<
" float64 " << sbuf_sizes[IDX_NB_FLOAT64]
357 <<
" int64 " << sbuf_sizes[IDX_NB_INT64]
358 <<
" int32 " << sbuf_sizes[IDX_NB_INT32]
359 <<
" int16 " << sbuf_sizes[IDX_NB_INT16]
360 <<
" byte " << sbuf_sizes[IDX_NB_BYTE]
361 <<
" int8 " << sbuf_sizes[IDX_NB_INT8]
362 <<
" float16 " << sbuf_sizes[IDX_NB_FLOAT16]
363 <<
" bfloat16 " << sbuf_sizes[IDX_NB_BFLOAT16]
364 <<
" float32 " << sbuf_sizes[IDX_NB_FLOAT32]
365 <<
" ptr=" << (
void*)bytes.data();
370 SizeInfo getPaddingSize(
Int64 nb_elem,
Int64 elem_size)
373 ARCCORE_FATAL(
"Bad number of element '{0}' (should be >=0)",nb_elem);
375 ARCCORE_FATAL(
"Bad elem_size '{0}'",elem_size);
376 Int64 s = nb_elem * elem_size;
377 Int64 pad = s % ALIGN_SIZE;
380 Int64 new_size = s + (ALIGN_SIZE-pad);
381 if ( (new_size%ALIGN_SIZE)!=0 )
382 ARCCORE_FATAL(
"Bad padding {0}",new_size);
384 return { s, new_size };
395 Int64 begin = position + size_info.m_original_size;
396 Int64 end = position + size_info.m_padded_size;
409 void _checkAlignment()
422 void _checkAddr(
void* ptr)
425 if ((addr%ALIGN_SIZE)!=0){
427 ARCCORE_FATAL(
"Bad alignment addr={0} - {1}",addr,(addr % ALIGN_SIZE));
431 void _printAlignment()
447 void _printAddr(
void* ptr,
const String& name)
450 std::cout <<
"Align type=" << name <<
" addr=" << addr <<
" offset=" << (addr % ALIGN_SIZE) <<
'\n';
453 void _allocBuffer(
Int64 size)
459 Int64 padding = addr % ALIGN_SIZE;
462 position = ALIGN_SIZE - padding;
465 Int64 new_size = (size + ALIGN_SIZE) - (size%ALIGN_SIZE);
469 auto padding_view =
m_buffer.
span().subspan(position+size,new_size-size);
480BasicSerializer::Impl2::
483, m_read_mode(ReadReplace)
484, m_p(new BasicSerializerNewImpl())
491BasicSerializer::Impl2::
500void BasicSerializer::Impl2::
503 ARCCORE_ASSERT((m_mode==ModeReserve),(
"Bad mode"));
505 case DT_Real: m_real.m_reserved_size += n;
break;
506 case DT_Int64: m_int64.m_reserved_size += n;
break;
507 case DT_Int32: m_int32.m_reserved_size += n;
break;
508 case DT_Int16: m_int16.m_reserved_size += n;
break;
509 case DT_Byte: m_byte.m_reserved_size += n;
break;
510 case DT_Int8: m_int8.m_reserved_size += n;
break;
511 case DT_Float16: m_float16.m_reserved_size += n;
break;
512 case DT_BFloat16: m_bfloat16.m_reserved_size += n;
break;
513 case DT_Float32: m_float32.m_reserved_size += n;
break;
515 ARCCORE_THROW(ArgumentException,
"bad datatype v={0}",(
int)dt);
517 if (m_is_serialize_typeinfo)
519 m_byte.m_reserved_size += nb_put;
525void BasicSerializer::Impl2::
528 if (m_is_serialize_typeinfo){
530 m_byte.put(Span<const Byte>(&b, 1));
537void BasicSerializer::Impl2::
540 if (!m_is_serialize_typeinfo)
543 m_byte.get(Span<Byte>(&b,1));
545 if (t!=expected_type)
546 ARCCORE_FATAL(
"Bad serialized type t='{0}' int={1}' expected='{2}'",t,(
int)t,expected_type);
552void BasicSerializer::Impl2::
555 m_p->allocateBuffer(m_real.m_reserved_size,m_int16.m_reserved_size,m_int32.m_reserved_size,
556 m_int64.m_reserved_size,m_byte.m_reserved_size,m_int8.m_reserved_size,
557 m_float16.m_reserved_size,m_bfloat16.m_reserved_size,m_float32.m_reserved_size);
564void BasicSerializer::Impl2::
574void BasicSerializer::Impl2::
577 m_real.m_buffer = m_p->getRealBuffer();
578 m_real.m_current_position = 0;
580 m_int64.m_buffer = m_p->getInt64Buffer();
581 m_int64.m_current_position = 0;
583 m_int32.m_buffer = m_p->getInt32Buffer();
584 m_int32.m_current_position = 0;
586 m_int16.m_buffer = m_p->getInt16Buffer();
587 m_int16.m_current_position = 0;
589 m_byte.m_buffer = m_p->getByteBuffer();
590 m_byte.m_current_position = 0;
592 m_int8.m_buffer = m_p->getInt8Buffer();
593 m_int8.m_current_position = 0;
595 m_float16.m_buffer = m_p->getFloat16Buffer();
596 m_float16.m_current_position = 0;
598 m_bfloat16.m_buffer = m_p->getBFloat16Buffer();
599 m_bfloat16.m_current_position = 0;
601 m_float32.m_buffer = m_p->getFloat32Buffer();
602 m_float32.m_current_position = 0;
608void BasicSerializer::Impl2::
613 Int64 nb_float16 = 0;
614 Int64 nb_bfloat16 = 0;
615 Int64 nb_float32 = 0;
616 allocateBuffer(nb_real,nb_int16,nb_int32,nb_int64,nb_byte,nb_int8,nb_float16,nb_bfloat16,nb_float32);
622void BasicSerializer::Impl2::
627 m_real.m_reserved_size = nb_real;
628 m_int64.m_reserved_size = nb_int64;
629 m_int32.m_reserved_size = nb_int32;
630 m_int16.m_reserved_size = nb_int16;
631 m_byte.m_reserved_size = nb_byte;
632 m_int8.m_reserved_size = nb_int8;
633 m_float16.m_reserved_size = nb_float16;
634 m_bfloat16.m_reserved_size = nb_bfloat16;
635 m_float32.m_reserved_size = nb_float32;
642void BasicSerializer::Impl2::
643copy(
const BasicSerializer& rhs)
645 auto rhs_p = rhs._p();
646 Span<Real> real_b = rhs_p->getRealBuffer();
647 Span<Int64> int64_b = rhs_p->getInt64Buffer();
648 Span<Int32> int32_b = rhs_p->getInt32Buffer();
649 Span<Int16> int16_b = rhs_p->getInt16Buffer();
650 Span<Byte> byte_b = rhs_p->getByteBuffer();
651 Span<Int8> int8_b = rhs_p->getInt8Buffer();
652 Span<Float16> float16_b = rhs_p->getFloat16Buffer();
653 Span<BFloat16> bfloat16_b = rhs_p->getBFloat16Buffer();
654 Span<Float32> float32_b = rhs_p->getFloat32Buffer();
655 allocateBuffer(real_b.size(),int16_b.size(),int32_b.size(),int64_b.size(),byte_b.size(),
656 int8_b.size(),float16_b.size(),bfloat16_b.size(),float32_b.size());
663void BasicSerializer::Impl2::
664setMode(eMode new_mode)
667 m_real.m_current_position = 0;
668 m_int64.m_current_position = 0;
669 m_int32.m_current_position = 0;
670 m_int16.m_current_position = 0;
671 m_byte.m_current_position = 0;
672 m_int8.m_current_position = 0;
673 m_float16.m_current_position = 0;
674 m_bfloat16.m_current_position = 0;
675 m_float32.m_current_position = 0;
697BasicSerializer(
const BasicSerializer& sb)
715BasicSerializer::Impl* BasicSerializer::
725Span<Real> BasicSerializer::realBuffer() {
return m_p2->m_real.m_buffer; }
726Span<Int64> BasicSerializer::int64Buffer() {
return m_p2->m_int64.m_buffer; }
727Span<Int32> BasicSerializer::int32Buffer() {
return m_p2->m_int32.m_buffer; }
728Span<Int16> BasicSerializer::int16Buffer() {
return m_p2->m_int16.m_buffer; }
729Span<Byte> BasicSerializer::byteBuffer() {
return m_p2->m_byte.m_buffer; }
737 m_p2->reserve(dt,n,1);
746 m_p2->reserve(dt,n,n);
831 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
833 m_p2->m_real.put(values);
842 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
844 m_p2->m_int64.put(values);
853 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
855 m_p2->m_int32.put(values);
864 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
866 m_p2->m_int16.put(values);
875 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
877 m_p2->m_byte.put(values);
886 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
888 m_p2->m_int8.put(values);
897 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
899 m_p2->m_float16.put(values);
908 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
909 m_p2->putType(eBasicDataType::BFloat16);
910 m_p2->m_bfloat16.put(values);
919 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
921 m_p2->m_float32.put(values);
930 ARCCORE_ASSERT((m_p2->m_mode==
ModePut),(
"Bad mode"));
1008 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1010 m_p2->m_real.get(values);
1019 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1021 m_p2->m_int64.get(values);
1030 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1032 m_p2->m_int32.get(values);
1041 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1043 m_p2->m_int16.get(values);
1052 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1054 m_p2->m_byte.get(values);
1063 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1065 m_p2->m_int8.get(values);
1074 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1076 m_p2->m_float16.get(values);
1085 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1086 m_p2->getAndCheckType(eBasicDataType::BFloat16);
1087 m_p2->m_bfloat16.get(values);
1096 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1098 m_p2->m_float32.get(values);
1175 ARCCORE_ASSERT((m_p2->m_mode==
ModeGet),(
"Bad mode"));
1188 m_p2->allocateBuffer();
1197 return m_p2->m_mode;
1206 m_p2->setMode(new_mode);
1215 return m_p2->m_read_mode;
1224 m_p2->m_read_mode = new_read_mode;
1234 m_p2->allocateBuffer(nb_real,nb_int16,nb_int32,nb_int64,nb_byte,0,0,0,0);
1241copy(
const BasicSerializer& rhs)
1254 ARCCORE_FATAL(
"Can only copy from 'BasicSerializer'");
1264 return _p()->globalBuffer();
1270Span<const Byte> BasicSerializer::
1273 return _p()->globalBuffer();
1280copyAndGetSizesBuffer()
1282 return _p()->copyAndGetSizesBuffer();
1291 return _p()->sizesBuffer();
1297void BasicSerializer::
1298preallocate(
Int64 size)
1300 return _p()->preallocate(size);
1306void BasicSerializer::
1309 _p()->releaseBuffer();
1315void BasicSerializer::
1318 m_p2->setFromSizes();
1324Int64 BasicSerializer::
1327 return _p()->totalSize();
1333void BasicSerializer::
1334printSizes(std::ostream& o)
const
1336 _p()->printSizes(o);
1347 preallocate(nb_byte);
1348 globalBuffer().
copy(buf);
1358 m_p2->setSerializeTypeInfo(v);
1364bool BasicSerializer::
1365isSerializeTypeInfo()
const
1367 return m_p2->isSerializeTypeInfo();
Lecteur des fichiers de maillage via la bibliothèque LIMA.
void dispose()
Libère la mémoire utilisée par le tableau.
void fill(const T &o) noexcept
Remplit le tableau avec la valeur o.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Classe de base des vecteurs 1D de données.
Span< const T > span() const
Vue immutable sur ce tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Implémentation d'un buffer de sérialisation contigu en mémoire.
static constexpr Int64 SERIALIZE_TAG
Tag identifiant la sérialisation.
UniqueArray< Byte > m_buffer
Tableau contenant les données sérialisées.
Span< Int32 > m_int32_view
Vue sur les entiers 32 bits.
Span< Int16 > m_int16_view
Vue sur les entiers 16 bits.
void _fillPadding(Int64 position, SizeInfo size_info)
Remplit avec une valeur fixe les zones correspondantes au padding. Cela permet d'éviter d'avoir des v...
Int64 m_size_copy_buffer[NB_SIZE_ELEM]
Copie des tailles utilisée pour l'envoie en plusieurs fois.
Span< Byte > m_byte_view
Vur les octets.
static constexpr int IDX_RESERVED1
Champ réservé pour des informations supplémentaires (par exemple compression)
Span< Byte > m_buffer_view
Vue alignée sur ALIGN_SIZE du m_buffer.
Span< Float32 > m_float32_view
Vur les Float32.
Span< Int8 > m_int8_view
Vur les Int8.
Span< BFloat16 > m_bfloat16_view
Vur les BFloat16.
Span< Float16 > m_float16_view
Vur les Float16.
Span< Int64 > m_int64_view
Vue sur les entiers 64 bits.
Int64ArrayView m_sizes_view
Vue pour les tailles (doit être un multiple de ALIGN_SIZE);.
static constexpr int IDX_TAG
Index du tag pour identifier qu'il s'agit d'une sérialisation.
static constexpr int IDX_VERSION
Version de la sérialisation.
Span< Real > m_real_view
Vue sur les reels;.
static constexpr int IDX_TOTAL_SIZE
Position du champs indiquant la taille totale de la sérialisation.
Implémentation basique de 'ISerializer'.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
Int64 getInt64() override
Récupère une taille.
void getArray(Array< Real > &values) override
Redimensionne et remplit values.
void setReadMode(eReadMode new_read_mode) override
Positionne le mode de lecture.
void copy(const ISerializer *from) override
Copie les données de from dans cette instance.
void reserve(eDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void initFromBuffer(Span< const Byte > buf)
Initialise le sérialiseur en lecture à partir des données buf.
void putSpan(Span< const Int8 > values) override
Ajoute le tableau values.
void put(Span< const Real > values) override
Ajoute le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
void setSerializeTypeInfo(bool v)
Indique si on sérialise le type de donnée pour garantir la cohérence.
void putInt64(Int64 value) override
Ajoute l'entier value.
void reserveArray(Span< const Real > values) override
Réserve pour sauver le nombre d'éléments et les values éléments.
static ARCCORE_CONSTEXPR Integer paddingSize()
Taille du padding et de l'alignement.
void getSpan(Span< Real > values) override
Récupère le tableau values.
eMode mode() const override
Mode de fonctionnement actuel.
void get(RealArrayView values) override
Récupère le tableau values.
void reserveSpan(eDataType dt, Int64 n) override
Réserve de la mémoire pour n valeurs de dt.
eReadMode readMode() const override
Mode de lecture.
void putArray(Span< const Real > values) override
Sauve le nombre d'éléments et les values éléments.
Interface d'un sérialiseur.
eMode
Mode de fonctionnement du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
@ DT_Int64
Donnée de type entier 64 bits.
eReadMode
Mode de lecture du sérialiseur.
ARCCORE_HOST_DEVICE void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr ARCCORE_HOST_DEVICE SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
constexpr ARCCORE_HOST_DEVICE Span< T, DynExtent > subspan(Int64 abegin, Int64 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
Chaîne de caractères unicode.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Int64 length() const
Retourne la longueur de la chaîne.
Vecteur 1D de données avec sémantique par valeur (style STL).
@ DT_Float32
Donnée de type 'Float32'.
@ DT_Int16
Donnée de type entier 16 bits.
@ DT_Int8
Donnée de type entier sur 8 bits.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Float16
Donnée de type 'Float16'.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_BFloat16
Donnée de type 'BFloat16'.
@ DT_Real
Donnée de type réel.
@ DT_Byte
Donnée de type octet.
Espace de nom de Arccore.
Int32 Integer
Type représentant un entier.
float Float32
Type flottant IEEE-753 simple précision.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
eBasicDataType
Type d'une donnée de base.
@ Float32
Donnée de type Float32.
@ Float16
Donnée de type Float16.
@ Int16
Donnée de type entier 16 bits.
@ Int8
< Donnée de type BFloat16
@ Byte
Donnée de type octet.
@ Int32
Donnée de type entier 32 bits.
@ Float64
Donnée de type Float64.
@ Int64
Donnée de type entier 64 bits.
std::int64_t Int64
Type entier signé sur 64 bits.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
std::int8_t Int8
Type entier signé sur 8 bits.
unsigned char Byte
Type d'un octet.
Informations sur la taille allouée avec et sans padding.