12#ifndef ARCANE_ACCELERATOR_RUNCOMMANDENUMERATE_H
13#define ARCANE_ACCELERATOR_RUNCOMMANDENUMERATE_H
17#include "arcane/accelerator/RunCommand.h"
18#include "arcane/accelerator/RunQueueInternal.h"
20#include "arcane/utils/ArcaneCxx20.h"
23#include "arcane/core/ItemGroup.h"
54 constexpr ARCCORE_HOST_DEVICE Int32 index()
const {
return m_index; }
55 constexpr ARCCORE_HOST_DEVICE T value()
const {
return m_value; }
95 constexpr ARCCORE_HOST_DEVICE
static T create(Int32, T value)
106namespace Arcane::Accelerator::impl
119 || std::derived_from<T, ItemLocalId>
120 || std::derived_from<T, IteratorWithIndexBase>;
139 using ItemType =
typename ItemLocalIdT<T>::ItemType;
150 using ItemType =
typename T::ItemType;
167template <
typename ItemType>
173 : m_item_group(group)
174 , m_unpadded_vector_view(group._unpaddedView())
184 Int32 size()
const {
return m_unpadded_vector_view.size(); }
188 if (!m_item_group.
null())
190 return m_item_vector_view;
211template <RunCommandEnumerateIteratorConcept IteratorValueType_>
217 using ItemType =
typename SubTraitsType::ItemType;
219 using ValueType =
typename SubTraitsType::ValueType;
221 using BuilderType = SubTraitsType::BuilderType;
226 : m_item_container(group)
241template <
typename TraitsType,
typename ContainerType,
typename Lambda,
typename...
ReducerArgs>
244 using ItemType = TraitsType::ItemType;
245 using BuilderType = TraitsType::BuilderType;
269 using ItemType = TraitsType::ItemType;
286 impl::_doItemsLambda<TraitsType>(0, items.paddedView(),
func,
reducer_args...);
291 impl::_doItemsLambda<TraitsType>(base_index, sub_items, func, reducer_args...);
303template <
typename TraitsType,
typename...
ReducerArgs>
331template <
typename TraitsType,
typename Lambda>
void
334 impl::_applyItems<TraitsType>(command, traits.m_item_container,
func);
340template <
typename TraitsType,
typename...
ReducerArgs>
368template <
typename ItemType>
auto
379template <
typename ItemType>
auto
382 using TraitsType = impl::RunCommandItemEnumeratorTraitsT<ItemType>;
388template <
typename ItemType>
auto
389operator<<(RunCommand& command,
const ItemGroupT<ItemType>& items)
391 using TraitsType = impl::RunCommandItemEnumeratorTraitsT<ItemType>;
392 return ItemRunCommand<TraitsType>(command, TraitsType(items));
395template <
typename TraitsType,
typename Lambda>
396void operator<<(ItemRunCommand<TraitsType>& nr,
const Lambda& f)
398 run(nr.m_command, nr.m_traits, f);
401template <
typename TraitsType,
typename... ReducerArgs>
auto
402operator<<(RunCommand& command,
const impl::ItemRunCommandArgs<TraitsType, ReducerArgs...>& args)
404 return ItemRunCommand<TraitsType, ReducerArgs...>(command, args.m_traits, args.m_reducer_args);
407template <
typename TraitsType,
typename Lambda,
typename... ReducerArgs>
408void operator<<(ItemRunCommand<TraitsType, ReducerArgs...>&& nr,
const Lambda& f)
410 if constexpr (
sizeof...(ReducerArgs) > 0) {
411 std::apply([&](
auto... vs) { impl::_applyItems<TraitsType>(nr.m_command, nr.m_traits.m_item_container, f, vs...); }, nr.m_reducer_args);
414 run(nr.m_command, nr.m_traits, f);
422namespace Arcane::Accelerator::impl
428template <
typename ItemTypeName,
typename ItemContainerType,
typename... ReducerArgs>
auto
429makeExtendedItemEnumeratorLoop(
const ItemContainerType& container_type,
430 const ReducerArgs&... reducer_args)
432 using TraitsType = RunCommandItemEnumeratorTraitsT<ItemTypeName>;
433 return ItemRunCommandArgs<TraitsType, ReducerArgs...>(TraitsType(container_type), reducer_args...);
462#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group, ...) \
463 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedItemEnumeratorLoop<ItemTypeName>(item_group __VA_OPT__(, __VA_ARGS__)) \
464 << [=] ARCCORE_HOST_DEVICE(::Arcane::Accelerator::impl::RunCommandItemEnumeratorTraitsT<ItemTypeName>::ValueType iter_name \
465 __VA_OPT__(ARCANE_RUNCOMMAND_REDUCER_FOR_EACH(__VA_ARGS__)))
470#define RUNCOMMAND_ENUMERATE_EX(ItemTypeName, iter_name, item_group, ...) \
471 RUNCOMMAND_ENUMERATE (ItemTypeName, iter_name, item_group, __VA_ARGS__)
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classes, Types et macros pour gérer la concurrence.
Déclarations de types sur les entités.
void _applyItems(RunCommand &command, typename TraitsType::ContainerType items, const Lambda &func, const ReducerArgs &... reducer_args)
Applique l'enumération func sur la liste d'entité items.
Gestion d'une commande sur accélérateur.
Conteneur pour RunCommandEnumerate.
Template pour connaitre le type d'entité associé à T.
Caractéristiques d'un énumérateur d'une commande sur les entités.
Object temporaire pour conserver les informations d'exécution d'une commande et regrouper les tests.
ItemVectorView _paddedView() const
Vue sur les entités du groupe avec padding pour la vectorisation.
bool null() const
true is le groupe est le groupe nul
Index d'une entité ItemType dans une variable.
Caractéristiques des éléments du maillage.
Vue sur un vecteur d'entités.
Classe de base pour un itérateur permettant de conserver l'index de l'itération.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
static void applyReducerArgs(ReducerArgs &... reducer_args)
Applique les fonctors des arguments additionnels.
Concept pour contraintre les valeurs dans RUNCOMMAND_ENUMERATE.
void arcaneParallelForeach(const ItemVectorView &items_view, const ForLoopRunInfo &run_info, InstanceType *instance, void(InstanceType::*function)(ItemVectorViewT< ItemType > items))
Applique en concurrence la méthode function de l'instance instance sur la vue items_view avec les opt...
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 LocalIdType
Type des entiers utilisés pour stocker les identifiants locaux des entités.
Int32 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.