Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
utils/NumArray.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/* NumArray.h (C) 2000-2024 */
9/* */
10/* Tableaux multi-dimensionnel pour les types numériques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_NUMARRAY_H
13#define ARCANE_UTILS_NUMARRAY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/MDSpan.h"
18#include "arcane/utils/MDDim.h"
19#include "arcane/utils/NumArrayContainer.h"
20#include "arcane/utils/ArcaneCxx20.h"
21#include "arcane/utils/String.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Tableaux multi-dimensionnels pour les types numériques accessibles
33 * sur accélérateurs.
34 *
35 * L'implémentation actuelle supporte des tableaux jusqu'à 4 dimensions. L'accès
36 * aux éléments se fait via l'opérateur 'operator()'.
37 *
38 * \warning Le redimensionnement via resize() ne conserve pas les valeurs existantes
39 * sauf pour les tableaux de rang 1.
40 *
41 * \warning Cette classe utilise par défaut un allocateur spécifique qui permet de
42 * rendre accessible ces valeurs à la fois sur l'hôte (CPU) et l'accélérateur.
43 * Néanmoins, il faut pour cela que le runtime associé à l'accélérateur ait été
44 * initialisé (\ref arcanedoc_parallel_accelerator). C'est pourquoi il ne faut pas
45 * utiliser de variables globales de cette classe ou d'une classe dérivée.
46 *
47 * Pour plus d'informations, se reporter à la page \ref arcanedoc_core_types_numarray.
48 */
49template <typename DataType, typename Extents, typename LayoutPolicy>
52{
53 public:
54
55 using ExtentsType = Extents;
57 using DynamicDimsType = typename ExtentsType::DynamicDimsType;
61 using ArrayBoundsIndexType = typename MDSpanType::ArrayBoundsIndexType;
62 using value_type = DataType;
63 using LayoutPolicyType = LayoutPolicy;
64
65 using ConstSpanType ARCANE_DEPRECATED_REASON("Use 'ConstMDSpanType' instead") = ConstMDSpanType;
66 using SpanType ARCANE_DEPRECATED_REASON("Use 'MDSpanType' instead") = MDSpanType;
67
68 public:
69
70 //! Nombre de dimensions du tableau
71 static constexpr int rank() { return Extents::rank(); }
72
73 public:
74
75 //! Construit un tableau vide
77 {
78 _resizeInit();
79 }
80
81 //! Construit un tableau en spécifiant directement la liste des dimensions
82 explicit NumArray(DynamicDimsType extents)
83 {
85 }
86
87 //! Construit un tableau en spécifiant directement la liste des dimensions
88 NumArray(const DynamicDimsType& extents, eMemoryRessource r)
89 : m_data(r)
90 {
92 }
93 //! Créé un tableau vide utilisant la ressource mémoire \a r
95 : m_data(r)
96 {
97 _resizeInit();
98 }
99
100 //! Construit un tableau avec 4 valeurs dynamiques
101 NumArray(Int32 dim1_size, Int32 dim2_size,
102 Int32 dim3_size, Int32 dim4_size) requires(Extents::nb_dynamic == 4)
103 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size))
104 {
105 }
106
107 //! Construit un tableau avec 4 valeurs dynamiques
108 NumArray(Int32 dim1_size, Int32 dim2_size,
109 Int32 dim3_size, Int32 dim4_size, eMemoryRessource r) requires(Extents::nb_dynamic == 4)
110 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size), r)
111 {
112 }
113
114 //! Construit un tableau avec 3 valeurs dynamiques
115 NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size) requires(Extents::nb_dynamic == 3)
116 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size))
117 {
118 }
119 //! Construit un tableau avec 3 valeurs dynamiques
120 NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, eMemoryRessource r) requires(Extents::nb_dynamic == 3)
121 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size), r)
122 {
123 }
124
125 //! Construit un tableau avec 2 valeurs dynamiques
126 NumArray(Int32 dim1_size, Int32 dim2_size) requires(Extents::nb_dynamic == 2)
127 : ThatClass(DynamicDimsType(dim1_size, dim2_size))
128 {
129 }
130 //! Construit un tableau avec 2 valeurs dynamiques
131 NumArray(Int32 dim1_size, Int32 dim2_size, eMemoryRessource r) requires(Extents::nb_dynamic == 2)
132 : ThatClass(DynamicDimsType(dim1_size, dim2_size), r)
133 {
134 }
135
136 //! Construit un tableau avec 1 valeur dynamique
137 explicit NumArray(Int32 dim1_size) requires(Extents::nb_dynamic == 1)
138 : ThatClass(DynamicDimsType(dim1_size))
139 {
140 }
141 //! Construit un tableau avec 1 valeur dynamique
142 NumArray(Int32 dim1_size, eMemoryRessource r) requires(Extents::nb_dynamic == 1)
143 : ThatClass(DynamicDimsType(dim1_size), r)
144 {
145 }
146
147 /*!
148 * \brief Construit un tableau à partir de valeurs prédéfinies (tableaux 2D dynamiques).
149 *
150 * Les valeurs sont rangées de manière contigues en mémoire donc
151 * la liste \a alist doit avoir un layout qui correspond à celui de cette classe.
152 */
153 NumArray(Int32 dim1_size, Int32 dim2_size, std::initializer_list<DataType> alist)
154 requires(Extents::is_full_dynamic() && Extents::rank() == 2)
155 : NumArray(dim1_size, dim2_size)
156 {
157 this->m_data.copyInitializerList(alist);
158 }
159
160 //! Construit un tableau à partir de valeurs prédéfinies (uniquement tableaux 1D dynamiques)
161 NumArray(Int32 dim1_size, std::initializer_list<DataType> alist)
162 requires(Extents::isDynamic1D())
163 : NumArray(dim1_size)
164 {
165 this->m_data.copyInitializerList(alist);
166 }
167
168 //! Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
170 requires(Extents::isDynamic1D())
171 : NumArray(v.size())
172 {
173 this->m_data.copy(v);
174 }
175
176 //! Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
178 requires(Extents::isDynamic1D())
179 : NumArray(arcaneCheckArraySize(v.size()))
180 {
181 this->m_data.copy(v);
182 }
183
184 NumArray(const ThatClass& rhs)
185 : m_span(rhs.m_span)
186 , m_data(rhs.m_data)
187 , m_total_nb_element(rhs.m_total_nb_element)
188 {
189 _updateSpanPointerFromData();
190 }
191
192 NumArray(ThatClass&& rhs)
193 : m_span(rhs.m_span)
194 , m_data(std::move(rhs.m_data))
195 , m_total_nb_element(rhs.m_total_nb_element)
196 {
197 }
198
199 ThatClass& operator=(ThatClass&&) = default;
200
201 /*!
202 * \brief Opérateur de recopie.
203 *
204 * \warning Après appel à cette méthode, la ressource mémoire de l'instance
205 * sera celle de \a rhs. Si on souhaite faire une recopie en conservant la
206 * ressource mémoire associée il faut utiliser copy().
207 */
208 ThatClass& operator=(const ThatClass& rhs)
209 {
210 if (&rhs == this)
211 return (*this);
212 eMemoryRessource r = memoryRessource();
213 eMemoryRessource rhs_r = rhs.memoryRessource();
214 if (rhs_r != r)
215 m_data = ArrayWrapper(rhs_r);
216 this->copy(rhs);
217 return (*this);
218 }
219
220 /*!
221 * \brief Échange les données avec \a rhs.
222 *
223 * \warning L'allocateur mémoire est aussi échangé. Il est donc
224 * préférable que les deux NumArray utilisent le même allocateur
225 * et le même memoryRessource().
226 */
227 void swap(ThatClass& rhs)
228 {
229 m_data.swap(rhs.m_data);
230 std::swap(m_span, rhs.m_span);
231 std::swap(m_total_nb_element, rhs.m_total_nb_element);
232 }
233
234 public:
235
236 //! Nombre total d'éléments du tableau
237 constexpr Int64 totalNbElement() const { return m_total_nb_element; }
238 //! Nombre de dimensions
239 static constexpr Int32 nbDimension() { return Extents::rank(); }
240 //! Valeurs des dimensions
241 ArrayExtents<Extents> extents() const { return m_span.extents(); }
242 ArrayExtentsWithOffset<Extents, LayoutPolicy> extentsWithOffset() const
243 {
244 return m_span.extentsWithOffset();
245 }
246 Int64 capacity() const { return m_data.capacity(); }
247 eMemoryRessource memoryRessource() const { return m_data.memoryRessource(); }
248 //! Vue sous forme d'octets
249 Span<std::byte> bytes() { return asWritableBytes(to1DSpan()); }
250 //! Vue constante forme d'octets
251 Span<const std::byte> bytes() const { return asBytes(to1DSpan()); }
252
253 //! Allocateur mémoire associé
254 IMemoryAllocator* memoryAllocator() const { return m_data.allocator(); }
255
256 /*!
257 * \brief Positionne le nom du tableau pour les informations de debug.
258 *
259 * Ce nom peut être utilisé par exemple pour les affichages listing.
260 */
261 void setDebugName(const String& str) { m_data.setDebugName(str); }
262
263 //! Nom de debug (nul si aucun nom spécifié)
264 String debugName() { return m_data.debugName(); }
265
266 public:
267
268 //! Valeur de la première dimension
269 constexpr Int32 dim1Size() const requires(Extents::rank() >= 1) { return m_span.extent0(); }
270 //! Valeur de la deuxième dimension
271 constexpr Int32 dim2Size() const requires(Extents::rank() >= 2) { return m_span.extent1(); }
272 //! Valeur de la troisième dimension
273 constexpr Int32 dim3Size() const requires(Extents::rank() >= 3) { return m_span.extent2(); }
274 //! Valeur de la quatrième dimension
275 constexpr Int32 dim4Size() const requires(Extents::rank() >= 4) { return m_span.extent3(); }
276
277 //! Valeur de la première dimension
278 constexpr Int32 extent0() const requires(Extents::rank() >= 1) { return m_span.extent0(); }
279 //! Valeur de la deuxième dimension
280 constexpr Int32 extent1() const requires(Extents::rank() >= 2) { return m_span.extent1(); }
281 //! Valeur de la troisième dimension
282 constexpr Int32 extent2() const requires(Extents::rank() >= 3) { return m_span.extent2(); }
283 //! Valeur de la quatrième dimension
284 constexpr Int32 extent3() const requires(Extents::rank() >= 4) { return m_span.extent3(); }
285
286 public:
287
288 //! Modifie la taille du tableau en gardant pas les valeurs actuelles
289 void resize(Int32 dim1_size) requires(Extents::nb_dynamic == 1)
290 {
291 m_span.m_extents = DynamicDimsType(dim1_size);
292 _resize();
293 }
294
295 // TODO: Rendre obsolète (juin 2025)
296 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
297 void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size) requires(Extents::nb_dynamic == 4)
298 {
299 this->resizeDestructive(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size));
300 }
301
302 // TODO: Rendre obsolète (juin 2025)
303 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
304 void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size) requires(Extents::nb_dynamic == 3)
305 {
306 this->resizeDestructive(DynamicDimsType(dim1_size, dim2_size, dim3_size));
307 }
308
309 // TODO: Rendre obsolète (juin 2025)
310 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
311 void resize(Int32 dim1_size, Int32 dim2_size) requires(Extents::nb_dynamic == 2)
312 {
313 this->resizeDestructive(DynamicDimsType(dim1_size, dim2_size));
314 }
315
316 /*!
317 * \brief Modifie la taille du tableau.
318 * \warning Les valeurs actuelles ne sont pas conservées lors de cette opération
319 * et les nouvelles valeurs ne sont pas initialisées.
320 */
321 //@{
322 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
323 void resizeDestructive(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size) requires(Extents::nb_dynamic == 4)
324 {
325 this->resizeDestructive(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size));
326 }
327
328 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
329 void resizeDestructive(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size) requires(Extents::nb_dynamic == 3)
330 {
331 this->resizeDestructive(DynamicDimsType(dim1_size, dim2_size, dim3_size));
332 }
333
334 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
335 void resizeDestructive(Int32 dim1_size, Int32 dim2_size) requires(Extents::nb_dynamic == 2)
336 {
337 this->resizeDestructive(DynamicDimsType(dim1_size, dim2_size));
338 }
339
340 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
341 void resizeDestructive(Int32 dim1_size) requires(Extents::nb_dynamic == 1)
342 {
343 this->resizeDestructive(DynamicDimsType(dim1_size));
344 }
345
346 // TODO: Rendre obsolète (juin 2025)
347 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
348 void resize(const DynamicDimsType& dims)
349 {
350 resizeDestructive(dims);
351 }
352
353 //! Modifie la taille du tableau en ne gardant pas les valeurs actuelles
354 void resizeDestructive(const DynamicDimsType& dims)
355 {
356 m_span.m_extents = dims;
357 _resize();
358 }
359 //@}
360
361 public:
362
363 /*!
364 * \brief Remplit les valeurs du tableau par \a v.
365 *
366 * \warning L'opération se fait sur l'hôte donc la mémoire associée
367 * à l'instance doit être accessible sur l'hôte.
368 */
369 void fill(const DataType& v)
370 {
371 fillHost(v);
372 }
373
374 /*!
375 * \brief Remplit via la file \a queue, les valeurs du tableau d'indices
376 * données par \a indexes par la valeur \a v .
377 *
378 * La mémoire associée à l'instance doit être accessible depuis la file \a queue.
379 * \a queue peut être nulle, auquel cas le remplissage se fait sur l'hôte.
380 */
381 void fill(const DataType& v, SmallSpan<const Int32> indexes, const RunQueue* queue)
382 {
383 m_data.fill(v, indexes, queue);
384 }
385
386 /*!
387 * \brief Remplit via la file \a queue, les valeurs du tableau d'indices
388 * données par \a indexes par la valeur \a v .
389 *
390 * La mémoire associée à l'instance doit être accessible depuis la file \a queue.
391 */
392 void fill(const DataType& v, SmallSpan<const Int32> indexes, const RunQueue& queue)
393 {
394 m_data.fill(v, indexes, &queue);
395 }
396
397 /*!
398 * \brief Remplit les éléments de l'instance la valeur \a v en utilisant la file \a queue.
399 *
400 * \a queue peut être nulle, auquel cas le remplissage se fait sur l'hôte.
401 */
402 void fill(const DataType& v, const RunQueue* queue)
403 {
404 m_data.fill(v, queue);
405 }
406
407 /*!
408 * \brief Remplit les éléments de l'instance la valeur \a v en utilisant la file \a queue.
409 *
410 * \a queue peut être nulle, auquel cas le remplissage se fait sur l'hôte.
411 */
412 void fill(const DataType& v, const RunQueue& queue)
413 {
414 m_data.fill(v, &queue);
415 }
416
417 /*!
418 * \brief Remplit les valeurs du tableau par \a v.
419 *
420 * L'opération se fait sur l'hôte donc la mémoire associée
421 * à l'instance doit être accessible sur l'hôte.
422 */
423 void fillHost(const DataType& v)
424 {
425 _checkHost(memoryRessource());
426 m_data.fill(v);
427 }
428
429 public:
430
431 /*!
432 * \brief Copie dans l'instance les valeurs de \a rhs.
433 *
434 * Cette opération est valide quelle que soit la mêmoire associée
435 * associée à l'instance.
436 */
437 void copy(SmallSpan<const DataType> rhs) requires(Extents::isDynamic1D())
438 {
439 copy(rhs, nullptr);
440 }
441
442 /*!
443 * \brief Copie dans l'instance les valeurs de \a rhs.
444 *
445 * Cette opération est valide quelle que soit la mêmoire associée
446 * associée à l'instance.
447 */
448 void copy(ConstMDSpanType rhs) { copy(rhs, nullptr); }
449
450 /*!
451 * \brief Copie dans l'instance les valeurs de \a rhs.
452 *
453 * Cette opération est valide quelle que soit la mêmoire associée
454 * associée à l'instance.
455 */
456 void copy(const ThatClass& rhs) { copy(rhs, nullptr); }
457
458 /*!
459 * \brief Copie dans l'instance les valeurs de \a rhs via la file \a queue.
460 *
461 * Cette opération est valide quelle que soit la mêmoire associée
462 * associée à l'instance.
463 * \a queue peut être nul. Si la file est asynchrone, il faudra la
464 * synchroniser avant de pouvoir utiliser l'instance.
465 */
466 void copy(SmallSpan<const DataType> rhs, const RunQueue* queue) requires(Extents::isDynamic1D())
467 {
468 _resizeAndCopy(ConstMDSpanType(rhs), eMemoryRessource::Unknown, queue);
469 }
470
471 /*!
472 * \brief Copie dans l'instance les valeurs de \a rhs via la file \a queue.
473 *
474 * Cette opération est valide quelle que soit la mêmoire associée
475 * associée à l'instance.
476 * \a queue peut être nul. Si la file est asynchrone, il faudra la
477 * synchroniser avant de pouvoir utiliser l'instance.
478 */
479 void copy(ConstMDSpanType rhs, const RunQueue* queue)
480 {
481 _resizeAndCopy(rhs, eMemoryRessource::Unknown, queue);
482 }
483
484 /*!
485 * \brief Copie dans l'instance les valeurs de \a rhs via la file \a queue.
486 *
487 * Cette opération est valide quelle que soit la mêmoire associée
488 * associée à l'instance.
489 * \a queue peut être nulle, auquel cas la copie se fait sur l'hôte.
490 * Si la file est asynchrone, il faudra la synchroniser avant de pouvoir utiliser l'instance.
491 */
492 void copy(SmallSpan<const DataType> rhs, const RunQueue& queue) requires(Extents::isDynamic1D())
493 {
494 _resizeAndCopy(ConstMDSpanType(rhs), eMemoryRessource::Unknown, &queue);
495 }
496
497 /*!
498 * \brief Copie dans l'instance les valeurs de \a rhs via la file \a queue.
499 *
500 * Cette opération est valide quelle que soit la mêmoire associée
501 * associée à l'instance.
502 * \a queue peut être nulle, auquel cas la copie se fait sur l'hôte.
503 * Si la file est asynchrone, il faudra la synchroniser avant de pouvoir utiliser l'instance.
504 */
505 void copy(ConstMDSpanType rhs, const RunQueue& queue)
506 {
507 _resizeAndCopy(rhs, eMemoryRessource::Unknown, &queue);
508 }
509
510 /*!
511 * \brief Copie dans l'instance les valeurs de \a rhs via la file \a queue.
512 *
513 * Cette opération est valide quelle que soit la mêmoire associée
514 * associée à l'instance.
515 * \a queue peut être nulle, auquel cas la copie se fait sur l'hôte.
516 * Si la file est asynchrone, il faudra la synchroniser avant de pouvoir utiliser l'instance.
517 */
518 void copy(const ThatClass& rhs, const RunQueue* queue)
519 {
520 _resizeAndCopy(rhs.constMDSpan(), rhs.memoryRessource(), queue);
521 }
522
523 /*!
524 * \brief Copie dans l'instance les valeurs de \a rhs via la file \a queue.
525 *
526 * Cette opération est valide quelle que soit la mêmoire associée
527 * associée à l'instance.
528 * \a queue peut être nul. Si la file est asynchrone, il faudra la
529 * synchroniser avant de pouvoir utiliser l'instance.
530 */
531 void copy(const ThatClass& rhs, const RunQueue& queue)
532 {
533 _resizeAndCopy(rhs.constMDSpan(), rhs.memoryRessource(), &queue);
534 }
535
536 public:
537
538 //! Récupère une référence pour l'élément \a i
539 DataType& operator[](Int32 i) requires(Extents::rank() == 1) { return m_span(i); }
540 //! Valeur pour l'élément \a i
541 DataType operator[](Int32 i) const requires(Extents::rank() == 1) { return m_span(i); }
542
543 public:
544
545 //! Valeur pour l'élément \a i,j,k,l
546 DataType operator()(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
547 {
548 return m_span(i, j, k, l);
549 }
550 //! Positionne la valeur pour l'élément \a i,j,k,l
551 DataType& operator()(Int32 i, Int32 j, Int32 k, Int32 l) requires(Extents::rank() == 4)
552 {
553 return m_span(i, j, k, l);
554 }
555
556 //! Valeur pour l'élément \a i,j,k
557 DataType operator()(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
558 {
559 return m_span(i, j, k);
560 }
561 //! Positionne la valeur pour l'élément \a i,j,k
562 DataType& operator()(Int32 i, Int32 j, Int32 k) requires(Extents::rank() == 3)
563 {
564 return m_span(i, j, k);
565 }
566
567 //! Valeur pour l'élément \a i,j
568 DataType operator()(Int32 i, Int32 j) const requires(Extents::rank() == 2)
569 {
570 return m_span(i, j);
571 }
572 //! Positionne la valeur pour l'élément \a i,j
573 DataType& operator()(Int32 i, Int32 j) requires(Extents::rank() == 2)
574 {
575 return m_span(i, j);
576 }
577 //! Valeur pour l'élément \a i
578 DataType operator()(Int32 i) const requires(Extents::rank() == 1) { return m_span(i); }
579 //! Positionne la valeur pour l'élément \a i
580 DataType& operator()(Int32 i) requires(Extents::rank() == 1) { return m_span(i); }
581
582 public:
583
584 //! Référence constante pour l'élément \a idx
585 const DataType& operator()(ArrayBoundsIndexType idx) const
586 {
587 return m_span(idx);
588 }
589 //! Référence modifiable l'élément \a idx
590 DataType& operator()(ArrayBoundsIndexType idx)
591 {
592 return m_span(idx);
593 }
594
595 public:
596
597 // TODO: rendre obsolète
598 //! Positionne la valeur pour l'élément \a i,j,k,l
599 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
600 DataType& s(Int32 i, Int32 j, Int32 k, Int32 l) requires(Extents::rank() == 4)
601 {
602 return m_span(i, j, k, l);
603 }
604 //! Positionne la valeur pour l'élément \a i,j,k
605 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
606 DataType& s(Int32 i, Int32 j, Int32 k) requires(Extents::rank() == 3)
607 {
608 return m_span(i, j, k);
609 }
610 //! Positionne la valeur pour l'élément \a i,j
611 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
612 DataType& s(Int32 i, Int32 j) requires(Extents::rank() == 2)
613 {
614 return m_span(i, j);
615 }
616 //! Positionne la valeur pour l'élément \a i
617 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
618 DataType& s(Int32 i) requires(Extents::rank() == 1) { return m_span(i); }
619
620 //! Positionne la valeur pour l'élément \a idx
621 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
622 DataType& s(ArrayBoundsIndexType idx)
623 {
624 return m_span(idx);
625 }
626
627 public:
628
629 //! Vue multi-dimension sur l'instance
630 ARCANE_DEPRECATED_REASON("Y2024: Use mdspan() instead")
631 MDSpanType span() { return m_span; }
632
633 //! Vue constante multi-dimension sur l'instance
634 ARCANE_DEPRECATED_REASON("Y2024: Use mdspan() instead")
635 ConstMDSpanType span() const { return m_span.constMDSpan(); }
636
637 //! Vue constante multi-dimension sur l'instance
638 ARCANE_DEPRECATED_REASON("Y2024: Use constMDSpan() instead")
639 ConstMDSpanType constSpan() const { return m_span.constMDSpan(); }
640
641 //! Vue multi-dimension sur l'instance
642 MDSpanType mdspan() { return m_span; }
643
644 //! Vue constante multi-dimension sur l'instance
645 ConstMDSpanType mdspan() const { return m_span.constMDSpan(); }
646
647 //! Vue constante multi-dimension sur l'instance
648 ConstMDSpanType constMDSpan() const { return m_span.constMDSpan(); }
649
650 //! Vue 1D constante sur l'instance
651 Span<const DataType> to1DSpan() const { return m_span.to1DSpan(); }
652
653 //! Vue 1D sur l'instance
654 Span<DataType> to1DSpan() { return m_span.to1DSpan(); }
655
656 //! Conversion vers une vue multi-dimension sur l'instance
657 constexpr operator MDSpanType() { return this->mdspan(); }
658 //! Conversion vers une vue constante multi-dimension sur l'instance
659 constexpr operator ConstMDSpanType() const { return this->constMDSpan(); }
660
661 //! Conversion vers une vue 1D sur l'instance (uniquement si rank == 1)
662 constexpr operator SmallSpan<DataType>() requires(Extents::rank() == 1) { return this->to1DSpan().smallView(); }
663 //! Conversion vers une vue constante 1D sur l'instance (uniquement si rank == 1)
664 constexpr operator SmallSpan<const DataType>() const requires(Extents::rank() == 1) { return this->to1DSpan().constSmallView(); }
665
666 //! Vue 1D sur l'instance (uniquement si rank == 1)
667 constexpr SmallSpan<DataType> to1DSmallSpan() requires(Extents::rank() == 1) { return m_span.to1DSmallSpan(); }
668 //! Vue constante 1D sur l'instance (uniquement si rank == 1)
669 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1) { return m_span.to1DSmallSpan(); }
670 //! Vue constante 1D sur l'instance (uniquement si rank == 1)
671 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1) { return m_span.to1DConstSmallSpan(); }
672
673 public:
674
675 //! \internal
676 DataType* _internalData() { return m_span._internalData(); }
677
678 private:
679
680 MDSpanType m_span;
681 ArrayWrapper m_data;
682 Int64 m_total_nb_element = 0;
683
684 private:
685
686 void _updateSpanPointerFromData()
687 {
688 m_span.m_ptr = m_data.to1DSpan().data();
689 }
690
691 void _resizeAndCopy(ConstMDSpanType rhs, eMemoryRessource input_ressource, const RunQueue* queue)
692 {
693 this->resize(rhs.extents().dynamicExtents());
694 m_data.copyOnly(rhs.to1DSpan(), input_ressource, queue);
695 _updateSpanPointerFromData();
696 }
697
698 //! Redimensionne le tableau à partir des valeurs de \a m_span.extents()
699 void _resize()
700 {
701 m_total_nb_element = m_span.extents().totalNbElement();
702 m_data.resize(m_total_nb_element);
703 _updateSpanPointerFromData();
704 }
705
706 /*!
707 * \brief Allocation éventuelle lors de l'initialisation.
708 *
709 * Il y a besoin de faire une allocation lors de l'initialisation
710 * avec le constructeur par défaut dans le cas où toutes les
711 * dimensions sont statiques.
712 */
713 void _resizeInit()
714 {
715 if constexpr (ExtentsType::nb_dynamic == 0) {
716 resize(DynamicDimsType());
717 }
718 }
719};
720
721/*---------------------------------------------------------------------------*/
722/*---------------------------------------------------------------------------*/
723
724} // End namespace Arcane
725
726/*---------------------------------------------------------------------------*/
727/*---------------------------------------------------------------------------*/
728
729#endif
File d'exécution pour un accélérateur.
Classe de base des vues multi-dimensionnelles.
Definition MDSpan.h:44
constexpr __host__ __device__ Int32 extent3() const
Valeur de la quatrième dimension.
Definition MDSpan.h:130
constexpr __host__ __device__ Int32 extent2() const
Valeur de la troisième dimension.
Definition MDSpan.h:128
constexpr __host__ __device__ Int32 extent1() const
Valeur de la deuxième dimension.
Definition MDSpan.h:126
constexpr __host__ __device__ Int32 extent0() const
Valeur de la première dimension.
Definition MDSpan.h:124
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
void resizeDestructive(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Modifie la taille du tableau.
DataType operator()(Int32 i) const
Valeur pour l'élément i.
void resizeDestructive(Int32 dim1_size, Int32 dim2_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
void copy(const ThatClass &rhs, const RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
constexpr Int32 extent0() const
Valeur de la première dimension.
Span< const DataType > to1DSpan() const
Vue 1D constante sur l'instance.
Span< std::byte > bytes()
Vue sous forme d'octets.
DataType & s(Int32 i, Int32 j, Int32 k, Int32 l)
Positionne la valeur pour l'élément i,j,k,l.
DataType & operator()(Int32 i, Int32 j)
Positionne la valeur pour l'élément i,j.
constexpr SmallSpan< const DataType > to1DConstSmallSpan() const
Vue constante 1D sur l'instance (uniquement si rank == 1)
constexpr Int32 dim4Size() const
Valeur de la quatrième dimension.
DataType & operator()(Int32 i)
Positionne la valeur pour l'élément i.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Construit un tableau avec 3 valeurs dynamiques.
void swap(ThatClass &rhs)
Échange les données avec rhs.
void copy(const ThatClass &rhs)
Copie dans l'instance les valeurs de rhs.
MDSpanType span()
Vue multi-dimension sur l'instance.
Span< DataType > to1DSpan()
Vue 1D sur l'instance.
static constexpr int rank()
Nombre de dimensions du tableau.
DataType operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
NumArray(Int32 dim1_size, Int32 dim2_size)
Construit un tableau avec 2 valeurs dynamiques.
void fill(const DataType &v, const RunQueue *queue)
Remplit les éléments de l'instance la valeur v en utilisant la file queue.
void copy(SmallSpan< const DataType > rhs)
Copie dans l'instance les valeurs de rhs.
constexpr Int32 dim3Size() const
Valeur de la troisième dimension.
NumArray(eMemoryRessource r)
Créé un tableau vide utilisant la ressource mémoire r.
MDSpanType mdspan()
Vue multi-dimension sur l'instance.
constexpr SmallSpan< DataType > to1DSmallSpan()
Vue 1D sur l'instance (uniquement si rank == 1)
ThatClass & operator=(const ThatClass &rhs)
Opérateur de recopie.
DataType operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
DataType & operator()(Int32 i, Int32 j, Int32 k)
Positionne la valeur pour l'élément i,j,k.
NumArray(Int32 dim1_size, std::initializer_list< DataType > alist)
Construit un tableau à partir de valeurs prédéfinies (uniquement tableaux 1D dynamiques)
DataType & operator[](Int32 i)
Récupère une référence pour l'élément i.
void copy(ConstMDSpanType rhs)
Copie dans l'instance les valeurs de rhs.
void resizeDestructive(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
void fill(const DataType &v, const RunQueue &queue)
Remplit les éléments de l'instance la valeur v en utilisant la file queue.
String debugName()
Nom de debug (nul si aucun nom spécifié)
Span< const std::byte > bytes() const
Vue constante forme d'octets.
IMemoryAllocator * memoryAllocator() const
Allocateur mémoire associé
DataType & operator()(ArrayBoundsIndexType idx)
Référence modifiable l'élément idx.
void copy(ConstMDSpanType rhs, const RunQueue &queue)
Copie dans l'instance les valeurs de rhs via la file queue.
ConstMDSpanType mdspan() const
Vue constante multi-dimension sur l'instance.
NumArray(Int32 dim1_size, eMemoryRessource r)
Construit un tableau avec 1 valeur dynamique.
constexpr SmallSpan< const DataType > to1DSmallSpan() const
Vue constante 1D sur l'instance (uniquement si rank == 1)
const DataType & operator()(ArrayBoundsIndexType idx) const
Référence constante pour l'élément idx.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Construit un tableau avec 4 valeurs dynamiques.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, const RunQueue *queue)
Remplit via la file queue, les valeurs du tableau d'indices données par indexes par la valeur v .
void copy(SmallSpan< const DataType > rhs, const RunQueue &queue)
Copie dans l'instance les valeurs de rhs via la file queue.
void copy(ConstMDSpanType rhs, const RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
void resize(const DynamicDimsType &dims)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
NumArray(Int32 dim1_size, Int32 dim2_size, eMemoryRessource r)
Construit un tableau avec 2 valeurs dynamiques.
void fill(const DataType &v)
Remplit les valeurs du tableau par v.
void fillHost(const DataType &v)
Remplit les valeurs du tableau par v.
constexpr Int32 extent1() const
Valeur de la deuxième dimension.
void resize(Int32 dim1_size, Int32 dim2_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
static constexpr Int32 nbDimension()
Nombre de dimensions.
void resizeDestructive(const DynamicDimsType &dims)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
void resizeDestructive(Int32 dim1_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
constexpr Int32 dim1Size() const
Valeur de la première dimension.
NumArray(const DynamicDimsType &extents, eMemoryRessource r)
Construit un tableau en spécifiant directement la liste des dimensions.
NumArray()
Construit un tableau vide.
DataType operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, const RunQueue &queue)
Remplit via la file queue, les valeurs du tableau d'indices données par indexes par la valeur v .
constexpr Int32 extent3() const
Valeur de la quatrième dimension.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size, eMemoryRessource r)
Construit un tableau avec 4 valeurs dynamiques.
void copy(SmallSpan< const DataType > rhs, const RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
constexpr Int32 dim2Size() const
Valeur de la deuxième dimension.
ConstMDSpanType constSpan() const
Vue constante multi-dimension sur l'instance.
NumArray(Int32 dim1_size)
Construit un tableau avec 1 valeur dynamique.
void setDebugName(const String &str)
Positionne le nom du tableau pour les informations de debug.
ConstMDSpanType constMDSpan() const
Vue constante multi-dimension sur l'instance.
void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
constexpr Int32 extent2() const
Valeur de la troisième dimension.
void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Modifie la taille du tableau en ne gardant pas les valeurs actuelles.
NumArray(Int32 dim1_size, Int32 dim2_size, std::initializer_list< DataType > alist)
Construit un tableau à partir de valeurs prédéfinies (tableaux 2D dynamiques).
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, eMemoryRessource r)
Construit un tableau avec 3 valeurs dynamiques.
void copy(const ThatClass &rhs, const RunQueue &queue)
Copie dans l'instance les valeurs de rhs via la file queue.
NumArray(DynamicDimsType extents)
Construit un tableau en spécifiant directement la liste des dimensions.
NumArray(SmallSpan< const DataType > v)
Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l)
Positionne la valeur pour l'élément i,j,k,l.
ArrayExtents< Extents > extents() const
Valeurs des dimensions.
DataType operator[](Int32 i) const
Valeur pour l'élément i.
NumArray(Span< const DataType > v)
Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
constexpr Int64 totalNbElement() const
Nombre total d'éléments du tableau.
void resize(Int32 dim1_size)
Modifie la taille du tableau en gardant pas les valeurs actuelles.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, const RunQueue *queue)
Remplit les indices données par indexes avec la valeur v.
Vue d'un tableau d'éléments de type T.
Definition Span.h:670
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:270
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span.h:279
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Arccore::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
Definition UtilsTypes.h:269
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
eMemoryResource
Liste des ressources mémoire disponibles.