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/RunQueueInternal.h"
26#include "arcane/accelerator/RunCommand.h"
27#include "arcane/accelerator/RunCommandLaunchInfo.h"
32namespace Arcane::Accelerator::impl
53 constexpr ARCCORE_HOST_DEVICE
Int32 size()
const {
return m_nb_item; }
66 m_nb_item = m_items.
nbItem();
67 m_matvar_indexes = m_items._matvarIndexes();
68 m_global_cells_local_id = m_items._internalLocalIds();
80template <
typename MatItemType>
120 ARCCORE_HOST_DEVICE
Int32 size()
const {
return m_view.
size(); }
315 : m_internal_data{ mvi, cid }
335 return { m_internal_data.m_mvi, m_internal_data.m_cid };
349 Data m_internal_data;
438 : m_internal_data{ mvi, cid }
458 return { m_internal_data.m_mvi, m_internal_data.m_cid };
472 Data m_internal_data;
648#if defined(ARCANE_COMPILING_CUDA) || defined(ARCANE_COMPILING_HIP)
652template <
typename ContainerType,
typename Lambda,
typename... ReducerArgs> __global__
void
653doMatContainerGPULambda(ContainerType items, Lambda func, ReducerArgs... reducer_args)
655 auto privatizer = privatize(func);
656 auto& body = privatizer.privateCopy();
658 Int32 i = blockDim.x * blockIdx.x + threadIdx.x;
659 if (i < items.size()) {
660 body(items[i], reducer_args...);
670#if defined(ARCANE_COMPILING_SYCL)
672template <
typename ContainerType,
typename Lambda,
typename... ReducerArgs>
673class DoMatContainerSYCLLambda
677 void operator()(sycl::nd_item<1> x, ContainerType items, Lambda func, ReducerArgs... reducer_args)
const
679 auto privatizer = privatize(func);
680 auto& body = privatizer.privateCopy();
682 Int32 i =
static_cast<Int32>(x.get_global_id(0));
683 if (i < items.size()) {
684 body(items[i], reducer_args...);
686 KernelReducerHelper::applyReducerArgs(x, reducer_args...);
688 void operator()(sycl::id<1> x, ContainerType items, Lambda func)
const
690 auto privatizer = privatize(func);
691 auto& body = privatizer.privateCopy();
693 Int32 i =
static_cast<Int32
>(x);
694 if (i < items.size()) {
705template <
typename ContainerType,
typename Lambda,
typename... ReducerArgs>
706void _doMatItemsLambda(Int32 base_index, Int32 size, ContainerType items,
const Lambda& func, ReducerArgs... reducer_args)
708 auto privatizer = privatize(func);
709 auto& body = privatizer.privateCopy();
711 Int32 last_value = base_index + size;
712 for (Int32 i = base_index; i < last_value; ++i) {
713 body(items[i], reducer_args...);
721template <
typename TraitsType,
typename... ReducerArgs>
726 using ContainerType =
typename TraitsType::ContainerType;
727 using MatCommandType =
typename TraitsType::MatCommandType;
732 : m_container(container)
733 , m_reducer_args(reducer_args...)
738 ContainerType m_container;
739 std::tuple<ReducerArgs...> m_reducer_args;
745template <
typename MatCommandType,
typename... ReducerArgs>
750 using ContainerType =
typename MatCommandType::Container;
755 : m_mat_command(mat_command)
757 explicit GenericMatCommand(
const MatCommandType& mat_command,
const std::tuple<ReducerArgs...>& reducer_args)
758 : m_mat_command(mat_command)
759 , m_reducer_args(reducer_args)
764 MatCommandType m_mat_command;
765 std::tuple<ReducerArgs...> m_reducer_args;
779template <
typename ContainerType,
typename Lambda,
typename... ReducerArgs>
void
784 Int32 vsize = items.size();
792 switch (exec_policy) {
794 _applyKernelCUDA(launch_info, ARCANE_KERNEL_CUDA_FUNC(doMatContainerGPULambda) < ContainerType, Lambda, ReducerArgs... >, func, items, reducer_args...);
797 _applyKernelHIP(launch_info, ARCANE_KERNEL_HIP_FUNC(doMatContainerGPULambda) < ContainerType, Lambda, ReducerArgs... >, func, items, reducer_args...);
800 _applyKernelSYCL(launch_info, ARCANE_KERNEL_SYCL_FUNC(impl::DoMatContainerSYCLLambda) < ContainerType, Lambda, ReducerArgs... > {}, func, items, reducer_args...);
803 _doMatItemsLambda(0, vsize, items, func, reducer_args...);
808 _doMatItemsLambda(begin, size, items, func, reducer_args...);
812 ARCANE_FATAL(
"Invalid execution policy '{0}'", exec_policy);
820template <
typename MatCommandType,
typename... ReducerArgs,
typename Lambda>
821void operator<<(
const GenericMatCommand<MatCommandType, ReducerArgs...>& c,
const Lambda& func)
823 if constexpr (
sizeof...(ReducerArgs) > 0) {
824 std::apply([&](
auto... vs) { impl::_applyEnvCells(c.m_mat_command.m_command, c.m_mat_command.m_items, func, vs...); }, c.m_reducer_args);
827 impl::_applyEnvCells(c.m_mat_command.m_command, c.m_mat_command.m_items, func);
830template <
typename MatItemType,
typename MatItemContainerType,
typename... ReducerArgs>
auto
831makeExtendedMatItemEnumeratorLoop(
const MatItemContainerType& container,
832 const ReducerArgs&... reducer_args)
834 using TraitsType = RunCommandMatItemEnumeratorTraitsT<MatItemType>;
835 return GenericMatCommandArgs<TraitsType, ReducerArgs...>(TraitsType::createContainer(container), reducer_args...);
849template <
typename TraitsType,
typename... ReducerArgs>
auto
850operator<<(
RunCommand& command,
const impl::GenericMatCommandArgs<TraitsType, ReducerArgs...>& args)
852 using MatCommandType =
typename TraitsType::MatCommandType;
853 return impl::GenericMatCommand<MatCommandType, ReducerArgs...>(args.m_container.createCommand(command), args.m_reducer_args);
862 return impl::GenericMatCommand<impl::MatAndGlobalCellRunCommand>(view.createCommand(command));
871 return impl::GenericMatCommand<impl::EnvAndGlobalCellRunCommand>(view.createCommand(command));
880 return impl::GenericMatCommand<impl::EnvCellRunCommand>(view.createCommand(command));
889 return impl::GenericMatCommand<impl::MatCellRunCommand>(view.createCommand(command));
901#define RUNCOMMAND_MAT_ENUMERATE(MatItemNameType, iter_name, env_or_mat_vector, ...) \
902 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedMatItemEnumeratorLoop<MatItemNameType>(env_or_mat_vector __VA_OPT__(, __VA_ARGS__)) \
903 << [=] ARCCORE_HOST_DEVICE(::Arcane::Accelerator::impl::RunCommandMatItemEnumeratorTraitsT<MatItemNameType>::EnumeratorType iter_name \
904 __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 _applyEnvCells(RunCommand &command, ContainerType items, const Lambda &func, const ReducerArgs &... reducer_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__ AllEnvCell operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Commande pour itérer sur les AllEnvCell.
Classe helper pour l'accès au MatVarIndex et au CellLocalId à travers les RUNCOMMAND_MAT_ENUMERATE(En...
__host__ __device__ Int32 index() const
Index de l'itération courante.
__host__ __device__ Data operator()()
Cet opérateur permet de renvoyer le couple [MatVarIndex, LocalCellId].
__host__ __device__ CellLocalId globalCellId() const
Accesseur sur la partie cell local id.
__host__ __device__ ComponentItemLocalId varIndex() const
Accesseur sur la partie MatVarIndex.
Conteneur contenant les informations nécessaires pour la commande.
constexpr __host__ __device__ Accessor operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Commande pour itérer sur les EnvCell et récupérer aussi l'information sur la maille globale associée.
Conteneur contenant les informations nécessaires pour la commande.
constexpr __host__ __device__ ComponentItemLocalId operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Commande pour itérer sur les EnvCell.
static ARCCORE_DEVICE void applyReducerArgs(Int32 index, ReducerArgs &... reducer_args)
Applique les fonctors des arguments additionnels.
Classe helper pour l'accès au MatVarIndex et au CellLocalId à travers les RUNCOMMAND_MAT_ENUMERATE(En...
__host__ __device__ ComponentItemLocalId varIndex() const
! Accesseur sur la partie MatVarIndex
__host__ __device__ Int32 index() const
Index de l'itération courante.
__host__ __device__ CellLocalId globalCellId() const
! Accesseur sur la partie cell local id
__host__ __device__ Data operator()()
Cet opérateur permet de renvoyer le couple [MatVarIndex, LocalCellId].
Conteneur contenant les informations nécessaires pour la commande.
constexpr __host__ __device__ Accessor operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Commande pour itérer sur les MatCell et récupérer aussi l'information sur la maille globale associée.
Conteneur contenant les informations nécessaires pour la commande.
constexpr __host__ __device__ ComponentItemLocalId operator[](Int32 i) const
Accesseur pour le i-ème élément de la liste.
Commande pour itérer sur les MatCell.
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.
void computeLoopRunInfo()
Calcule la valeur de loopRunInfo()
Caractéristiques d'un énumérateur d'une commande sur les matériaux/milieux.
constexpr __host__ __device__ Integer size() const
Nombre d'éléments.
Maille arcane avec info matériaux et milieux.
Index d'un Item matériaux dans une variable.
Vue sur un vecteur sur les entités d'un composant.
Integer nbItem() const
Nombre d'entités dans la vue.
Maille arcane d'un milieu.
Vue sur un vecteur sur les entités 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.
Vue sur un vecteur sur les entités d'un 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.
EnvItemVectorView EnvCellVectorView
Type de la vue sur un EnvCellVector.
MatItemVectorView MatCellVectorView
Type de la vue sur un MatCellVector.
-*- 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()
Struct interne simple pour éviter l'usage d'un std::tuple pour l'opérateur()