Arcane  v4.1.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
NumArrayContainer.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* NumArrayContainer.h (C) 2000-2025 */
9/* */
10/* Conteneur pour la classe 'NumArray'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_NUMARRAYCONTAINER_H
13#define ARCANE_UTILS_NUMARRAYCONTAINER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane::impl
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
31class ARCANE_UTILS_EXPORT NumArrayBaseCommon
32{
33 protected:
34
35 static MemoryAllocationOptions _getDefaultAllocator();
36 static MemoryAllocationOptions _getDefaultAllocator(eMemoryRessource r);
37 static void _checkHost(eMemoryRessource r);
38 static void _memoryAwareCopy(Span<const std::byte> from, eMemoryRessource from_mem,
39 Span<std::byte> to, eMemoryRessource to_mem, const RunQueue* queue);
40 static void _memoryAwareFill(Span<std::byte> to, Int64 nb_element, const void* fill_address,
41 Int32 datatype_size, SmallSpan<const Int32> indexes, const RunQueue* queue);
42 static void _memoryAwareFill(Span<std::byte> to, Int64 nb_element, const void* fill_address,
43 Int32 datatype_size, const RunQueue* queue);
44};
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
54template <typename DataType>
55class NumArrayContainer
56: private Arccore::Array<DataType>
57, private NumArrayBaseCommon
58{
59 private:
60
61 using BaseClass = Arccore::Array<DataType>;
62 using ThatClass = NumArrayContainer<DataType>;
63 static constexpr Int32 _typeSize() { return static_cast<Int32>(sizeof(DataType)); }
64
65 public:
66
69 using BaseClass::fill;
71
72 private:
73
74 explicit NumArrayContainer(const MemoryAllocationOptions& a)
75 : BaseClass()
76 {
77 this->_initFromAllocator(a, 0);
78 }
79
80 public:
81
82 explicit NumArrayContainer()
83 : NumArrayContainer(_getDefaultAllocator())
84 {
85 }
86
87 explicit NumArrayContainer(eMemoryRessource r)
88 : NumArrayContainer(_getDefaultAllocator(r))
89 {
90 m_memory_ressource = r;
91 }
92
93 NumArrayContainer(const ThatClass& rhs)
94 : NumArrayContainer(rhs.allocationOptions())
95 {
96 m_memory_ressource = rhs.m_memory_ressource;
97 _resizeAndCopy(rhs);
98 }
99
100 NumArrayContainer(ThatClass&& rhs)
101 : BaseClass(std::move(rhs))
102 , m_memory_ressource(rhs.m_memory_ressource)
103 {
104 }
105
106 // Cet opérateur est interdit car il faut gérer le potentiel
107 // changement de l'allocateur et la recopie
108 ThatClass& operator=(const ThatClass& rhs) = delete;
109
110 ThatClass& operator=(ThatClass&& rhs)
111 {
112 this->_move(rhs);
113 m_memory_ressource = rhs.m_memory_ressource;
114 return (*this);
115 }
116
117 public:
118
119 void resize(Int64 new_size) { BaseClass::_resizeNoInit(new_size); }
120 Span<DataType> to1DSpan() { return BaseClass::span(); }
121 Span<const DataType> to1DSpan() const { return BaseClass::constSpan(); }
122 Span<std::byte> bytes() { return asWritableBytes(BaseClass::span()); }
123 Span<const std::byte> bytes() const { return asBytes(BaseClass::constSpan()); }
124 void swap(NumArrayContainer<DataType>& rhs)
125 {
126 BaseClass::_swap(rhs);
127 std::swap(m_memory_ressource, rhs.m_memory_ressource);
128 }
129 void copy(Span<const DataType> rhs) { BaseClass::_copy(rhs.data()); }
130 IMemoryAllocator* allocator() const { return BaseClass::allocator(); }
131 eMemoryRessource memoryRessource() const { return m_memory_ressource; }
132 void copyInitializerList(std::initializer_list<DataType> alist)
133 {
134 Span<DataType> s = to1DSpan();
135 Int64 s1 = s.size();
136 Int32 index = 0;
137 for (auto x : alist) {
138 s[index] = x;
139 ++index;
140 // S'assure qu'on ne déborde pas
141 if (index >= s1)
142 break;
143 }
144 }
145
151 void copyOnly(const Span<const DataType>& v, eMemoryRessource input_ressource, const RunQueue* queue = nullptr)
152 {
153 _memoryAwareCopy(v, input_ressource, queue);
154 }
155
158 void fill(const DataType& v, SmallSpan<const Int32> indexes, const RunQueue* queue)
159 {
160 Span<DataType> destination = to1DSpan();
161 NumArrayBaseCommon::_memoryAwareFill(asWritableBytes(destination), destination.size(), &v, _typeSize(), indexes, queue);
162 }
163
166 void fill(const DataType& v, const RunQueue* queue)
167 {
168 Span<DataType> destination = to1DSpan();
169 NumArrayBaseCommon::_memoryAwareFill(asWritableBytes(destination), destination.size(), &v, _typeSize(), queue);
170 }
171
172 private:
173
174 void _memoryAwareCopy(const Span<const DataType>& v, eMemoryRessource input_ressource, const RunQueue* queue)
175 {
176 NumArrayBaseCommon::_memoryAwareCopy(asBytes(v), input_ressource,
177 asWritableBytes(to1DSpan()), m_memory_ressource, queue);
178 }
179 void _resizeAndCopy(const ThatClass& v)
180 {
181 this->_resizeNoInit(v.to1DSpan().size());
182 _memoryAwareCopy(v, v.memoryRessource(), nullptr);
183 }
184
185 private:
186
187 eMemoryRessource m_memory_ressource = eMemoryRessource::UnifiedMemory;
188};
189
190} // namespace Arcane::impl
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
195#endif
String debugName() const
Nom de debug (nul si aucun nom spécifié)
void setDebugName(const String &name)
Positionne le nom du tableau pour les informations de debug.
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
void _move(ThatClassType &rhs) ARCCORE_NOEXCEPT
Implémente l'opérateur d'assignement par déplacement.
void _initFromAllocator(MemoryAllocationOptions o, Int64 acapacity, void *pre_allocated_buffer=nullptr)
Construit un vecteur vide avec un allocateur spécifique a.
void _resizeNoInit(Int64 s, RunQueue *queue=nullptr)
Redimensionne sans initialiser les nouvelles valeurs.
void _swap(ThatClassType &rhs) ARCCORE_NOEXCEPT
Échange les valeurs de l'instance avec celles de rhs.
File d'exécution pour un accélérateur.
Tableau d'items de types quelconques.
void fill(const DataType &data)
Remplissage du tableau.
Span< const T > span() const
Vue immutable sur ce tableau.
Span< const T > constSpan() const
Vue constante sur ce tableau.
Interface d'un allocateur pour la mémoire.
Vue d'un tableau d'éléments de type T.
Definition Span.h:774
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:516
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:304
Vue d'un tableau d'éléments de type T.
Definition Span.h:612
Implémentation commune à pour NumArray.
void fill(const DataType &v, const RunQueue *queue)
Remplit les éléments de l'instance la valeur v.
void copyOnly(const Span< const DataType > &v, eMemoryRessource input_ressource, const RunQueue *queue=nullptr)
Copie les valeurs de v dans l'instance.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, const RunQueue *queue)
Remplit les indices données par indexes avec la valeur v.
std::int64_t Int64
Type entier signé sur 64 bits.
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
Impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
Definition Span.h:989
Impl::SpanTypeFromSize< std::byte, SizeType >::SpanType asWritableBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets modifiables.
Definition Span.h:1024
std::int32_t Int32
Type entier signé sur 32 bits.