Arcane  v3.15.0.0
Documentation développeur
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
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
44template <typename ConstituentItemLocalIdType_>
46{
47 public:
48
52
53 public:
54
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
68 CellLocalId m_cid;
69 };
70
71 public:
72
74 : m_internal_data{ mvi, cid }
75 , m_index(index)
76 {
77 }
78
97 constexpr ARCCORE_HOST_DEVICE Data operator()()
98 {
99 return m_internal_data;
100 }
101
103 constexpr ARCCORE_HOST_DEVICE ConstituentItemLocalIdType varIndex() const { return m_internal_data.m_mvi; };
104
106 constexpr ARCCORE_HOST_DEVICE CellLocalId globalCellId() const { return m_internal_data.m_cid; }
107
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
119
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126} // namespace Arcane::Materials
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
131namespace Arcane::Accelerator::impl
132{
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
140{
142
143 public:
144
147
148 public:
149
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
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/*---------------------------------------------------------------------------*/
238template <typename ConstituentItemLocalIdType_, typename ContainerCreateViewType_>
240{
241 public:
242
244 using CommandType = ThatClass;
247
248 public:
249
255 {
256 public:
257
260 {
261 }
262
263 public:
264
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/*---------------------------------------------------------------------------*/
302template <typename ConstituentItemLocalIdType_, typename ContainerCreateViewType_>
304{
305 public:
306
308 using CommandType = ThatClass;
311
312 public:
313
319 {
320 public:
321
324 {
325 }
326
327 public:
328
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/*---------------------------------------------------------------------------*/
378template <typename MatItemType>
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
386template <typename CommandType_>
388{
389 public:
390
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
408template <>
410: public RunCommandConstituentItemTraitsBaseT<EnvAndGlobalCellRunCommand>
411{
412 public:
413
415 using BaseClass::createContainer;
416
418 {
419 return ContainerType{ env->envView() };
420 }
421};
422
423/*---------------------------------------------------------------------------*/
424/*---------------------------------------------------------------------------*/
425
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
446template <>
451
452/*---------------------------------------------------------------------------*/
453/*---------------------------------------------------------------------------*/
454
456template <>
458: public RunCommandConstituentItemTraitsBaseT<EnvCellRunCommand>
459{
460 public:
461
463 using BaseClass::createContainer;
464
465 public:
466
468 {
469 return ContainerType(env->envView());
470 }
471};
472
473/*---------------------------------------------------------------------------*/
474/*---------------------------------------------------------------------------*/
475
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
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>
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
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/*---------------------------------------------------------------------------*/
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>
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,
689{
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
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.
ARCCORE_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 ARCCORE_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 ARCCORE_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.
Object temporaire pour conserver les informations d'exécution d'une commande et regrouper les tests.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Vue sur une liste de mailles avec infos sur les milieux.
constexpr ARCCORE_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.
ConstArrayView< Int32 > _internalLocalIds() const
Tableau des localId() des entités associées.
Integer nbItem() const
Nombre d'entités dans la vue.
Index d'une boucle accélérateur sur les matériaux ou milieux.
constexpr ARCCORE_HOST_DEVICE ConstituentItemLocalIdType varIndex() const
Accesseur sur la partie MatVarIndex.
constexpr ARCCORE_HOST_DEVICE CellLocalId globalCellId() const
Accesseur sur la partie cell local id.
constexpr ARCCORE_HOST_DEVICE Int32 index() const
Index de l'itération courante.
constexpr ARCCORE_HOST_DEVICE Data operator()()
Cet opérateur permet de renvoyer le couple [ConstituentItemLocalIdType, CellLocalId].
Index d'un ConstituentItem dans une variable.
Maille arcane d'un milieu.
Interface d'un matériau d'un maillage.
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.
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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()