Skip to content

Commit d955dc4

Browse files
[arcane,utils] Ajoute support accélérateur pour 'MultiArray2'.
Ajoute support pour choisir l'allocateur mémoire et créé une classe 'MultiArray2SmallSpan' pour obtenir une vue sur l'instance.
1 parent 5e45715 commit d955dc4

File tree

3 files changed

+106
-13
lines changed

3 files changed

+106
-13
lines changed

arcane/src/arcane/utils/MultiArray2.h

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class MultiArray2
6767
public:
6868

6969
MultiArray2() = default;
70+
// TODO: Rendre accessible uniquement à UniqueMultiArray2 ou SharedMultiArray2
7071
explicit MultiArray2(ConstArrayView<Int32> sizes)
7172
{
7273
_resize(sizes);
@@ -96,6 +97,17 @@ class MultiArray2
9697
, m_sizes(aview.m_sizes)
9798
{
9899
}
100+
explicit MultiArray2(const MemoryAllocationOptions& allocation_options)
101+
: m_buffer(allocation_options)
102+
, m_indexes(allocation_options)
103+
, m_sizes(allocation_options)
104+
{}
105+
// TODO: Rendre accessible uniquement à UniqueMultiArray2 ou SharedMultiArray2
106+
MultiArray2(const MemoryAllocationOptions& allocation_options, ConstArrayView<Int32> sizes)
107+
: MultiArray2(allocation_options)
108+
{
109+
_resize(sizes);
110+
}
99111

100112
public:
101113

@@ -111,23 +123,15 @@ class MultiArray2
111123
public:
112124

113125
//! Nombre total d'éléments
114-
Integer totalNbElement() const { return m_buffer.size(); }
126+
Int32 totalNbElement() const { return m_buffer.size(); }
127+
115128
//! Supprime les éléments du tableau.
116129
void clear()
117130
{
118131
m_buffer.clear();
119132
m_indexes.clear();
120133
m_sizes.clear();
121134
}
122-
//! Clone le tableau
123-
MultiArray2<DataType> clone()
124-
{
125-
MultiArray2<DataType> new_array;
126-
new_array.m_buffer = m_buffer.clone();
127-
new_array.m_indexes = m_indexes.clone();
128-
new_array.m_sizes = m_sizes.clone();
129-
return new_array;
130-
}
131135
//! Remplit les éléments du tableau avec la valeur \a v
132136
void fill(const DataType& v)
133137
{
@@ -137,7 +141,7 @@ class MultiArray2
137141
{
138142
return m_buffer[m_indexes[i] + j];
139143
}
140-
const DataType& at(Integer i, Integer j) const
144+
ConstReferenceType at(Integer i, Integer j) const
141145
{
142146
return m_buffer[m_indexes[i] + j];
143147
}
@@ -178,6 +182,24 @@ class MultiArray2
178182
return ConstMultiArray2View<DataType>(m_buffer, m_indexes, m_sizes);
179183
}
180184

185+
//! Vue modifiable du tableau
186+
MultiArray2SmallSpan<DataType> span()
187+
{
188+
return { m_buffer.smallSpan(), m_indexes, m_sizes };
189+
}
190+
191+
//! Vue constante du tableau
192+
MultiArray2SmallSpan<const DataType> span() const
193+
{
194+
return { m_buffer, m_indexes, m_sizes };
195+
}
196+
197+
//! Vue constante du tableau
198+
MultiArray2SmallSpan<const DataType> constSpan() const
199+
{
200+
return { m_buffer.constSmallSpan(), m_indexes, m_sizes };
201+
}
202+
181203
//! Vue du tableau sous forme de tableau 1D
182204
ArrayView<DataType> viewAsArray()
183205
{
@@ -233,7 +255,7 @@ class MultiArray2
233255

234256
Integer old_size1 = m_indexes.size();
235257

236-
SharedArray<DataType> new_buffer(total_size);
258+
SharedArray<DataType> new_buffer(m_buffer.allocationOptions(), total_size);
237259

238260
// Recopie dans le nouveau tableau les valeurs de l'ancien.
239261
if (old_size1 > size1)
@@ -278,7 +300,7 @@ class MultiArray2
278300

279301
private:
280302

281-
//! Valeurs
303+
//! Tableau des Valeurs
282304
SharedArray<DataType> m_buffer;
283305
//! Tableau des indices dans \a m_buffer du premièr élément de la deuxième dimension
284306
SharedArray<Int32> m_indexes;
@@ -361,6 +383,16 @@ class UniqueMultiArray2
361383
explicit UniqueMultiArray2(ConstArrayView<Int32> sizes)
362384
: MultiArray2<DataType>(sizes)
363385
{}
386+
explicit UniqueMultiArray2(IMemoryAllocator* allocator)
387+
: UniqueMultiArray2(MemoryAllocationOptions(allocator))
388+
{}
389+
explicit UniqueMultiArray2(const MemoryAllocationOptions& allocation_options)
390+
: MultiArray2<DataType>(allocation_options)
391+
{}
392+
UniqueMultiArray2(const MemoryAllocationOptions& allocation_options,
393+
ConstArrayView<Int32> sizes)
394+
: MultiArray2<DataType>(allocation_options, sizes)
395+
{}
364396
UniqueMultiArray2(ConstMultiArray2View<DataType> view)
365397
: MultiArray2<DataType>(view)
366398
{}

arcane/src/arcane/utils/MultiArray2View.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include "arcane/utils/UtilsTypes.h"
1818
#include "arcane/utils/ArrayView.h"
1919

20+
#include <type_traits>
21+
2022
/*---------------------------------------------------------------------------*/
2123
/*---------------------------------------------------------------------------*/
2224

@@ -129,6 +131,60 @@ class ConstMultiArray2View
129131
ConstArrayView<Int32> m_sizes;
130132
};
131133

134+
/*---------------------------------------------------------------------------*/
135+
/*---------------------------------------------------------------------------*/
136+
/*!
137+
* \brief Vue sur un MultiArray2.
138+
*
139+
* Les instances de cette classe sont créées par appel à MultiArray2::span()
140+
* ou MultiArray2::constSpan().
141+
*/
142+
template <class DataType>
143+
class MultiArray2SmallSpan
144+
{
145+
private:
146+
147+
friend class MultiArray2<std::remove_cv_t<DataType>>;
148+
149+
public:
150+
151+
//! Vue vide
152+
MultiArray2SmallSpan() = default;
153+
154+
private:
155+
156+
//! Vue sur la tableau \a buf
157+
MultiArray2SmallSpan(SmallSpan<DataType> buf, SmallSpan<const Int32> indexes,
158+
SmallSpan<const Int32> sizes)
159+
: m_buffer(buf)
160+
, m_indexes(indexes)
161+
, m_sizes(sizes)
162+
{}
163+
164+
public:
165+
166+
//! Nombre d'éléments de la première dimension.
167+
constexpr ARCCORE_HOST_DEVICE Int32 dim1Size() const { return m_sizes.size(); }
168+
//! Nombre d'éléments de la deuxième dimension
169+
constexpr ARCCORE_HOST_DEVICE SmallSpan<const Int32> dim2Sizes() const { return m_sizes; }
170+
//! Nombre total d'éléments dans le tableau.
171+
constexpr ARCCORE_HOST_DEVICE Int32 totalNbElement() const { return m_buffer.size(); }
172+
173+
public:
174+
175+
//! \a i-ème élément du tableau
176+
constexpr ARCCORE_HOST_DEVICE SmallSpan<DataType> operator[](Int32 i) const
177+
{
178+
return m_buffer.subSpan(m_indexes[i], m_sizes[i]);
179+
}
180+
181+
private:
182+
183+
SmallSpan<DataType> m_buffer;
184+
SmallSpan<const Int32> m_indexes;
185+
SmallSpan<const Int32> m_sizes;
186+
};
187+
132188
/*---------------------------------------------------------------------------*/
133189
/*---------------------------------------------------------------------------*/
134190

arcane/src/arcane/utils/tests/TestCollections.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "arcane/utils/String.h"
1212
#include "arcane/utils/SmallArray.h"
1313
#include "arcane/utils/FixedArray.h"
14+
#include "arcane/utils/MultiArray2.h"
1415

1516
#ifdef ARCANE_HAS_CXX20
1617
#include <ranges>
@@ -285,6 +286,10 @@ template class CollectionImplT<String>;
285286
template class SmallArray<Int32>;
286287
template class FixedArray<Int32,3>;
287288
template class FixedArray<double, 21>;
289+
290+
template class MultiArray2<Int32>;
291+
template class UniqueMultiArray2<Int32>;
292+
template class SharedMultiArray2<Int32>;
288293
}
289294

290295
/*---------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)