12#ifndef ARCANE_ACCELERATOR_RUNCOMMANDENUMERATE_H
13#define ARCANE_ACCELERATOR_RUNCOMMANDENUMERATE_H
17#include "arcane/accelerator/RunCommand.h"
18#include "arcane/accelerator/KernelLauncher.h"
21#include "arcane/core/ItemGroup.h"
40class IteratorWithIndex
45 constexpr ARCCORE_HOST_DEVICE IteratorWithIndex(
Int32 i, T v)
52 constexpr ARCCORE_HOST_DEVICE
Int32 index()
const {
return m_index; }
53 constexpr ARCCORE_HOST_DEVICE T value()
const {
return m_value; }
93 constexpr ARCCORE_HOST_DEVICE
static T create(
Int32, T value)
104namespace Arcane::Accelerator::impl
117 || std::derived_from<T, ItemLocalId>
118 || std::derived_from<T, IteratorWithIndexBase>;
137 using ItemType =
typename ItemLocalIdT<T>::ItemType;
148 using ItemType =
typename T::ItemType;
165template <
typename ItemType>
166class RunCommandItemContainer
171 : m_item_group(group)
175 : m_item_vector_view(item_vector_view)
176 , m_unpadded_vector_view(item_vector_view)
182 Int32 size()
const {
return m_unpadded_vector_view.size(); }
186 if (!m_item_group.null())
187 return m_item_group._paddedView();
188 return m_item_vector_view;
209template <RunCommandEnumerateIteratorConcept IteratorValueType_>
210class RunCommandItemEnumeratorTraitsT
215 using ItemType =
typename SubTraitsType::ItemType;
217 using ValueType =
typename SubTraitsType::ValueType;
219 using BuilderType =
typename SubTraitsType::BuilderType;
224 : m_item_container(group)
227 : m_item_container(vector_view)
239template <
typename TraitsType,
typename ContainerType,
typename Lambda,
typename... ReducerArgs>
240void _doItemsLambda(
Int32 base_index,
ContainerType sub_items,
const Lambda& func, ReducerArgs... reducer_args)
242 using ItemType =
typename TraitsType::ItemType;
243 using BuilderType =
typename TraitsType::BuilderType;
244 using LocalIdType =
typename BuilderType::ValueType;
245 auto privatizer = privatize(func);
246 auto& body = privatizer.privateCopy();
249 body(BuilderType::create(iitem.index() + base_index,
LocalIdType(iitem.itemLocalId())), reducer_args...);
259template <
typename TraitsType,
typename Lambda,
typename... ReducerArgs>
void
261 const Lambda& func,
const ReducerArgs&... reducer_args)
267 using ItemType =
typename TraitsType::ItemType;
272 switch (exec_policy) {
274 _applyKernelCUDA(launch_info, ARCANE_KERNEL_CUDA_FUNC(doIndirectGPULambda2) < TraitsType, Lambda, ReducerArgs... >, func, ids, reducer_args...);
277 _applyKernelHIP(launch_info, ARCANE_KERNEL_HIP_FUNC(doIndirectGPULambda2) < TraitsType, Lambda, ReducerArgs... >, func, ids, reducer_args...);
280 _applyKernelSYCL(launch_info, ARCANE_KERNEL_SYCL_FUNC(impl::DoIndirectSYCLLambda) < TraitsType, Lambda, ReducerArgs... > {}, func, ids, reducer_args...);
283 impl::_doItemsLambda<TraitsType>(0, items.paddedView(), func, reducer_args...);
288 impl::_doItemsLambda<TraitsType>(base_index, sub_items, func, reducer_args...);
292 ARCANE_FATAL(
"Invalid execution policy '{0}'", exec_policy);
300template <
typename TraitsType,
typename... ReducerArgs>
301class ItemRunCommandArgs
305 ItemRunCommandArgs(
const TraitsType& traits,
const ReducerArgs&... reducer_args)
307 , m_reducer_args(reducer_args...)
314 std::tuple<ReducerArgs...> m_reducer_args;
328template <
typename TraitsType,
typename Lambda>
void
329run(
RunCommand& command,
const TraitsType& traits,
const Lambda& func)
337template <
typename TraitsType,
typename... ReducerArgs>
342 ItemRunCommand(
RunCommand& command,
const TraitsType& traits)
348 ItemRunCommand(
RunCommand& command,
const TraitsType& traits,
const std::tuple<ReducerArgs...>& reducer_args)
351 , m_reducer_args(reducer_args)
359 std::tuple<ReducerArgs...> m_reducer_args;
365template <
typename ItemType>
auto
376template <
typename ItemType>
auto
379 using TraitsType = impl::RunCommandItemEnumeratorTraitsT<ItemType>;
385template <
typename ItemType>
auto
386operator<<(RunCommand& command,
const ItemGroupT<ItemType>& items)
388 using TraitsType = impl::RunCommandItemEnumeratorTraitsT<ItemType>;
389 return ItemRunCommand<TraitsType>(command, TraitsType(items));
392template <
typename TraitsType,
typename Lambda>
395 run(nr.m_command, nr.m_traits, f);
398template <
typename TraitsType,
typename... ReducerArgs>
auto
401 return ItemRunCommand<TraitsType, ReducerArgs...>(command, args.m_traits, args.m_reducer_args);
404template <
typename TraitsType,
typename Lambda,
typename... ReducerArgs>
407 if constexpr (
sizeof...(ReducerArgs) > 0) {
411 run(nr.m_command, nr.m_traits, f);
419namespace Arcane::Accelerator::impl
425template <
typename ItemTypeName,
typename ItemContainerType,
typename... ReducerArgs>
auto
426makeExtendedItemEnumeratorLoop(
const ItemContainerType& container_type,
427 const ReducerArgs&... reducer_args)
430 return ItemRunCommandArgs<TraitsType, ReducerArgs...>(TraitsType(container_type), reducer_args...);
459#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group, ...) \
460 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedItemEnumeratorLoop<ItemTypeName>(item_group __VA_OPT__(, __VA_ARGS__)) \
461 << [=] ARCCORE_HOST_DEVICE(::Arcane::Accelerator::impl::RunCommandItemEnumeratorTraitsT<ItemTypeName>::ValueType iter_name \
462 __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.
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.
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.
Référence à un groupe d'un genre donné.
ItemVectorView _unpaddedView() const
Vue sur les entités du groupe sans padding pour la vectorisation.
Index d'une entité ItemType dans une variable.
Caractéristiques des éléments du maillage.
Vue sur un tableau typé d'entités.
Vue sur un vecteur d'entités.
Classe de base pour un itérateur permettant de conserver l'index de l'itération.
Vue d'un tableau d'éléments de type T.
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 Integer
Type représentant un entier.
std::int32_t Int32
Type entier signé sur 32 bits.