14#include "arcane/impl/internal/Array2Data.h"
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/Real2.h"
18#include "arcane/utils/Real2x2.h"
19#include "arcane/utils/Real3.h"
20#include "arcane/utils/Real3x3.h"
21#include "arcane/utils/IHashAlgorithm.h"
22#include "arcane/utils/NotImplementedException.h"
23#include "arcane/utils/ArgumentException.h"
24#include "arcane/utils/FatalErrorException.h"
25#include "arcane/utils/ITraceMng.h"
26#include "arcane/utils/CheckedConvert.h"
27#include "arcane/utils/MemoryAllocator.h"
30#include "arcane/core/datatype/DataStorageBuildInfo.h"
31#include "arcane/core/datatype/IDataOperation.h"
33#include "arcane/core/ISerializer.h"
35#include "arcane/impl/SerializedData.h"
48inline constexpr Int64 SERIALIZE2_MAGIC_NUMBER = 0x12ff7789;
58, m_internal(new Impl(this))
65template<
typename DataType> Array2DataT<DataType>::
66Array2DataT(
const Array2DataT<DataType>& rhs)
67: m_value(AlignedMemoryAllocator::Simd())
69, m_internal(new Impl(this))
70, m_allocation_info(rhs.m_allocation_info)
78template<
typename DataType> Array2DataT<DataType>::
81, m_trace(dsbi.traceMng())
82, m_internal(new Impl(this))
89template<
typename DataType> Array2DataT<DataType>::
102staticStorageTypeInfo()
106 Int32 nb_basic_type = TraitsType::nbBasicType();
116storageTypeInfo()
const
118 return staticStorageTypeInfo();
124template<
typename DataType>
void Array2DataT<DataType>::
134createSerializedDataRef(
bool use_basic_type)
const
140 Int64 type_size =
sizeof(DataType);
145 type_size =
sizeof(BasicType);
149 Int64 nb_base_element = nb_element * nb_count;
150 Int64 full_size = nb_base_element * type_size;
151 const Byte* bt =
reinterpret_cast<const Byte*
>(
m_value.to1DSpan().data());
155 dimensions[0] =
m_value.dim1Size();
156 dimensions[1] =
m_value.dim2Size();
159 nb_base_element,
false,dimensions,
shape());
160 sd->setConstBytes(base_values);
167template<
typename DataType>
void Array2DataT<DataType>::
175 if (data_type!=
dataType() && data_type==base_data_type)
187 m_value.resize(dim1_size,dim2_size);
188 m_shape = sdata->
shape();
198template<
typename DataType>
void Array2DataT<DataType>::
201 ARCANE_UNUSED(sdata);
208template<
typename DataType>
void Array2DataT<DataType>::
216 if (mode==ISerializer::ModeReserve){
225 sbuf->
reserveSpan(data_type,total_nb_element*nb_count);
234 n[3] = SERIALIZE2_MAGIC_NUMBER;
236 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data());
242 Int64 n[4] = { 0, 0, 0, 0 };
245 Int64 dim2_size = n[1];
247 if (n[3]!=SERIALIZE2_MAGIC_NUMBER)
253 m_value.resize(count,dim2_size);
256 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data());
268 m_value.resize(current_size + count,dim2_size);
271 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data()+current_total);
284template<
typename DataType>
void Array2DataT<DataType>::
292 if (mode==ISerializer::ModeReserve){
301 sbuf->
reserveSpan(data_type,total_nb_value*nb_count);
307 Int64 total_nb_value = count * dim2_size;
308 Int64 total = total_nb_value;
313 n[3] = SERIALIZE2_MAGIC_NUMBER;
324 for(
Int32 i=0, is=count; i<is; ++i ){
325 const BasicType* sub_a =
reinterpret_cast<const BasicType*
>(
m_value[ids[i]].data());
326 for(
Int64 z=0, iz=dim2_size*nb_count; z<iz; ++z ){
338 Int64 n[4] = { 0, 0, 0, 0 };
341 Int64 dim2_size = n[1];
342 Int32 count = CheckedConvert::toInt32(n[2]);
343 Int64 total = count * dim2_size;
353 if (n[3]!=SERIALIZE2_MAGIC_NUMBER)
356 if (dim2_size!=current_dim2_size){
357 if (current_dim2_size!=0 && dim2_size!=0)
358 ARCANE_FATAL(
"serialized data should have the same dim2Size current={0} found={1}",
359 current_dim2_size,dim2_size);
363 Int64 nb_value = count;
369 Span<DataType> data_value(
reinterpret_cast<DataType*
>(base_value.
data()),nb_value*dim2_size);
375 if (operation && nb_value!=0) {
379 for(
Int32 i=0, n=count; i<n; ++i ){
381 for(
Int64 z=0, iz=dim2_size; z<iz; ++z ){
382 current_value[index] = a[z];
387 transformed_value = current_value.
view();
388 operation->applySpan(transformed_value,data_value);
391 transformed_value = data_value;
396 for(
Int32 i=0, n=count; i<n; ++i ){
398 for(
Int64 z=0, iz=dim2_size; z<iz; ++z ){
399 a[z] = transformed_value[index];
416template<
typename DataType>
void Array2DataT<DataType>::
425template<
typename DataType>
void Array2DataT<DataType>::
426setName(
const String& name)
434template<
typename DataType>
void Array2DataT<DataType>::
441 Int64 type_size =
sizeof(DataType);
443 const Byte* ptr =
reinterpret_cast<const Byte*
>(values.
data());
449 dimensions[0] =
m_value.dim1Size();
450 dimensions[1] =
m_value.dim2Size();
451 ptr =
reinterpret_cast<const Byte*
>(dimensions.
data());
463 hash_info.setVersion(2);
468 dimensions[0] = m_value.dim1Size();
469 dimensions[1] = m_value.dim2Size();
480template<
typename DataType>
void Array2DataT<DataType>::
481copy(
const IData* data)
483 auto* true_data =
dynamic_cast< const DataInterfaceType*
>(data);
486 m_value.copy(true_data->view());
492template<
typename DataType>
void Array2DataT<DataType>::
493swapValues(
IData* data)
495 auto* true_data =
dynamic_cast<ThatClass*
>(data);
498 swapValuesDirect(true_data);
507 m_value.swap(true_data->m_value);
513template<
typename DataType>
void Array2DataT<DataType>::
516 if (m_allocation_info==v)
518 m_allocation_info = v;
519 m_value.setMemoryLocationHint(v.memoryLocationHint());
528 m_value.changeAllocator(alloc_info);
529 m_allocation_info.setMemoryLocationHint(alloc_info.memoryLocationHint());
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
Integer size() const
Nombre d'éléments du vecteur.
Allocateur mémoire avec alignement mémoire spécifique.
Exception lorsqu'un argument est invalide.
IMemoryAllocator * memoryAllocator() const override
Allocateur utilisé pour la donnée.
Donnée tableau bi-dimensionnel d'un type DataType.
UniqueArray2< DataType > m_value
Integer dimension() const override
eDataType dataType() const override
Type de la donnée.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
const T * data() const
Accès à la racine du tableau hors toute protection.
ArrayView< T > view() const
Vue mutable sur ce tableau.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Informations sur l'allocation d'une donnée.
Informations pour le calcul du hash d'une donnée.
Informations pour construire une instance de 'IData'.
Informations de type pour un conteneur de données.
Interface d'une opération sur une donnée.
Contexte pour calculer un hash de manière incrémentale.
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 Int64ConstArrayView extents() const =0
Tableau contenant le nombre d'éléments pour chaque dimension.
virtual bool isMultiSize() const =0
Indique s'il s'agit d'un tableau multi-taille. (pertinent uniquement si nbDimension()>1)
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()
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.
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__ pointer data() const noexcept
Pointeur sur le début de la vue.
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).
-*- 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.
@ Int64
Donnée de type entier 64 bits.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
std::int32_t Int32
Type entier signé sur 32 bits.