14#include "arcane/impl/internal/Array2Data.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/ArgumentException.h"
26#include "arcane/utils/FatalErrorException.h"
27#include "arcane/utils/ITraceMng.h"
28#include "arcane/utils/CheckedConvert.h"
29#include "arcane/utils/MemoryAllocator.h"
32#include "arcane/core/datatype/DataStorageBuildInfo.h"
33#include "arcane/core/datatype/IDataOperation.h"
35#include "arcane/core/ISerializer.h"
37#include "arcane/impl/SerializedData.h"
50 inline constexpr Int64 SERIALIZE2_MAGIC_NUMBER = 0x12ff7789;
60, m_internal(new Impl(this))
67template <
typename DataType> Array2DataT<DataType>::
68Array2DataT(
const Array2DataT<DataType>& rhs)
69: m_value(AlignedMemoryAllocator::Simd())
71, m_internal(new Impl(this))
72, m_allocation_info(rhs.m_allocation_info)
74 m_value = rhs.m_value;
80template <
typename DataType> Array2DataT<DataType>::
81Array2DataT(
const DataStorageBuildInfo& dsbi)
82: m_value(dsbi.memoryAllocator())
83, m_trace(dsbi.traceMng())
84, m_internal(new Impl(this))
91template <
typename DataType> Array2DataT<DataType>::
103template <
typename DataType> DataStorageTypeInfo Array2DataT<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();
126template <
typename DataType>
void Array2DataT<DataType>::
136createSerializedDataRef(
bool use_basic_type)
const
142 Int64 type_size =
sizeof(DataType);
144 if (use_basic_type) {
147 type_size =
sizeof(BasicType);
151 Int64 nb_base_element = nb_element * nb_count;
152 Int64 full_size = nb_base_element * type_size;
153 const Byte* bt =
reinterpret_cast<const Byte*
>(
m_value.to1DSpan().data());
157 dimensions[0] =
m_value.dim1Size();
158 dimensions[1] =
m_value.dim2Size();
161 nb_base_element,
false, dimensions,
shape());
162 sd->setConstBytes(base_values);
169template <
typename DataType>
void Array2DataT<DataType>::
177 if (data_type !=
dataType() && data_type == base_data_type)
189 m_value.resize(dim1_size, dim2_size);
190 m_shape = sdata->
shape();
200template <
typename DataType>
void Array2DataT<DataType>::
203 ARCANE_UNUSED(sdata);
210template <
typename DataType>
void Array2DataT<DataType>::
218 if (mode == ISerializer::ModeReserve) {
227 sbuf->
reserveSpan(data_type, total_nb_element * nb_count);
236 n[3] = SERIALIZE2_MAGIC_NUMBER;
238 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data());
244 Int64 n[4] = { 0, 0, 0, 0 };
247 Int64 dim2_size = n[1];
249 if (n[3] != SERIALIZE2_MAGIC_NUMBER)
254 m_value.resize(count, dim2_size);
257 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data());
267 m_value.resize(current_size + count, dim2_size);
270 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data() + current_total);
282template <
typename DataType>
void Array2DataT<DataType>::
290 if (mode == ISerializer::ModeReserve) {
299 sbuf->
reserveSpan(data_type, total_nb_value * nb_count);
304 Int64 total_nb_value = count * dim2_size;
305 Int64 total = total_nb_value;
310 n[3] = SERIALIZE2_MAGIC_NUMBER;
321 for (
Int32 i = 0, is = count; i < is; ++i) {
322 const BasicType* sub_a =
reinterpret_cast<const BasicType*
>(
m_value[ids[i]].data());
323 for (
Int64 z = 0, iz = dim2_size * nb_count; z < iz; ++z) {
334 Int64 n[4] = { 0, 0, 0, 0 };
337 Int64 dim2_size = n[1];
338 Int32 count = CheckedConvert::toInt32(n[2]);
339 Int64 total = count * dim2_size;
349 if (n[3] != SERIALIZE2_MAGIC_NUMBER)
352 if (dim2_size != current_dim2_size) {
353 if (current_dim2_size != 0 && dim2_size != 0)
354 ARCANE_FATAL(
"serialized data should have the same dim2Size current={0} found={1}",
355 current_dim2_size, dim2_size);
359 Int64 nb_value = count;
365 Span<DataType> data_value(
reinterpret_cast<DataType*
>(base_value.
data()), nb_value * dim2_size);
371 if (operation && nb_value != 0) {
375 for (
Int32 i = 0, n = count; i < n; ++i) {
377 for (
Int64 z = 0, iz = dim2_size; z < iz; ++z) {
378 current_value[index] = a[z];
383 transformed_value = current_value.
view();
384 operation->applySpan(transformed_value, data_value);
387 transformed_value = data_value;
392 for (
Int32 i = 0, n = count; i < n; ++i) {
394 for (
Int64 z = 0, iz = dim2_size; z < iz; ++z) {
395 a[z] = transformed_value[index];
411template <
typename DataType>
void Array2DataT<DataType>::
420template <
typename DataType>
void Array2DataT<DataType>::
421setName(
const String& name)
429template <
typename DataType>
void Array2DataT<DataType>::
436 Int64 type_size =
sizeof(DataType);
438 const Byte* ptr =
reinterpret_cast<const Byte*
>(values.
data());
444 dimensions[0] =
m_value.dim1Size();
445 dimensions[1] =
m_value.dim2Size();
446 ptr =
reinterpret_cast<const Byte*
>(dimensions.
data());
458 hash_info.setVersion(2);
463 dimensions[0] = m_value.dim1Size();
464 dimensions[1] = m_value.dim2Size();
475template <
typename DataType>
void Array2DataT<DataType>::
476copy(
const IData* data)
478 auto* true_data =
dynamic_cast<const DataInterfaceType*
>(data);
481 m_value.copy(true_data->view());
487template <
typename DataType>
void Array2DataT<DataType>::
488swapValues(
IData* data)
490 auto* true_data =
dynamic_cast<ThatClass*
>(data);
493 swapValuesDirect(true_data);
502 m_value.swap(true_data->m_value);
508template <
typename DataType>
void Array2DataT<DataType>::
511 if (m_allocation_info == v)
513 m_allocation_info = v;
514 m_value.setMemoryLocationHint(v.memoryLocationHint());
523 m_value.changeAllocator(alloc_info);
524 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.
Donnée tableau bi-dimensionnel d'un type DataType.
UniqueArray2< DataType > m_value
Donnée.
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 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)
Convertit 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.