17#include "arcane/utils/NumArray.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/ArrayShape.h"
31#include "arccore/base/Span2.h"
33#include "arcane/core/datatype/DataAllocationInfo.h"
34#include "arcane/core/datatype/IDataOperation.h"
35#include "arcane/core/datatype/DataStorageTypeInfo.h"
36#include "arcane/core/datatype/DataStorageBuildInfo.h"
37#include "arcane/core/datatype/DataTypeTraits.h"
39#include "arcane/core/ISerializer.h"
40#include "arcane/core/IData.h"
41#include "arcane/core/IDataVisitor.h"
43#include "arcane/core/internal/IDataInternal.h"
45#include "arcane/impl/SerializedData.h"
46#include "arcane/impl/DataStorageFactory.h"
56 const Int64 SERIALIZE2_MAGIC_NUMBER = 0x923abd20;
61template <
class DataType,
int RankValue>
90template <
class DataType,
int RankValue>
95 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
101 typedef NumArrayDataT<DataType,RankValue> ThatClass;
160 ARCANE_UNUSED(visitor);
179 void swapValuesDirect(ThatClass* true_data);
197 void _resizeDim1(Int32 dim1_size);
198 Int64 _getDim2Size()
const;
199 Span2<DataType> _valueAsSpan2();
200 Span2<const DataType> _valueAsConstSpan2();
217: m_value(rhs.m_value)
218, m_trace(rhs.m_trace)
219, m_allocation_info(rhs.m_allocation_info)
228: m_trace(dsbi.traceMng())
251 Int32 nb_basic_type = TraitsType::nbBasicType();
252 Int32 dimension = RankValue;
254 String impl_name =
"NumArray";
264 return staticStorageTypeInfo();
274 auto extents = m_value.extents();
275 extents.setExtent0(dim1_size);
276 m_value.
resize(extents.dynamicExtents());
282template<
typename DataType,
int RankValue> Int64
283NumArrayDataT<DataType,RankValue>::
288 auto extents = m_value.extents();
289 auto std_extents = extents.asStdArray();
291 for(
Integer i=0; i<RankValue; ++i )
292 dim2_size *= std_extents[i];
304 Int64 dim1_size = m_value.dim1Size();
305 Int64 dim2_size = _getDim2Size();
306 Span2<DataType> value_as_span2(m_value.to1DSpan().data(),dim1_size,dim2_size);
307 return value_as_span2;
320 Int64 dim1_size = m_value.dim1Size();
321 Int64 dim2_size = _getDim2Size();
323 return value_as_span2;
332 _resizeDim1(new_size);
346 Int64 type_size =
sizeof(DataType);
351 type_size =
sizeof(BasicType);
355 Int64 nb_base_element = nb_element * nb_count;
356 Int64 full_size = nb_base_element * type_size;
357 const Byte* bt =
reinterpret_cast<const Byte*
>(
m_value.to1DSpan().data());
359 auto extents =
m_value.extents();
360 auto std_extents = extents.asStdArray();
363 for (
Int32 i=0; i<nb_extent; ++i )
364 dimensions[i] = std_extents[i];
366 nb_base_element,
false,dimensions,
shape());
367 sd->setConstBytes(base_values);
382 if (data_type!=
dataType() && data_type==base_data_type)
391 std::array<Int32,RankValue> numarray_extents;
392 for(
Int32 i=0; i<RankValue; ++i )
395 m_value.resize(extents.dynamicExtents());
408 ARCANE_UNUSED(sdata);
425 if (mode==ISerializer::ModeReserve){
438 n[0] = SERIALIZE2_MAGIC_NUMBER;
442 auto ext =
m_value.extents().asStdArray();
448 Int64 n[2] = { 0, 0 };
451 if (n[0]!=SERIALIZE2_MAGIC_NUMBER)
453 Int32 extents_buf[RankValue];
456 Int32 count = extents_span[0];
464 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data());
478 _resizeDim1(current_size + count);
481 BasicType* bt =
reinterpret_cast<BasicType*
>(
m_value.to1DSpan().data()+current_total);
497 ARCANE_UNUSED(operation);
500 [[maybe_unused]]
Integer nb_count = 1;
504 if (mode==ISerializer::ModeReserve){
513 auto sub_extent =
m_value.extents().removeFirstExtent();
518 Int64 dim2_size = _getDim2Size();
519 Int64 total_nb_value = count * dim2_size;
520 Int64 total = total_nb_value;
523 n[0] = SERIALIZE2_MAGIC_NUMBER;
535 auto ext =
m_value.extents().asStdArray();
543 for(
Int32 i=0, n=count; i<n; ++i ){
544 const BasicType* sub_a =
reinterpret_cast<const BasicType*
>(value_as_span2[ids[i]].
data());
545 for(
Int64 z=0, iz=dim2_size*nb_count; z<iz; ++z ){
558 Int64 n[3] = { 0, 0, 0 };
561 Int64 dim2_size = n[2];
562 Int64 total = count * dim2_size;
572 if (n[1]!=SERIALIZE2_MAGIC_NUMBER)
575 Int32 extents_buf[RankValue];
581 Int64 current_dim2_size = _getDim2Size();
583 if (dim2_size!=current_dim2_size){
584 if (current_dim2_size!=0 && dim2_size!=0)
585 ARCANE_FATAL(
"serialized data should have the same dim2Size current={0} found={1}",
586 current_dim2_size,dim2_size);
588 _resizeDim1(
m_value.dim1Size());
590 Int64 nb_value = count;
596 Span<DataType> data_value(
reinterpret_cast<DataType*
>(base_value.
data()),nb_value*dim2_size);
603 if (operation && nb_value!=0) {
607 for(
Int32 i=0, n=count; i<n; ++i ){
609 for(
Int64 z=0, iz=dim2_size; z<iz; ++z ){
610 current_value[index] = a[z];
615 transformed_value = current_value.
view();
616 operation->applySpan(transformed_value,data_value);
619 transformed_value = data_value;
624 for(
Int32 i=0, n=count; i<n; ++i ){
626 for(
Int64 z=0, iz=dim2_size; z<iz; ++z ){
627 a[z] = transformed_value[index];
668 Int64 type_size =
sizeof(DataType);
670 const Byte* ptr =
reinterpret_cast<const Byte*
>(values.
data());
677 auto ext =
m_value.extents().asStdArray();
689 auto* true_data =
dynamic_cast< const DataInterfaceType*
>(data);
692 m_value.copy(true_data->view());
701 auto* true_data =
dynamic_cast<ThatClass*
>(data);
704 swapValuesDirect(true_data);
713 m_value.swap(true_data->m_value);
720registerNumArrayDataFactory(IDataFactoryMng* dfm)
722 DataStorageFactory<NumArrayDataT<Real,1>>::registerDataFactory(dfm);
725 DataStorageFactory<NumArrayDataT<Int64,1>>::registerDataFactory(dfm);
727 DataStorageFactory<NumArrayDataT<Real,2>>::registerDataFactory(dfm);
730 DataStorageFactory<NumArrayDataT<Int64,2>>::registerDataFactory(dfm);
732 DataStorageFactory<NumArrayDataT<Real,3>>::registerDataFactory(dfm);
735 DataStorageFactory<NumArrayDataT<Int64,3>>::registerDataFactory(dfm);
737 DataStorageFactory<NumArrayDataT<Real,4>>::registerDataFactory(dfm);
740 DataStorageFactory<NumArrayDataT<Int64,4>>::registerDataFactory(dfm);
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Gestion des références à une classe C++.
Exception lorsqu'un argument est invalide.
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 du pattern visitor pour une donnée tableau 2D.
Interface du pattern visitor pour une donnée tableau.
Interface d'une opération sur une donnée.
Interface du pattern visitor pour une donnée.
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'un 'IData' dont le conteneur repose sur un 'NumArray'.
virtual Ref< ThatClass > cloneTrueEmptyRef()=0
Clone la donnée mais sans éléments.
virtual MDSpan< const DataType, ExtentType > view() const =0
Vue constante sur la donnée.
virtual MDSpan< DataType, ExtentType > view()=0
Vue sur la donnée.
virtual Ref< ThatClass > cloneTrueRef()=0
Clone la donnée.
Interface du pattern visitor pour une donnée scalaire.
Interface d'une donnée sérialisée.
virtual eDataType baseDataType() const =0
Type de la donnée.
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.
Classe de base des vues multi-dimensionnelles.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
void computeHash(DataHashInfo &) override
Calcule le hash de la donnée.
Implémentation d'un 'IData' dont le conteneur repose sur un 'NumArray'.
void setShape(const ArrayShape &new_shape) override
Positionne la forme du tableau.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
NumArray< DataType, ExtentType > m_value
Donnée.
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
IData * clone() override
Clone la donnée. L'instance créée doit être détruite par l'opérateur 'delete'.
void visitArray(IArrayDataVisitor *) override
Applique le visiteur à la donnée.
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
IDataInternal * _commonInternal() override
Ref< IData > cloneRef() override
Clone la donnée.
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
MDSpan< DataType, ExtentType > view() override
Vue sur la donnée.
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
eDataType dataType() const override
Type de la donnée.
MDSpan< const DataType, ExtentType > view() const override
Vue constante sur la donnée.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
void resize(Integer new_size) override
Redimensionne la donnée.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void setName(const String &name) override
Positionne le nom de la donnée (interne)
void visitArray2(IArray2DataVisitor *) override
Applique le visiteur à la donnée.
void visitScalar(IScalarDataVisitor *) override
Applique le visiteur à la donnée.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ ElementType * data()
Pointeur sur la mémoire allouée.
Vue pour un tableau 2D dont la taille est un 'Int64'.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
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).
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- 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.
@ Int32
Donnée de type entier 32 bits.
@ Int64
Donnée de type entier 64 bits.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 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.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
eDataType
Type d'une donnée.
std::int32_t Int32
Type entier signé sur 32 bits.