Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MDSpan.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/* MDSpan.h (C) 2000-2024 */
9/* */
10/* Vue sur un tableaux multi-dimensionnel pour les types numériques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_MDSPAN_H
13#define ARCANE_UTILS_MDSPAN_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArrayExtents.h"
18#include "arcane/utils/ArrayBounds.h"
19#include "arcane/utils/NumericTraits.h"
20#include "arcane/utils/ArrayLayout.h"
21#include "arcane/utils/ArcaneCxx20.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Classe de base des vues multi-dimensionnelles.
33 *
34 * Cette classe s'inspire la classe std::mdspan en cours de définition
35 * (voir http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0009r12.html)
36 *
37 * Cette classe est utilisée pour gérer les vues sur les tableaux tels que
38 * NumArray. Les méthodes de cette classe sont accessibles sur accélérateur.
39 *
40 * Pour plus d'informations, se reporter à la page \ref arcanedoc_core_types_numarray.
41 */
42template <typename DataType, typename Extents, typename LayoutPolicy>
43class MDSpan
44{
45 using UnqualifiedValueType = std::remove_cv_t<DataType>;
46 friend class NumArray<UnqualifiedValueType, Extents, LayoutPolicy>;
47 // Pour que MDSpan<const T> ait accès à MDSpan<T>
48 friend class MDSpan<const UnqualifiedValueType, Extents, LayoutPolicy>;
49
50 public:
51
52 using value_type = DataType;
53 using ExtentsType = Extents;
54 using LayoutPolicyType = LayoutPolicy;
55 using MDIndexType = typename Extents::MDIndexType;
56 using ArrayExtentsWithOffsetType = ArrayExtentsWithOffset<Extents, LayoutPolicy>;
57 using DynamicDimsType = typename Extents::DynamicDimsType;
58 using RemovedFirstExtentsType = typename Extents::RemovedFirstExtentsType;
59
60 // Pour compatibilité. A supprimer pour cohérence avec les autres 'using'
61 using ArrayBoundsIndexType = typename Extents::MDIndexType;
62 using IndexType = typename Extents::MDIndexType;
63
64 public:
65
66 MDSpan() = default;
67 constexpr ARCCORE_HOST_DEVICE MDSpan(DataType* ptr, ArrayExtentsWithOffsetType extents)
68 : m_ptr(ptr)
69 , m_extents(extents)
70 {
71 }
72 constexpr ARCCORE_HOST_DEVICE MDSpan(DataType* ptr, const DynamicDimsType& dims)
73 : m_ptr(ptr)
74 , m_extents(dims)
75 {}
76 // Constructeur MDSpan<const T> à partir d'un MDSpan<T>
77 template <typename X, typename = std::enable_if_t<std::is_same_v<X, UnqualifiedValueType>>>
78 constexpr ARCCORE_HOST_DEVICE MDSpan(const MDSpan<X, Extents>& rhs)
79 : m_ptr(rhs.m_ptr)
80 , m_extents(rhs.m_extents)
81 {}
82
83 public:
84
85 constexpr ARCCORE_HOST_DEVICE DataType* _internalData() { return m_ptr; }
86 constexpr ARCCORE_HOST_DEVICE const DataType* _internalData() const { return m_ptr; }
87
88 public:
89
90 ArrayExtents<Extents> extents() const
91 {
92 return m_extents.extents();
93 }
94 ArrayExtentsWithOffsetType extentsWithOffset() const
95 {
96 return m_extents;
97 }
98
99 public:
100
101 //! Valeur de la première dimension
102 constexpr ARCCORE_HOST_DEVICE Int32 extent0() const requires(Extents::rank() >= 1) { return m_extents.extent0(); }
103 //! Valeur de la deuxième dimension
104 constexpr ARCCORE_HOST_DEVICE Int32 extent1() const requires(Extents::rank() >= 2) { return m_extents.extent1(); }
105 //! Valeur de la troisième dimension
106 constexpr ARCCORE_HOST_DEVICE Int32 extent2() const requires(Extents::rank() >= 3) { return m_extents.extent2(); }
107 //! Valeur de la quatrième dimension
108 constexpr ARCCORE_HOST_DEVICE Int32 extent3() const requires(Extents::rank() >= 4) { return m_extents.extent3(); }
109
110 public:
111 public:
112
113 //! Valeur pour l'élément \a i,j,k,l
114 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
115 {
116 return m_extents.offset(i, j, k, l);
117 }
118 //! Valeur pour l'élément \a i,j,k
119 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
120 {
121 return m_extents.offset(i, j, k);
122 }
123 //! Valeur pour l'élément \a i,j
124 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j) const requires(Extents::rank() == 2)
125 {
126 return m_extents.offset(i, j);
127 }
128 //! Valeur pour l'élément \a i
129 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i) const requires(Extents::rank() == 1) { return m_extents.offset(i); }
130
131 //! Valeur pour l'élément \a idx
132 constexpr ARCCORE_HOST_DEVICE Int64 offset(MDIndexType idx) const
133 {
134 return m_extents.offset(idx);
135 }
136
137 public:
138
139 //! Valeur pour l'élément \a i,j,k,l
140 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
141 {
142 return m_ptr[offset(i, j, k, l)];
143 }
144 //! Valeur pour l'élément \a i,j,k
145 ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
146 {
147 return m_ptr[offset(i, j, k)];
148 }
149 //! Valeur pour l'élément \a i,j
150 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j) const requires(Extents::rank() == 2)
151 {
152 return m_ptr[offset(i, j)];
153 }
154 //! Valeur pour l'élément \a i
155 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i) const requires(Extents::rank() == 1) { return m_ptr[offset(i)]; }
156 //! Valeur pour l'élément \a i
157 constexpr ARCCORE_HOST_DEVICE DataType operator[](Int32 i) const requires(Extents::rank() == 1) { return m_ptr[offset(i)]; }
158
159 //! Valeur pour l'élément \a idx
160 constexpr ARCCORE_HOST_DEVICE DataType& operator()(MDIndexType idx) const
161 {
162 return m_ptr[offset(idx)];
163 }
164
165 public:
166
167 //! Pointeur sur la valeur pour l'élément \a i,j,k
168 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
169 {
170 return m_ptr + offset(i, j, k, l);
171 }
172 //! Pointeur sur la valeur pour l'élément \a i,j,k
173 ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
174 {
175 return m_ptr + offset(i, j, k);
176 }
177 //! Pointeur sur la valeur pour l'élément \a i,j
178 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j) const requires(Extents::rank() == 2)
179 {
180 return m_ptr + offset(i, j);
181 }
182 //! Pointeur sur la valeur pour l'élément \a i
183 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i) const requires(Extents::rank() == 1) { return m_ptr + offset(i); }
184
185 //! Pointeur sur la valeur pour l'élément \a i
186 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(MDIndexType idx) const
187 {
188 return m_ptr + offset(idx);
189 }
190
191 public:
192
193 /*!
194 * \brief Retourne une vue de dimension (N-1) à partir de l'élément d'indice \a i.
195 *
196 * Par exemple:
197 * \code
198 * MDSpan<Real, MDDim3> span3 = ...;
199 * MDSpan<Real, MDDim2> sliced_span = span3.slice(5);
200 * // sliced_span(i,i) <=> span3(5,i,j);
201 * \endcode
202 *
203 * \warning Cela n'est valide que si \a LayoutPolicy est \a RightLayout.
204 */
206 slice(Int32 i) const requires(Extents::rank() >= 2 && std::is_base_of_v<RightLayout, LayoutPolicy>)
207 {
208 auto new_extents = m_extents.extents().removeFirstExtent().dynamicExtents();
209 std::array<Int32, ExtentsType::rank()> indexes = {};
210 indexes[0] = i;
211 DataType* base_ptr = this->ptrAt(MDIndexType(indexes));
213 }
214
215 public:
216
217 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constSpan() const
218 {
219 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
220 }
221
222 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constMDSpan() const
223 {
224 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
225 }
226
227 constexpr ARCCORE_HOST_DEVICE Span<DataType> to1DSpan() const
228 {
229 return { m_ptr, m_extents.totalNbElement() };
230 }
231
232 constexpr SmallSpan<DataType> to1DSmallSpan() requires(Extents::rank() == 1)
233 {
234 return { _internalData(), extent0() };
235 }
236 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1)
237 {
238 return to1DConstSmallSpan();
239 }
240 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1)
241 {
242 return { _internalData(), extent0() };
243 }
244
245 private:
246
247 DataType* m_ptr = nullptr;
248 ArrayExtentsWithOffsetType m_extents;
249};
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // End namespace Arcane
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259#endif
Classe de base des vues multi-dimensionnelles.
Definition MDSpan.h:44
__host__ __device__ MDSpan< DataType, RemovedFirstExtentsType, LayoutPolicy > slice(Int32 i) const
Retourne une vue de dimension (N-1) à partir de l'élément d'indice i.
Definition MDSpan.h:206
constexpr __host__ __device__ DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
Definition MDSpan.h:140
constexpr __host__ __device__ Int32 extent3() const
Valeur de la quatrième dimension.
Definition MDSpan.h:108
constexpr __host__ __device__ DataType * ptrAt(Int32 i, Int32 j) const
Pointeur sur la valeur pour l'élément i,j.
Definition MDSpan.h:178
constexpr __host__ __device__ Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
Definition MDSpan.h:114
constexpr __host__ __device__ Int64 offset(Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:129
constexpr __host__ __device__ Int64 offset(MDIndexType idx) const
Valeur pour l'élément idx.
Definition MDSpan.h:132
constexpr __host__ __device__ DataType * ptrAt(Int32 i, Int32 j, Int32 k, Int32 l) const
Pointeur sur la valeur pour l'élément i,j,k.
Definition MDSpan.h:168
constexpr __host__ __device__ Int64 offset(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
Definition MDSpan.h:119
constexpr __host__ __device__ DataType operator[](Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:157
constexpr __host__ __device__ DataType & operator()(Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:155
constexpr __host__ __device__ Int32 extent2() const
Valeur de la troisième dimension.
Definition MDSpan.h:106
__host__ __device__ DataType * ptrAt(Int32 i, Int32 j, Int32 k) const
Pointeur sur la valeur pour l'élément i,j,k.
Definition MDSpan.h:173
constexpr __host__ __device__ Int32 extent1() const
Valeur de la deuxième dimension.
Definition MDSpan.h:104
__host__ __device__ DataType & operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
Definition MDSpan.h:145
constexpr __host__ __device__ DataType & operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
Definition MDSpan.h:150
constexpr __host__ __device__ Int64 offset(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
Definition MDSpan.h:124
constexpr __host__ __device__ DataType & operator()(MDIndexType idx) const
Valeur pour l'élément idx.
Definition MDSpan.h:160
constexpr __host__ __device__ DataType * ptrAt(MDIndexType idx) const
Pointeur sur la valeur pour l'élément i.
Definition MDSpan.h:186
constexpr __host__ __device__ Int32 extent0() const
Valeur de la première dimension.
Definition MDSpan.h:102
constexpr __host__ __device__ DataType * ptrAt(Int32 i) const
Pointeur sur la valeur pour l'élément i.
Definition MDSpan.h:183
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-