Arcane  v3.16.0.0
Documentation utilisateur
Tout Classes Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Amis Macros Groupes Pages Concepts
NumArrayContainer.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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-2024 */
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#include "arcane/utils/MemoryRessource.h"
19#include "arcane/utils/ArcaneCxx20.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane::impl
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \internal
31 * \brief Implémentation commune à pour NumArray.
32 */
33class ARCANE_UTILS_EXPORT NumArrayBaseCommon
34{
35 protected:
36
37 static MemoryAllocationOptions _getDefaultAllocator();
38 static MemoryAllocationOptions _getDefaultAllocator(eMemoryRessource r);
39 static void _checkHost(eMemoryRessource r);
40 static void _memoryAwareCopy(Span<const std::byte> from, eMemoryRessource from_mem,
41 Span<std::byte> to, eMemoryRessource to_mem, const RunQueue* queue);
42 static void _memoryAwareFill(Span<std::byte> to, Int64 nb_element, const void* fill_address,
43 Int32 datatype_size, SmallSpan<const Int32> indexes, const RunQueue* queue);
44 static void _memoryAwareFill(Span<std::byte> to, Int64 nb_element, const void* fill_address,
45 Int32 datatype_size, const RunQueue* queue);
46};
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50/*!
51 * \internal
52 * \brief Container pour la classe NumArray.
53 *
54 * Wrapper de Arccore::Array pour la classe NumArray.
55 */
56template <typename DataType>
57class NumArrayContainer
58: private Arccore::Array<DataType>
59, private NumArrayBaseCommon
60{
61 private:
62
63 using BaseClass = Arccore::Array<DataType>;
64 using ThatClass = NumArrayContainer<DataType>;
65 static constexpr Int32 _typeSize() { return static_cast<Int32>(sizeof(DataType)); }
66
67 public:
68
71 using BaseClass::fill;
73
74 private:
75
76 explicit NumArrayContainer(const MemoryAllocationOptions& a)
77 : BaseClass()
78 {
79 this->_initFromAllocator(a, 0);
80 }
81
82 public:
83
84 explicit NumArrayContainer()
85 : NumArrayContainer(_getDefaultAllocator())
86 {
87 }
88
89 explicit NumArrayContainer(eMemoryRessource r)
90 : NumArrayContainer(_getDefaultAllocator(r))
91 {
92 m_memory_ressource = r;
93 }
94
95 NumArrayContainer(const ThatClass& rhs)
96 : NumArrayContainer(rhs.allocationOptions())
97 {
98 m_memory_ressource = rhs.m_memory_ressource;
99 _resizeAndCopy(rhs);
100 }
101
102 NumArrayContainer(ThatClass&& rhs)
103 : BaseClass(std::move(rhs))
104 , m_memory_ressource(rhs.m_memory_ressource)
105 {
106 }
107
108 // Cet opérateur est interdit car il faut gérer le potentiel
109 // changement de l'allocateur et la recopie
110 ThatClass& operator=(const ThatClass& rhs) = delete;
111
112 ThatClass& operator=(ThatClass&& rhs)
113 {
114 this->_move(rhs);
115 m_memory_ressource = rhs.m_memory_ressource;
116 return (*this);
117 }
118
119 public:
120
121 void resize(Int64 new_size) { BaseClass::_resizeNoInit(new_size); }
122 Span<DataType> to1DSpan() { return BaseClass::span(); }
123 Span<const DataType> to1DSpan() const { return BaseClass::constSpan(); }
124 Span<std::byte> bytes() { return asWritableBytes(BaseClass::span()); }
125 Span<const std::byte> bytes() const { return asBytes(BaseClass::constSpan()); }
126 void swap(NumArrayContainer<DataType>& rhs)
127 {
128 BaseClass::_swap(rhs);
129 std::swap(m_memory_ressource, rhs.m_memory_ressource);
130 }
131 void copy(Span<const DataType> rhs) { BaseClass::_copy(rhs.data()); }
132 IMemoryAllocator* allocator() const { return BaseClass::allocator(); }
133 eMemoryRessource memoryRessource() const { return m_memory_ressource; }
134 void copyInitializerList(std::initializer_list<DataType> alist)
135 {
136 Span<DataType> s = to1DSpan();
137 Int64 s1 = s.size();
138 Int32 index = 0;
139 for (auto x : alist) {
140 s[index] = x;
141 ++index;
142 // S'assure qu'on ne déborde pas
143 if (index >= s1)
144 break;
145 }
146 }
147
148 /*!
149 * \brief Copie les valeurs de \a v dans l'instance.
150 *
151 * \a input_ressource indique l'origine de la zone mémoire (ou eMemoryRessource::Unknown si inconnu)
152 */
153 void copyOnly(const Span<const DataType>& v, eMemoryRessource input_ressource, const RunQueue* queue = nullptr)
154 {
155 _memoryAwareCopy(v, input_ressource, queue);
156 }
157 /*!
158 * \brief Remplit les indices données par \a indexes avec la valeur \a v.
159 */
160 void fill(const DataType& v, SmallSpan<const Int32> indexes, const RunQueue* queue)
161 {
162 Span<DataType> destination = to1DSpan();
163 NumArrayBaseCommon::_memoryAwareFill(asWritableBytes(destination), destination.size(), &v, _typeSize(), indexes, queue);
164 }
165 /*!
166 * \brief Remplit les éléments de l'instance la valeur \a v.
167 */
168 void fill(const DataType& v, const RunQueue* queue)
169 {
170 Span<DataType> destination = to1DSpan();
171 NumArrayBaseCommon::_memoryAwareFill(asWritableBytes(destination), destination.size(), &v, _typeSize(), queue);
172 }
173
174 private:
175
176 void _memoryAwareCopy(const Span<const DataType>& v, eMemoryRessource input_ressource, const RunQueue* queue)
177 {
178 NumArrayBaseCommon::_memoryAwareCopy(asBytes(v), input_ressource,
179 asWritableBytes(to1DSpan()), m_memory_ressource, queue);
180 }
181 void _resizeAndCopy(const ThatClass& v)
182 {
183 this->_resizeNoInit(v.to1DSpan().size());
184 _memoryAwareCopy(v, v.memoryRessource(), nullptr);
185 }
186
187 private:
188
189 eMemoryRessource m_memory_ressource = eMemoryRessource::UnifiedMemory;
190};
191
192} // namespace Arcane::impl
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197#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(IMemoryAllocator *a, Int64 acapacity)
Construit un tableau 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.
Classe de base des vecteurs 1D de données.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
Span< const T > span() const
Vue immutable sur ce tableau.
Span< const T > constSpan() const
Vue constante sur ce tableau.
Options pour configurer les allocations.
Vue d'un tableau d'éléments de type T.
Definition Span.h:673
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:212
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:422
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
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.
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:919
std::int64_t Int64
Type entier signé sur 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.
Definition Span.h:884
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
std::int32_t Int32
Type entier signé sur 32 bits.