Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
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, 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, RunQueue* queue);
44 static void _memoryAwareFill(Span<std::byte> to, Int64 nb_element, const void* fill_address,
45 Int32 datatype_size, 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>
58: private Arccore::Array<DataType>
59, private NumArrayBaseCommon
60{
61 private:
62
65 static constexpr Int32 _typeSize() { return static_cast<Int32>(sizeof(DataType)); }
66
67 public:
68
71 using BaseClass::fill;
73
74 private:
75
77 : BaseClass()
78 {
79 this->_initFromAllocator(a, 0);
80 }
81
82 public:
83
84 explicit NumArrayContainer()
85 : NumArrayContainer(_getDefaultAllocator())
86 {
87 }
88
90 : NumArrayContainer(_getDefaultAllocator(r))
91 {
92 m_memory_ressource = r;
93 }
94
96 : NumArrayContainer(rhs.allocationOptions())
97 {
98 m_memory_ressource = rhs.m_memory_ressource;
99 _resizeAndCopy(rhs);
100 }
101
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, 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, 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, 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, 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
190};
191
192} // namespace Arcane::impl
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197#endif
File d'exécution pour un accélérateur.
void fill(const DataType &v, RunQueue *queue)
Remplit les éléments de l'instance la valeur v.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, RunQueue *queue)
Remplit les indices données par indexes avec la valeur v.
void copyOnly(const Span< const DataType > &v, eMemoryRessource input_ressource, RunQueue *queue=nullptr)
Copie les valeurs de v dans l'instance.
void setDebugName(const String &name)
Positionne le nom du tableau pour les informations de debug.
String debugName() const
Nom de debug (nul si aucun nom spécifié)
void _move(ThatClassType &rhs) ARCCORE_NOEXCEPT
Implémente l'opérateur d'assignement par déplacement.
void _resizeNoInit(Int64 s, RunQueue *queue=nullptr)
Redimensionne sans initialiser les nouvelles valeurs.
void _initFromAllocator(IMemoryAllocator *a, Int64 acapacity)
Construit un tableau avec un allocateur spécifique a.
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
void _swap(ThatClassType &rhs) ARCCORE_NOEXCEPT
Échange les valeurs de l'instance avec celles de rhs.
Classe de base des vecteurs 1D de données.
Span< const DataType > span() const
Vue immutable sur ce tableau.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
Span< const DataType > 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:670
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
eMemoryRessource
Liste des ressources mémoire disponibles.
@ UnifiedMemory
Alloue en utilisant la mémoire unifiée.