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 : bad sizes 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 : bad sizes 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: bad magic number for serialisation expected={0} current={1}",
351 SERIALIZE_MAGIC_NUMBER, saved_magic_number);
353 if (saved_nb_value != nb_value)
354 ARCANE_FATAL(
"Internal errror: bad size for serialisation expected={0} found={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 : Cannot deserialize with ReadAdd mode");
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 for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Memory and allocator management functions.
Memory allocator with specific memory alignment.
Exception when an argument is invalid.
eDataType dataType() const override
Data type.
ArrayShape shape() const override
Array shape for a 1D or 2D data item.
UniqueArray< DataType > m_value
Data.
void add(ConstReferenceType val)
Adds element val to the end of the array.
const T * data() const
Access to the root of the array without any protection.
Information on data allocation.
Information for calculating data hash.
Type information for a data container.
Interface of an operation on a data.
Interface of a data item.
virtual void updateHash(Span< const std::byte > input)=0
Adds the array input to the calculated hash.
Interface of a hashing algorithm.
virtual void computeHash64(Span< const Byte > input, ByteArray &output)
Calculates the hash value for the array input.
Interface of a serialized data.
virtual eDataType baseDataType() const =0
Data type.
virtual ArrayShape shape() const =0
Shape of the array associated with the data.
virtual Int64 memorySize() const =0
Indicates the number of bytes that must be allocated to store or read the data.
virtual void setWritableBytes(Span< Byte > bytes)=0
Positions the serialized values.
virtual Int64 nbElement() const =0
Number of elements.
void reserveInt64(Int64 n)
Reserve for n Int64.
@ ModePut
The serializer expects reserve().
@ ModeGet
The serializer expects get().
virtual Int64 getInt64()=0
Retrieve a size.
virtual eReadMode readMode() const =0
Read mode.
virtual void putSpan(Span< const Real > values)
Add the array values.
virtual eMode mode() const =0
Current operating mode.
@ ReadReplace
Replace current elements with those read.
@ ReadAdd
Add those read to the current elements.
virtual void getSpan(Span< Real > values)
Retrieve the array values.
virtual void reserveSpan(eBasicDataType dt, Int64 n)=0
Reserves memory for n values of dt.
virtual void putInt64(Int64 value)=0
Add the integer value.
Options to configure allocations.
Exception when a function is not implemented.
Reference to an instance.
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
View of an array of elements of type T.
Unicode character string.
1D data vector with value semantics (STL style).
-- 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)
Creates serialized data.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
Array< Byte > ByteArray
Dynamic one-dimensional array of characters.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
eBasicDataType
Type of a basic data item.
bool arcaneIsDebug()
True if the ARCANE_DEBUG macro is defined.
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converts the view into an array of non-modifiable bytes.
unsigned char Byte
Type of a byte.
void sampleSpan(Span< const DataType > values, Span< const Int64 > indexes, Span< DataType > result)
Extracts a sub-array from a list of indices.