14#include "arcane/impl/internal/ArrayData.h"
16#include "arccore/common/AlignedMemoryAllocator.h"
18#include "arcane/utils/NotSupportedException.h"
19#include "arcane/utils/Real2.h"
20#include "arcane/utils/Real2x2.h"
21#include "arcane/utils/Real3.h"
22#include "arcane/utils/Real3x3.h"
23#include "arcane/utils/IHashAlgorithm.h"
24#include "arcane/utils/NotImplementedException.h"
25#include "arcane/utils/IndexOutOfRangeException.h"
26#include "arcane/utils/ArgumentException.h"
27#include "arcane/utils/FatalErrorException.h"
28#include "arcane/utils/ITraceMng.h"
29#include "arcane/utils/CheckedConvert.h"
30#include "arcane/utils/MemoryAllocator.h"
33#include "arcane/core/datatype/DataStorageBuildInfo.h"
34#include "arcane/core/datatype/IDataOperation.h"
36#include "arcane/core/ISerializer.h"
38#include "arcane/impl/SerializedData.h"
47 inline constexpr Int64 SERIALIZE_MAGIC_NUMBER = 0x456ff989;
57, m_internal(new Impl(this))
65template <
typename DataType> ArrayDataT<DataType>::
66ArrayDataT(
const ArrayDataT<DataType>& rhs)
67: m_value(AlignedMemoryAllocator::Simd())
69, m_internal(new Impl(this))
71, m_allocation_info(rhs.m_allocation_info)
73 m_value = rhs.m_value.constSpan();
79template <
typename DataType> ArrayDataT<DataType>::
80ArrayDataT(
const DataStorageBuildInfo& dsbi)
81: m_value(dsbi.memoryAllocator())
82, m_trace(dsbi.traceMng())
83, m_internal(new Impl(this))
91template <
typename DataType> ArrayDataT<DataType>::
103template <
typename DataType> DataStorageTypeInfo ArrayDataT<DataType>::
104staticStorageTypeInfo()
106 typedef DataTypeTraitsT<DataType> TraitsType;
108 Int32 nb_basic_type = TraitsType::nbBasicType();
111 return DataStorageTypeInfo(bdt, nb_basic_type, dimension, multi_tag);
118storageTypeInfo()
const
120 return staticStorageTypeInfo();
127createSerializedDataRef(
bool use_basic_type)
const
133 Integer type_size =
sizeof(DataType);
135 if (use_basic_type) {
138 type_size =
sizeof(BasicType);
142 Int64 nb_base_element = nb_element * nb_count;
143 Int64 full_size = nb_base_element * type_size;
146 extents.
add(nb_element);
148 nb_base_element,
false, extents,
shape());
149 sd->setConstBytes(base_values);
156template <
typename DataType>
void ArrayDataT<DataType>::
164 if (data_type !=
dataType() && data_type == base_data_type)
172 m_shape = sdata->
shape();
181template <
typename DataType>
void ArrayDataT<DataType>::
184 ARCANE_UNUSED(sdata);
191template <
typename DataType>
void ArrayDataT<DataType>::
199 switch (sbuf->
mode()) {
200 case ISerializer::ModeReserve: {
202 Int64 total_size = nb_value * nb_count;
203 m_trace->debug(
Trace::High) <<
" ArrayDataT::serialize (full) reserve datatype="
204 << data_type <<
" ids=" << nb_value <<
" totalsize=" << total_size;
210 Int64 total_size = nb_value * nb_count;
211 m_trace->debug(
Trace::High) <<
" ArrayDataT::serialize (full) put datatype="
212 << data_type <<
" ids=" << nb_value <<
" totalsize=" << total_size;
214 for (
Int64 i = 0; i < nb_value; ++i)
218 sbuf->
putInt64(SERIALIZE_MAGIC_NUMBER);
226 if (saved_magic_number != SERIALIZE_MAGIC_NUMBER)
227 ARCANE_FATAL(
"Internal errror: bad magic number for serialisation expected={0} current={1}",
228 SERIALIZE_MAGIC_NUMBER, saved_magic_number);
230 Int64 total_size = nb_value * nb_count;
232 m_trace->debug(
Trace::High) <<
" ArrayDataT::serialize (full) get mode=" << sbuf->
readMode()
233 <<
" datatype=" << data_type
234 <<
" ids=" << nb_value <<
" totalsize=" << total_size;
243 operation->applySpan(
m_value, data_value);
245 for (
Int64 i = 0; i < nb_value; ++i)
247 << data_value[i] <<
" transformed value=" <<
m_value[i];
253 for (
Int64 i = 0; i < nb_value; ++i)
259 m_value.resize(current_size + nb_value);
265 for (
Int64 i = 0; i < nb_value; ++i)
277template <
typename DataType>
void ArrayDataT<DataType>::
280 _serialize(sbuf, ids, operation);
295 Int64 total_size = nb_value * nb_count;
297 switch (sbuf->
mode()) {
298 case ISerializer::ModeReserve: {
299 m_trace->debug(
Trace::High) <<
" ArrayDataT::serialize (partial) reserve datatype="
300 << data_type <<
" ids=" << nb_value <<
" totalsize=" << total_size;
304 case ISerializer::ModePut: {
305 m_trace->debug(Trace::High) <<
" ArrayDataT::serialize (partial) put datatype="
306 << data_type <<
" ids=" << nb_value <<
" totalsize=" << total_size;
309 for (Integer i = 0, max_value = m_value.size(); i < nb_value; ++i)
310 if (ids[i] > max_value)
311 throw IndexOutOfRangeException(A_FUNCINFO,
312 String::format(
" put,serialize : tailles incorrectes i={0} ids[i]={1} nb_value={2} this={3}",
313 i, ids[i], max_value,
this),
317 UniqueArray<BasicType> base_value;
318 base_value.reserve(total_size);
319 for (Int64 i = 0; i < nb_value; ++i) {
321 m_trace->debug(Trace::Highest) <<
"Put i=" << i <<
" index=" << ids[i] <<
" value=" << m_value[ids[i]];
323 ConstArrayView<BasicType> current_value(nb_count,
reinterpret_cast<BasicType*
>(&m_value[ids[i]]));
324 base_value.addRange(current_value);
326 sbuf->
putInt64(SERIALIZE_MAGIC_NUMBER);
330 case ISerializer::ModeGet: {
331 m_trace->debug(Trace::High) <<
" ArrayDataT::serialize (partial) get mode=" << sbuf->
readMode()
332 <<
" datatype=" << data_type
333 <<
" ids=" << nb_value <<
" totalsize=" << total_size;
336 for (Integer i = 0, max_value = m_value.size(); i < nb_value; ++i)
337 if (ids[i] > max_value)
338 throw IndexOutOfRangeException(A_FUNCINFO,
339 String::format(
" put,serialize : tailles incorrectes i={0} ids[i]={1} nb_value={2} this={3}",
340 i, ids[i], max_value,
this),
345 case ISerializer::ReadReplace: {
346 Int64 saved_magic_number = sbuf->
getInt64();
347 Int64 saved_nb_value = sbuf->
getInt64();
349 if (saved_magic_number != SERIALIZE_MAGIC_NUMBER)
350 ARCANE_FATAL(
"Internal errror: mauvais nombre magique pour la sérialisation attendu={0} actuel={1}",
351 SERIALIZE_MAGIC_NUMBER, saved_magic_number);
353 if (saved_nb_value != nb_value)
354 ARCANE_FATAL(
"Internal errror: mauvaise taille pour la sérialisation attendue={0} trouvée={1}",
355 nb_value, saved_nb_value);
357 UniqueArray<BasicType> base_value(total_size);
360 Span<DataType> data_value(
reinterpret_cast<DataType*
>(base_value.data()), nb_value);
361 UniqueArray<DataType> current_value;
362 Span<DataType> transformed_value;
364 if (operation && nb_value != 0) {
365 current_value.resize(ids.size());
367 transformed_value = current_value.view();
368 operation->applySpan(transformed_value, data_value);
371 transformed_value = data_value;
376 for (Int64 i = 0; i < nb_value; ++i)
377 m_trace->debug(Trace::Highest) <<
"Get i=" << i <<
" index=" << ids[i]
378 <<
" value=" << data_value[i] <<
" transformed value=" << transformed_value[i];
380 for (Int64 i = 0; i < nb_value; ++i)
381 m_trace->debug(Trace::Highest) <<
"Get i=" << i <<
" index=" << ids[i]
382 <<
" value=" << data_value[i];
385 for (Int64 i = 0; i < nb_value; ++i) {
386 m_value[ids[i]] = transformed_value[i];
389 case ISerializer::ReadAdd:
390 ARCANE_THROW(NotImplementedException,
"ArrayData::serialize : Impossible de désérialiser avec le mode ReadAdd");
400template <
typename DataType>
void ArrayDataT<DataType>::
409template <
typename DataType>
void ArrayDataT<DataType>::
410setName(
const String& name)
418template <
typename DataType>
void ArrayDataT<DataType>::
421 Int64 type_size =
sizeof(DataType);
434 hash_info.setVersion(2);
441template <
typename DataType>
void ArrayDataT<DataType>::
442copy(
const IData* data)
444 auto* true_data =
dynamic_cast<const DataInterfaceType*
>(data);
447 m_value.copy(true_data->view());
453template <
typename DataType>
void ArrayDataT<DataType>::
454swapValues(
IData* data)
456 auto* true_data =
dynamic_cast<ThatClass*
>(data);
459 swapValuesDirect(true_data);
468 m_value.swap(true_data->m_value);
474template <
typename DataType>
void ArrayDataT<DataType>::
477 m_shape.setNbDimension(1);
478 m_shape.setDimension(0, 1);
484template <
typename DataType>
void ArrayDataT<DataType>::
487 if (m_allocation_info == v)
489 m_allocation_info = v;
490 m_value.setMemoryLocationHint(v.memoryLocationHint());
499 m_value.changeAllocator(alloc_info);
500 m_allocation_info.setMemoryLocationHint(alloc_info.memoryLocationHint());
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
Allocateur mémoire avec alignement mémoire spécifique.
Exception lorsqu'un argument est invalide.
Donnée tableau d'un type T.
eDataType dataType() const override
Type de la donnée.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
UniqueArray< DataType > m_value
Donnée.
const T * data() const
Accès à la racine du tableau hors toute protection.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Informations sur l'allocation d'une donnée.
Informations pour le calcul du hash d'une donnée.
Informations de type pour un conteneur de données.
Interface d'une opération sur une donnée.
virtual void updateHash(Span< const std::byte > input)=0
Ajoute le tableau input au hash calculé
Interface d'un algorithme de hashage.
virtual void computeHash64(Span< const Byte > input, ByteArray &output)
Calcule la valeur du hash pour le tableau input.
Interface d'une donnée sérialisée.
virtual eDataType baseDataType() const =0
Type de la donnée.
virtual ArrayShape shape() const =0
Forme du tableau associé aux données.
virtual Int64 memorySize() const =0
Indique le nombre d'octets qu'il faut allouer pour stocker ou lire les données.
virtual void setWritableBytes(Span< Byte > bytes)=0
Positionne les valeurs de sérialisation.
virtual Int64 nbElement() const =0
Nombre d'éléments.
Interface d'un sérialiseur.
void reserveInt64(Int64 n)
Réserve pour n Int64.
@ ModePut
Le sérialiseur attend des reserve().
@ ModeGet
Le sérialiseur attend des get().
virtual Int64 getInt64()=0
Récupère une taille.
virtual eReadMode readMode() const =0
Mode de lecture.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
@ ReadReplace
Replace les éléments actuels par ceux lus.
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual void reserveSpan(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
Interface du gestionnaire de traces.
Options pour configurer les allocations.
Exception lorsqu'une fonction n'est pas implémentée.
Référence à une instance.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
@ Highest
Niveau le plus élevé
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Ref< ISerializedData > arcaneCreateSerializedDataRef(eDataType data_type, Int64 memory_size, Integer nb_dim, Int64 nb_element, Int64 nb_base_element, bool is_multi_size, Int64ConstArrayView dimensions)
Créé des données sérialisées.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eBasicDataType
Type d'une donnée de base.
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Convertit la vue en un tableau d'octets non modifiables.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
void sampleSpan(Span< const DataType > values, Span< const Int64 > indexes, Span< DataType > result)
Extrait un sous-tableau à à partir d'une liste d'index.