Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
RunCommandMaterialEnumerate.h
Aller à la documentation de ce fichier.
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/* RunCommandMaterialEnumerate.h (C) 2000-2024 */
9/* */
10/* Exécution d'une boucle sur une liste de constituants. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_RUNCOMMANDMATERIALENUMERATE_H
13#define ARCANE_ACCELERATOR_RUNCOMMANDMATERIALENUMERATE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArcaneCxx20.h"
18
20#include "arcane/core/materials/ComponentItemVectorView.h"
21#include "arcane/core/materials/MaterialsCoreGlobal.h"
22#include "arcane/core/materials/MatItem.h"
24
25#include "arcane/accelerator/KernelLauncher.h"
26#include "arcane/accelerator/RunCommand.h"
27#include "arcane/accelerator/RunCommandLaunchInfo.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::Materials
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37/*!
38 * \brief Index d'une boucle accélérateur sur les matériaux ou milieux.
39 *
40 * Cette classe permet de récupérer un EnvItemLocalId (pour un milieu) ou
41 * un MatItemLocalId (pour un matériau) ainsi que le CellLocalId de la maille
42 * globale associée.
43 */
44template <typename ConstituentItemLocalIdType_>
46{
47 public:
48
49 using ConstituentItemLocalIdType = ConstituentItemLocalIdType_;
52
53 public:
54
55 //! Struct interne simple pour éviter l'usage d'un std::tuple pour l'opérateur()
56 struct Data
57 {
58 public:
59
60 constexpr ARCCORE_HOST_DEVICE Data(ConstituentItemLocalIdType mvi, CellLocalId cid)
61 : m_mvi(mvi)
62 , m_cid(cid)
63 {}
64
65 public:
66
67 ConstituentItemLocalIdType m_mvi;
68 CellLocalId m_cid;
69 };
70
71 public:
72
73 constexpr ARCCORE_HOST_DEVICE ConstituentAndGlobalCellIteratorValue(ConstituentItemLocalIdType mvi, CellLocalId cid, Int32 index)
74 : m_internal_data{ mvi, cid }
75 , m_index(index)
76 {
77 }
78
79 /*!
80 * \brief Cet opérateur permet de renvoyer le couple [ConstituentItemLocalIdType, CellLocalId].
81 *
82 * L'utilisation classique est :
83 *
84 * \code
85 * // Pour un milieu \a envcellsv
86 * // evi est de type EnvItemLocalId
87 * cmd << RUNCOMMAND_MAT_ENUMERATE(EnvAndGlobalCell, iter, envcellsv) {
88 * auto [evi, cid] = iter();
89 * }
90 * // Pour un matériau \a matcellsv
91 * // mvi est de type MatItemLocalId
92 * cmd << RUNCOMMAND_MAT_ENUMERATE(MatAndGlobalCell, iter, matcellsv) {
93 * auto [mvi, cid] = iter();
94 * }
95 * \endcode
96 */
97 constexpr ARCCORE_HOST_DEVICE Data operator()()
98 {
99 return m_internal_data;
100 }
101
102 //! Accesseur sur la partie MatVarIndex
103 constexpr ARCCORE_HOST_DEVICE ConstituentItemLocalIdType varIndex() const { return m_internal_data.m_mvi; };
104
105 //! Accesseur sur la partie cell local id
106 constexpr ARCCORE_HOST_DEVICE CellLocalId globalCellId() const { return m_internal_data.m_cid; }
107
108 //! Index de l'itération courante
109 constexpr ARCCORE_HOST_DEVICE Int32 index() const { return m_index; }
110
111 private:
112
113 Data m_internal_data;
114 Int32 m_index = -1;
115};
116
117//! Type de la valeur de l'itérateur pour RUNCOMMAND_MAT_ENUMERATE(EnvAndGlobalCell,...)
119
120//! Type de la valeur de l'itérateur pour RUNCOMMAND_MAT_ENUMERATE(MatAndGlobalCell,...)
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126} // namespace Arcane::Materials
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
131namespace Arcane::Accelerator::impl
132{
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136/*!
137 * \brief Commande pour itérer sur les AllEnvCell.
138 */
140{
142
143 public:
144
147
148 public:
149
150 /*!
151 * \brief Conteneur contenant les informations nécessaires pour la commande.
152 */
154 {
155 public:
156
158 : m_view(view)
159 {
160 }
161
162 public:
163 public:
164
165 constexpr ARCCORE_HOST_DEVICE Int32 size() const { return m_view.size(); }
166
167 //! Accesseur pour le i-ème élément de la liste
168 ARCCORE_HOST_DEVICE IteratorValueType operator[](Int32 i) const
169 {
170 return m_view[i];
171 }
172
173 private:
174
176 };
177
178 public:
179
180 static AllEnvCellRunCommand create(RunCommand& run_command, const Container& items)
181 {
182 return AllEnvCellRunCommand(run_command, items);
183 }
184
185 private:
186
187 // Uniquement appelable depuis 'Container'
188 explicit AllEnvCellRunCommand(RunCommand& command, const Container& items)
189 : m_command(command)
190 , m_items(items)
191 {
192 }
193
194 public:
195
196 RunCommand& m_command;
197 Container m_items;
198};
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202
204{
205 protected:
206
210
211 protected:
212
214 : m_items(view)
215 {
216 m_nb_item = m_items.nbItem();
217 m_matvar_indexes = m_items._matvarIndexes();
218 m_global_cells_local_id = m_items._internalLocalIds();
219 }
220
221 public:
222
223 constexpr ARCCORE_HOST_DEVICE Int32 size() const { return m_nb_item; }
224
225 protected:
226
228 SmallSpan<const MatVarIndex> m_matvar_indexes;
229 SmallSpan<const Int32> m_global_cells_local_id;
230 Int32 m_nb_item = 0;
231};
232
233/*---------------------------------------------------------------------------*/
234/*---------------------------------------------------------------------------*/
235/*!
236 * \brief Commande pour itérer sur les EnvCell ou MatCell.
237 */
238template <typename ConstituentItemLocalIdType_, typename ContainerCreateViewType_>
240{
241 public:
242
244 using CommandType = ThatClass;
245 using IteratorValueType = ConstituentItemLocalIdType_;
246 using ContainerCreateViewType = ContainerCreateViewType_;
247
248 public:
249
250 /*!
251 * \brief Conteneur contenant les informations nécessaires pour la commande.
252 */
255 {
256 public:
257
258 explicit Container(ContainerCreateViewType view)
260 {
261 }
262
263 public:
264
265 //! Accesseur pour le i-ème élément de la liste
266 constexpr ARCCORE_HOST_DEVICE IteratorValueType operator[](Int32 i) const
267 {
268 return { ComponentItemLocalId(m_matvar_indexes[i]) };
269 }
270 };
271
272 public:
273
274 static CommandType create(RunCommand& run_command, const Container& items)
275 {
276 return CommandType(run_command, items);
277 }
278
279 private:
280
281 // Uniquement appelable depuis 'Container'
282 explicit ConstituentRunCommandBase(RunCommand& command, const Container& items)
283 : m_command(command)
284 , m_items(items)
285 {
286 }
287
288 public:
289
290 RunCommand& m_command;
291 Container m_items;
292};
293
294using EnvCellRunCommand = ConstituentRunCommandBase<Arcane::Materials::EnvItemLocalId, Arcane::Materials::EnvCellVectorView>;
295using MatCellRunCommand = ConstituentRunCommandBase<Arcane::Materials::MatItemLocalId, Arcane::Materials::MatCellVectorView>;
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
299/*!
300 * \brief Classe pour les commandes MatAndGlobalCell et EnvAndGlobalCell.
301 */
302template <typename ConstituentItemLocalIdType_, typename ContainerCreateViewType_>
304{
305 public:
306
308 using CommandType = ThatClass;
310 using ContainerCreateViewType = ContainerCreateViewType_;
311
312 public:
313
314 /*!
315 * \brief Conteneur contenant les informations nécessaires pour la commande.
316 */
319 {
320 public:
321
322 explicit Container(ContainerCreateViewType view)
324 {
325 }
326
327 public:
328
329 //! Accesseur pour le i-ème élément de la liste
330 constexpr ARCCORE_HOST_DEVICE IteratorValueType operator[](Int32 i) const
331 {
332 return { ComponentItemLocalId(m_matvar_indexes[i]), CellLocalId(m_global_cells_local_id[i]), i };
333 }
334 };
335
336 public:
337
338 static CommandType create(RunCommand& run_command, const Container& items)
339 {
340 return CommandType(run_command, items);
341 }
342
343 private:
344
345 // Uniquement appelable depuis 'Container'
346 explicit ConstituentAndGlobalCellRunCommandBase(RunCommand& command, const Container& items)
347 : m_command(command)
348 , m_items(items)
349 {
350 }
351
352 public:
353
354 RunCommand& m_command;
355 Container m_items;
356};
357
358/*---------------------------------------------------------------------------*/
359/*---------------------------------------------------------------------------*/
360
361using EnvAndGlobalCellRunCommand = ConstituentAndGlobalCellRunCommandBase<Arcane::Materials::EnvItemLocalId, Arcane::Materials::EnvCellVectorView>;
362using MatAndGlobalCellRunCommand = ConstituentAndGlobalCellRunCommandBase<Arcane::Materials::MatItemLocalId, Arcane::Materials::MatCellVectorView>;
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369/*!
370 * \brief Caractéristiques d'un énumérateur d'une commande sur les matériaux/milieux.
371 *
372 * Cette classe doit être spécialisée et définir les types suivants:
373 * - CommandType
374 * - IteratorValueType
375 * - ContainerType
376 * - ContainerCreateViewType
377 */
378template <typename MatItemType>
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383/*!
384 * \brief Classe de base des caractéristiques des commandes sur les constituants.
385 */
386template <typename CommandType_>
388{
389 public:
390
391 using CommandType = CommandType_;
392 using IteratorValueType = CommandType::IteratorValueType;
393 using ContainerType = CommandType::Container;
394 using ContainerCreateViewType = CommandType::ContainerCreateViewType;
395
396 public:
397
398 static ContainerType createContainer(const ContainerCreateViewType& items)
399 {
400 return ContainerType{ items };
401 }
402};
403
404/*---------------------------------------------------------------------------*/
405/*---------------------------------------------------------------------------*/
406
407//! Spécialisation pour une vue sur un milieu et la maille globale associée
408template <>
410: public RunCommandConstituentItemTraitsBaseT<EnvAndGlobalCellRunCommand>
411{
412 public:
413
415 using BaseClass::createContainer;
416
417 static ContainerType createContainer(Arcane::Materials::IMeshEnvironment* env)
418 {
419 return ContainerType{ env->envView() };
420 }
421};
422
423/*---------------------------------------------------------------------------*/
424/*---------------------------------------------------------------------------*/
425
426//! Spécialisation pour une vue sur un matériau et la maille globale associée
427template <>
429: public RunCommandConstituentItemTraitsBaseT<MatAndGlobalCellRunCommand>
430{
431 public:
432
434 using BaseClass::createContainer;
435
436 static ContainerType createContainer(Arcane::Materials::IMeshMaterial* mat)
437 {
438 return ContainerType{ mat->matView() };
439 }
440};
441
442/*---------------------------------------------------------------------------*/
443/*---------------------------------------------------------------------------*/
444
445//! Spécialisation pour une vue sur les AllEvnCell
446template <>
451
452/*---------------------------------------------------------------------------*/
453/*---------------------------------------------------------------------------*/
454
455//! Spécialisation pour une vue sur un milieu.
456template <>
458: public RunCommandConstituentItemTraitsBaseT<EnvCellRunCommand>
459{
460 public:
461
463 using BaseClass::createContainer;
464
465 public:
466
467 static ContainerType createContainer(Arcane::Materials::IMeshEnvironment* env)
468 {
469 return ContainerType(env->envView());
470 }
471};
472
473/*---------------------------------------------------------------------------*/
474/*---------------------------------------------------------------------------*/
475
476//! Spécialisation pour une vue sur un matériau
477template <>
479: public RunCommandConstituentItemTraitsBaseT<MatCellRunCommand>
480{
481 public:
482
484 using BaseClass::createContainer;
485
486 static ContainerType createContainer(Arcane::Materials::IMeshMaterial* mat)
487 {
488 return ContainerType(mat->matView());
489 }
490};
491
492/*---------------------------------------------------------------------------*/
493/*---------------------------------------------------------------------------*/
494
495#if defined(ARCANE_COMPILING_CUDA) || defined(ARCANE_COMPILING_HIP)
496/*
497 * Surcharge de la fonction de lancement de kernel pour GPU pour les ComponentItemLocalId et CellLocalId
498 */
499template <typename ContainerType, typename Lambda, typename... RemainingArgs> __global__ void
500doMatContainerGPULambda(ContainerType items, Lambda func, RemainingArgs... remaining_args)
501{
502 auto privatizer = privatize(func);
503 auto& body = privatizer.privateCopy();
504
505 Int32 i = blockDim.x * blockIdx.x + threadIdx.x;
506 if (i < items.size()) {
507 body(items[i], remaining_args...);
508 }
510}
511
512#endif // ARCANE_COMPILING_CUDA || ARCANE_COMPILING_HIP
513
514/*---------------------------------------------------------------------------*/
515/*---------------------------------------------------------------------------*/
516
517#if defined(ARCANE_COMPILING_SYCL)
518
519template <typename ContainerType, typename Lambda, typename... RemainingArgs>
520class DoMatContainerSYCLLambda
521{
522 public:
523
524 void operator()(sycl::nd_item<1> x, ContainerType items, Lambda func, RemainingArgs... remaining_args) const
525 {
526 auto privatizer = privatize(func);
527 auto& body = privatizer.privateCopy();
528
529 Int32 i = static_cast<Int32>(x.get_global_id(0));
530 if (i < items.size()) {
531 body(items[i], remaining_args...);
532 }
533 KernelRemainingArgsHelper::applyRemainingArgs(x, remaining_args...);
534 }
535
536 void operator()(sycl::id<1> x, ContainerType items, Lambda func) const
537 {
538 auto privatizer = privatize(func);
539 auto& body = privatizer.privateCopy();
540
541 Int32 i = static_cast<Int32>(x);
542 if (i < items.size()) {
543 body(items[i]);
544 }
545 }
546};
547
548#endif
549
550/*---------------------------------------------------------------------------*/
551/*---------------------------------------------------------------------------*/
552
553template <typename ContainerType, typename Lambda, typename... RemainingArgs>
554void _doConstituentItemsLambda(Int32 base_index, Int32 size, ContainerType items,
555 const Lambda& func, RemainingArgs... remaining_args)
556{
557 auto privatizer = privatize(func);
558 auto& body = privatizer.privateCopy();
559
560 Int32 last_value = base_index + size;
561 for (Int32 i = base_index; i < last_value; ++i) {
562 body(items[i], remaining_args...);
563 }
565}
566
567/*---------------------------------------------------------------------------*/
568/*---------------------------------------------------------------------------*/
569
570template <typename TraitsType, typename... RemainingArgs>
572{
573 public:
574
575 using ContainerType = typename TraitsType::ContainerType;
576
577 public:
578
579 explicit GenericConstituentCommandArgs(const ContainerType& container, const RemainingArgs&... remaining_args)
580 : m_container(container)
581 , m_remaining_args(remaining_args...)
582 {}
583
584 public:
585
586 ContainerType m_container;
587 std::tuple<RemainingArgs...> m_remaining_args;
588};
589
590/*---------------------------------------------------------------------------*/
591/*---------------------------------------------------------------------------*/
592
593template <typename ConstituentCommandType, typename... RemainingArgs>
595{
596 public:
597
598 using ContainerType = typename ConstituentCommandType::Container;
599
600 public:
601
602 explicit GenericConstituentCommand(const ConstituentCommandType& command)
603 : m_command(command)
604 {}
605 explicit GenericConstituentCommand(const ConstituentCommandType& command, const std::tuple<RemainingArgs...>& remaining_args)
606 : m_command(command)
607 , m_remaining_args(remaining_args)
608 {}
609
610 public:
611
612 ConstituentCommandType m_command;
613 std::tuple<RemainingArgs...> m_remaining_args;
614};
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618/*!
619 * \brief Applique l'énumération \a func sur la liste d'entité \a items.
620 *
621 * Le conteneur peut être issu de:
622 * - EnvAndGlobalCellRunCommand
623 * - EnvCellRunCommand
624 * - MatAndGlobalCellRunCommand
625 * - MatCellRunCommand
626 */
627template <typename ContainerType, typename Lambda, typename... RemainingArgs> void
628_applyConstituentCells(RunCommand& command, ContainerType items, const Lambda& func, const RemainingArgs&... remaining_args)
629{
630 using namespace Arcane::Materials;
631 // TODO: fusionner la partie commune avec 'applyLoop'
632 Int32 vsize = items.size();
633 if (vsize == 0)
634 return;
635
636 RunCommandLaunchInfo launch_info(command, vsize);
637 const eExecutionPolicy exec_policy = launch_info.executionPolicy();
638 launch_info.beginExecute();
639 switch (exec_policy) {
641 _applyKernelCUDA(launch_info, ARCANE_KERNEL_CUDA_FUNC(doMatContainerGPULambda) < ContainerType, Lambda, RemainingArgs... >,
642 func, items, remaining_args...);
643 break;
645 _applyKernelHIP(launch_info, ARCANE_KERNEL_HIP_FUNC(doMatContainerGPULambda) < ContainerType, Lambda, RemainingArgs... >,
646 func, items, remaining_args...);
647 break;
649 _applyKernelSYCL(launch_info, ARCANE_KERNEL_SYCL_FUNC(impl::DoMatContainerSYCLLambda) < ContainerType, Lambda, RemainingArgs... > {},
650 func, items, remaining_args...);
651 break;
653 _doConstituentItemsLambda(0, vsize, items, func, remaining_args...);
654 break;
656 arcaneParallelFor(0, vsize, launch_info.loopRunInfo(),
657 [&](Int32 begin, Int32 size) {
658 _doConstituentItemsLambda(begin, size, items, func, remaining_args...);
659 });
660 break;
661 default:
662 ARCANE_FATAL("Invalid execution policy '{0}'", exec_policy);
663 }
664 launch_info.endExecute();
665}
666
667/*---------------------------------------------------------------------------*/
668/*---------------------------------------------------------------------------*/
669
670template <typename ConstituentCommandType, typename... RemainingArgs, typename Lambda>
671void operator<<(const GenericConstituentCommand<ConstituentCommandType, RemainingArgs...>& c, const Lambda& func)
672{
673 if constexpr (sizeof...(RemainingArgs) > 0) {
674 std::apply([&](auto... vs) {
675 impl::_applyConstituentCells(c.m_command.m_command, c.m_command.m_items, func, vs...);
676 },
677 c.m_remaining_args);
678 }
679 else
680 impl::_applyConstituentCells(c.m_command.m_command, c.m_command.m_items, func);
681}
682
683/*---------------------------------------------------------------------------*/
684/*---------------------------------------------------------------------------*/
685
686template <typename ConstituentItemType, typename ConstituentItemContainerType, typename... RemainingArgs> auto
687makeExtendedConstituentItemEnumeratorLoop(const ConstituentItemContainerType& container,
688 const RemainingArgs&... remaining_args)
689{
690 using TraitsType = RunCommandConstituentItemEnumeratorTraitsT<ConstituentItemType>;
691 return GenericConstituentCommandArgs<TraitsType, RemainingArgs...>(TraitsType::createContainer(container), remaining_args...);
692}
693
694/*---------------------------------------------------------------------------*/
695/*---------------------------------------------------------------------------*/
696
697} // namespace Arcane::Accelerator::impl
698
699/*---------------------------------------------------------------------------*/
700/*---------------------------------------------------------------------------*/
701
702namespace Arcane::Accelerator
703{
704
705/*---------------------------------------------------------------------------*/
706/*---------------------------------------------------------------------------*/
707
708template <typename TraitsType, typename... RemainingArgs> auto
709operator<<(RunCommand& command, const impl::GenericConstituentCommandArgs<TraitsType, RemainingArgs...>& args)
710{
711 using CommandType = typename TraitsType::CommandType;
712 using GenericCommandType = impl::GenericConstituentCommand<CommandType, RemainingArgs...>;
713 return GenericCommandType(CommandType::create(command, args.m_container), args.m_remaining_args);
714}
715
716/*---------------------------------------------------------------------------*/
717/*---------------------------------------------------------------------------*/
718
719// TODO: rendre obsolète (il faut utiliser la version générique)
720inline auto
722{
723 using CommandType = impl::MatAndGlobalCellRunCommand;
724 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
725}
726
727/*---------------------------------------------------------------------------*/
728/*---------------------------------------------------------------------------*/
729
730// TODO: rendre obsolète (il faut utiliser la version générique)
731inline auto
733{
734 using CommandType = impl::EnvAndGlobalCellRunCommand;
735 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
736}
737
738/*---------------------------------------------------------------------------*/
739/*---------------------------------------------------------------------------*/
740
741// TODO: rendre obsolète (il faut utiliser la version générique)
742inline auto
744{
745 using CommandType = impl::EnvCellRunCommand;
746 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
747}
748
749/*---------------------------------------------------------------------------*/
750/*---------------------------------------------------------------------------*/
751
752// TODO: rendre obsolète (il faut utiliser la version générique)
753inline auto
755{
756 using CommandType = impl::MatCellRunCommand;
757 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
758}
759
760/*---------------------------------------------------------------------------*/
761/*---------------------------------------------------------------------------*/
762
763} // End namespace Arcane::Accelerator
764
765/*---------------------------------------------------------------------------*/
766/*---------------------------------------------------------------------------*/
767
768/*!
769 * \brief Macro pour itérer sur un matériau ou un milieu
770 *
771 * \param ConstituentItemNameType est le type de l'énumérateur.
772 * \param iter_name est le nom de l'itérateur
773 * \param env_or_mat_container est le conteneur sur lequel on itère.
774 *
775 * Les paramètres supplémentaires sont utilisés pour les réductions
776 * (voir \ref arcanedoc_acceleratorapi_reduction)
777 *
778 * \a ConstituentItemNameType doit être une des valeurs suivantes:
779 *
780 * - EnvAndGlobalCell
781 * - EnvCell
782 * - MatAndGlobalCell
783 * - MatCell
784 * - AllEnvCell
785 *
786 * Voir \ref arcanedoc_acceleratorapi_materials pour plus d'informations.
787 */
788#define RUNCOMMAND_MAT_ENUMERATE(ConstituentItemNameType, iter_name, env_or_mat_container, ...) \
789 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedConstituentItemEnumeratorLoop<ConstituentItemNameType>(env_or_mat_container __VA_OPT__(, __VA_ARGS__)) \
790 << [=] ARCCORE_HOST_DEVICE(::Arcane::Accelerator::impl::RunCommandConstituentItemEnumeratorTraitsT<ConstituentItemNameType>::IteratorValueType iter_name \
791 __VA_OPT__(ARCANE_RUNCOMMAND_REDUCER_FOR_EACH(__VA_ARGS__)))
792
793/*---------------------------------------------------------------------------*/
794/*---------------------------------------------------------------------------*/
795
796#endif
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classes, Types et macros pour gérer la concurrence.
void _applyConstituentCells(RunCommand &command, ContainerType items, const Lambda &func, const RemainingArgs &... remaining_args)
Applique l'énumération func sur la liste d'entité items.
Gestion d'une commande sur accélérateur.
Conteneur contenant les informations nécessaires pour la commande.
__host__ __device__ IteratorValueType operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Conteneur contenant les informations nécessaires pour la commande.
constexpr __host__ __device__ IteratorValueType operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Classe pour les commandes MatAndGlobalCell et EnvAndGlobalCell.
Conteneur contenant les informations nécessaires pour la commande.
constexpr __host__ __device__ IteratorValueType operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Commande pour itérer sur les EnvCell ou MatCell.
static ARCCORE_DEVICE void applyRemainingArgs(Int32 index, RemainingArgs &... remaining_args)
Applique les fonctors des arguments additionnels.
Caractéristiques d'un énumérateur d'une commande sur les matériaux/milieux.
Classe de base des caractéristiques des commandes sur les constituants.
void beginExecute()
Indique qu'on commence l'exécution de la commande.
void endExecute()
Signale la fin de l'exécution.
const ForLoopRunInfo & loopRunInfo() const
Informations d'exécution de la boucle.
constexpr __host__ __device__ Integer size() const
Nombre d'éléments.
Maille arcane avec info matériaux et milieux.
Vue sur un vecteur sur les entités d'un composant.
Integer nbItem() const
Nombre d'entités dans la vue.
Index d'une boucle accélérateur sur les matériaux ou milieux.
constexpr __host__ __device__ Int32 index() const
Index de l'itération courante.
constexpr __host__ __device__ CellLocalId globalCellId() const
Accesseur sur la partie cell local id.
constexpr __host__ __device__ Data operator()()
Cet opérateur permet de renvoyer le couple [ConstituentItemLocalIdType, CellLocalId].
constexpr __host__ __device__ ConstituentItemLocalIdType varIndex() const
Accesseur sur la partie MatVarIndex.
Index d'un ConstituentItem dans une variable.
Maille arcane d'un milieu.
virtual EnvItemVectorView envView() const =0
Vue associée à ce milieu.
Interface d'un matériau d'un maillage.
virtual MatItemVectorView matView() const =0
Vue associée à ce matériau.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
static void applyReducerArgs(ReducerArgs &... reducer_args)
Applique les fonctors des arguments additionnels.
Vue d'un tableau d'éléments de type T.
Definition Span.h:670
void arcaneParallelFor(Integer i0, Integer size, InstanceType *itype, void(InstanceType::*lambda_function)(Integer i0, Integer size))
Applique en concurrence la fonction lambda lambda_function sur l'intervalle d'itération [i0,...
Espace de nom pour l'utilisation des accélérateurs.
std::ostream & operator<<(std::ostream &o, eExecutionPolicy exec_policy)
Affiche le nom de la politique d'exécution.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.
Active toujours les traces dans les parties Arcane concernant les matériaux.
ConstituentAndGlobalCellIteratorValue< EnvItemLocalId > EnvAndGlobalCellIteratorValue
Type de la valeur de l'itérateur pour RUNCOMMAND_MAT_ENUMERATE(EnvAndGlobalCell,.....
ConstituentAndGlobalCellIteratorValue< MatItemLocalId > MatAndGlobalCellIteratorValue
Type de la valeur de l'itérateur pour RUNCOMMAND_MAT_ENUMERATE(MatAndGlobalCell,.....
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.
std::int32_t Int32
Type entier signé sur 32 bits.
Struct interne simple pour éviter l'usage d'un std::tuple pour l'opérateur()