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