12#ifndef ARCANE_ACCELERATOR_RUNCOMMANDMATERIALENUMERATE_H
13#define ARCANE_ACCELERATOR_RUNCOMMANDMATERIALENUMERATE_H
17#include "arcane/utils/ArcaneCxx20.h"
20#include "arcane/core/materials/ComponentItemVectorView.h"
21#include "arcane/core/materials/MaterialsCoreGlobal.h"
22#include "arcane/core/materials/MatItem.h"
25#include "arcane/accelerator/KernelLauncher.h"
26#include "arcane/accelerator/RunCommand.h"
27#include "arcane/accelerator/RunCommandLaunchInfo.h"
44template <
typename ConstituentItemLocalIdType_>
49 using ConstituentItemLocalIdType = ConstituentItemLocalIdType_;
60 constexpr ARCCORE_HOST_DEVICE
Data(ConstituentItemLocalIdType mvi,
CellLocalId cid)
67 ConstituentItemLocalIdType m_mvi;
74 : m_internal_data{ mvi, cid }
99 return m_internal_data;
103 constexpr ARCCORE_HOST_DEVICE ConstituentItemLocalIdType
varIndex()
const {
return m_internal_data.m_mvi; };
109 constexpr ARCCORE_HOST_DEVICE Int32
index()
const {
return m_index; }
113 Data m_internal_data;
131namespace Arcane::Accelerator::impl
165 constexpr ARCCORE_HOST_DEVICE
Int32 size()
const {
return m_view.
size(); }
188 explicit AllEnvCellRunCommand(
RunCommand& command,
const Container& items)
216 m_nb_item = m_items.
nbItem();
217 m_matvar_indexes = m_items._matvarIndexes();
218 m_global_cells_local_id = m_items._internalLocalIds();
223 constexpr ARCCORE_HOST_DEVICE
Int32 size()
const {
return m_nb_item; }
238template <
typename ConstituentItemLocalIdType_,
typename ContainerCreateViewType_>
244 using CommandType = ThatClass;
245 using IteratorValueType = ConstituentItemLocalIdType_;
246 using ContainerCreateViewType = ContainerCreateViewType_;
258 explicit Container(ContainerCreateViewType view)
274 static CommandType create(
RunCommand& run_command,
const Container& items)
276 return CommandType(run_command, items);
282 explicit ConstituentRunCommandBase(
RunCommand& command,
const Container& items)
294using EnvCellRunCommand = ConstituentRunCommandBase<Arcane::Materials::EnvItemLocalId, Arcane::Materials::EnvCellVectorView>;
295using MatCellRunCommand = ConstituentRunCommandBase<Arcane::Materials::MatItemLocalId, Arcane::Materials::MatCellVectorView>;
302template <
typename ConstituentItemLocalIdType_,
typename ContainerCreateViewType_>
308 using CommandType = ThatClass;
310 using ContainerCreateViewType = ContainerCreateViewType_;
322 explicit Container(ContainerCreateViewType view)
338 static CommandType create(
RunCommand& run_command,
const Container& items)
340 return CommandType(run_command, items);
346 explicit ConstituentAndGlobalCellRunCommandBase(
RunCommand& command,
const Container& items)
361using EnvAndGlobalCellRunCommand = ConstituentAndGlobalCellRunCommandBase<Arcane::Materials::EnvItemLocalId, Arcane::Materials::EnvCellVectorView>;
362using MatAndGlobalCellRunCommand = ConstituentAndGlobalCellRunCommandBase<Arcane::Materials::MatItemLocalId, Arcane::Materials::MatCellVectorView>;
378template <
typename MatItemType>
386template <
typename CommandType_>
391 using CommandType = CommandType_;
392 using IteratorValueType = CommandType::IteratorValueType;
393 using ContainerType = CommandType::Container;
394 using ContainerCreateViewType = CommandType::ContainerCreateViewType;
398 static ContainerType createContainer(
const ContainerCreateViewType& items)
400 return ContainerType{ items };
415 using BaseClass::createContainer;
434 using BaseClass::createContainer;
463 using BaseClass::createContainer;
484 using BaseClass::createContainer;
495#if defined(ARCANE_COMPILING_CUDA) || defined(ARCANE_COMPILING_HIP)
499template <
typename ContainerType,
typename Lambda,
typename... RemainingArgs> __global__
void
500doMatContainerGPULambda(ContainerType items, Lambda func, RemainingArgs... remaining_args)
502 auto privatizer = privatize(func);
503 auto& body = privatizer.privateCopy();
505 Int32 i = blockDim.x * blockIdx.x + threadIdx.x;
506 if (i < items.size()) {
507 body(items[i], remaining_args...);
517#if defined(ARCANE_COMPILING_SYCL)
519template <
typename ContainerType,
typename Lambda,
typename... RemainingArgs>
520class DoMatContainerSYCLLambda
524 void operator()(sycl::nd_item<1> x, ContainerType items, Lambda func, RemainingArgs... remaining_args)
const
526 auto privatizer = privatize(func);
527 auto& body = privatizer.privateCopy();
529 Int32 i =
static_cast<Int32>(x.get_global_id(0));
530 if (i < items.size()) {
531 body(items[i], remaining_args...);
533 KernelRemainingArgsHelper::applyRemainingArgs(x, remaining_args...);
536 void operator()(sycl::id<1> x, ContainerType items, Lambda func)
const
538 auto privatizer = privatize(func);
539 auto& body = privatizer.privateCopy();
541 Int32 i =
static_cast<Int32
>(x);
542 if (i < items.size()) {
553template <
typename ContainerType,
typename Lambda,
typename... RemainingArgs>
554void _doConstituentItemsLambda(Int32 base_index, Int32 size, ContainerType items,
555 const Lambda& func, RemainingArgs... remaining_args)
557 auto privatizer = privatize(func);
558 auto& body = privatizer.privateCopy();
560 Int32 last_value = base_index + size;
561 for (Int32 i = base_index; i < last_value; ++i) {
562 body(items[i], remaining_args...);
570template <
typename TraitsType,
typename... RemainingArgs>
575 using ContainerType =
typename TraitsType::ContainerType;
580 : m_container(container)
581 , m_remaining_args(remaining_args...)
586 ContainerType m_container;
587 std::tuple<RemainingArgs...> m_remaining_args;
593template <
typename ConstituentCommandType,
typename... RemainingArgs>
598 using ContainerType =
typename ConstituentCommandType::Container;
605 explicit GenericConstituentCommand(
const ConstituentCommandType& command,
const std::tuple<RemainingArgs...>& remaining_args)
607 , m_remaining_args(remaining_args)
612 ConstituentCommandType m_command;
613 std::tuple<RemainingArgs...> m_remaining_args;
627template <
typename ContainerType,
typename Lambda,
typename... RemainingArgs>
void
632 Int32 vsize = items.size();
639 switch (exec_policy) {
641 _applyKernelCUDA(launch_info, ARCANE_KERNEL_CUDA_FUNC(doMatContainerGPULambda) < ContainerType, Lambda, RemainingArgs... >,
642 func, items, remaining_args...);
645 _applyKernelHIP(launch_info, ARCANE_KERNEL_HIP_FUNC(doMatContainerGPULambda) < ContainerType, Lambda, RemainingArgs... >,
646 func, items, remaining_args...);
649 _applyKernelSYCL(launch_info, ARCANE_KERNEL_SYCL_FUNC(impl::DoMatContainerSYCLLambda) < ContainerType, Lambda, RemainingArgs... > {},
650 func, items, remaining_args...);
653 _doConstituentItemsLambda(0, vsize, items, func, remaining_args...);
658 _doConstituentItemsLambda(begin, size, items, func, remaining_args...);
662 ARCANE_FATAL(
"Invalid execution policy '{0}'", exec_policy);
670template <
typename ConstituentCommandType,
typename... RemainingArgs,
typename Lambda>
671void operator<<(
const GenericConstituentCommand<ConstituentCommandType, RemainingArgs...>& c,
const Lambda& func)
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...);
680 impl::_applyConstituentCells(c.m_command.m_command, c.m_command.m_items, func);
686template <
typename ConstituentItemType,
typename ConstituentItemContainerType,
typename... RemainingArgs>
auto
687makeExtendedConstituentItemEnumeratorLoop(
const ConstituentItemContainerType& container,
688 const RemainingArgs&... remaining_args)
690 using TraitsType = RunCommandConstituentItemEnumeratorTraitsT<ConstituentItemType>;
691 return GenericConstituentCommandArgs<TraitsType, RemainingArgs...>(TraitsType::createContainer(container), remaining_args...);
708template <
typename TraitsType,
typename... RemainingArgs>
auto
709operator<<(
RunCommand& command,
const impl::GenericConstituentCommandArgs<TraitsType, RemainingArgs...>& args)
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);
723 using CommandType = impl::MatAndGlobalCellRunCommand;
724 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
734 using CommandType = impl::EnvAndGlobalCellRunCommand;
735 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
745 using CommandType = impl::EnvCellRunCommand;
746 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
756 using CommandType = impl::MatCellRunCommand;
757 return impl::GenericConstituentCommand<CommandType>(CommandType::create(command, view));
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__)))
#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.
Commande pour itérer sur les AllEnvCell.
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.
Interface d'un milieu d'un maillage.
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.
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()