12#ifndef ARCANE_ACCELERATOR_RUNCOMMANDLOOP_H
13#define ARCANE_ACCELERATOR_RUNCOMMANDLOOP_H
20#include "arcane/accelerator/core/RunCommand.h"
21#include "arcane/accelerator/KernelLauncher.h"
26namespace Arcane::Accelerator::impl
44template <
typename LoopBoundType,
typename Lambda,
typename... RemainingArgs>
void
46 const Lambda& func,
const RemainingArgs&... other_args)
48 Int64 vsize = bounds.nbElement();
54 switch (exec_policy) {
56 _applyKernelCUDA(launch_info, ARCANE_KERNEL_CUDA_FUNC(Impl::doDirectGPULambdaArrayBounds2) < LoopBoundType, Lambda, RemainingArgs... >, func, bounds, other_args...);
59 _applyKernelHIP(launch_info, ARCANE_KERNEL_HIP_FUNC(Impl::doDirectGPULambdaArrayBounds2) < LoopBoundType, Lambda, RemainingArgs... >, func, bounds, other_args...);
62 _applyKernelSYCL(launch_info, ARCANE_KERNEL_SYCL_FUNC(Impl::DoDirectSYCLLambdaArrayBounds) < LoopBoundType, Lambda, RemainingArgs... > {}, func, bounds, other_args...);
71 ARCANE_FATAL(
"Invalid execution policy '{0}'", exec_policy);
84template <
typename LoopBoundType,
typename... RemainingArgs>
85class ArrayBoundRunCommand
89 ArrayBoundRunCommand(
RunCommand& command,
const LoopBoundType& bounds)
94 ArrayBoundRunCommand(
RunCommand& command,
const LoopBoundType& bounds,
const std::tuple<RemainingArgs...>& args)
97 , m_remaining_args(args)
101 LoopBoundType m_bounds;
102 std::tuple<RemainingArgs...> m_remaining_args;
110template <
typename LoopBoundType,
typename... RemainingArgs>
111class ExtendedArrayBoundLoop
115 ExtendedArrayBoundLoop(
const LoopBoundType& bounds, RemainingArgs... args)
117 , m_remaining_args(args...)
120 LoopBoundType m_bounds;
121 std::tuple<RemainingArgs...> m_remaining_args;
124template <
typename LoopBoundType,
typename... RemainingArgs>
auto
125makeExtendedArrayBoundLoop(
const LoopBoundType& bounds, RemainingArgs... args)
131template <
typename LoopBoundType,
typename... RemainingArgs>
auto
132makeExtendedLoop(
const LoopBoundType& bounds, RemainingArgs... args)
133-> ExtendedArrayBoundLoop<LoopBoundType, RemainingArgs...>
135 return ExtendedArrayBoundLoop<LoopBoundType, RemainingArgs...>(bounds, args...);
146template <
typename LoopBoundType,
typename Lambda,
typename... RemainingArgs>
void
148 const Lambda& func,
const std::tuple<RemainingArgs...>& other_args)
150 std::apply([&](
auto... vs) {
_applyGenericLoop(command, bounds, func, vs...); }, other_args);
165template <
typename ExtentType,
typename Lambda>
void
175template <
int N,
typename Lambda>
void
185template <
int N,
typename Lambda>
void
194template <
typename ExtentType>
auto
198 return { command, bounds };
201template <
typename LoopBoundType,
typename... RemainingArgs>
auto
205 return { command, ex_loop.m_bounds, ex_loop.m_remaining_args };
211 return { command, bounds };
217 return { command, bounds };
228namespace Arcane::Accelerator::impl
234template <
typename LoopBoundType,
typename Lambda,
typename... RemainingArgs>
237 if constexpr (
sizeof...(RemainingArgs) > 0) {
238 runExtended(nr.m_command, nr.m_bounds, f, nr.m_remaining_args);
241 run(nr.m_command, nr.m_bounds, f);
254#define RUNCOMMAND_LOOP(iter_name, bounds, ...) \
255 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedLoop(bounds __VA_OPT__(, __VA_ARGS__)) \
256 << [=] ARCCORE_HOST_DEVICE(typename decltype(bounds)::LoopIndexType iter_name __VA_OPT__(ARCANE_RUNCOMMAND_REDUCER_FOR_EACH(__VA_ARGS__)))
259#define RUNCOMMAND_LOOPN(iter_name, N, ...) \
260 A_FUNCINFO << Arcane::ArrayBounds<typename Arcane::MDDimType<N>::DimType>(__VA_ARGS__) << [=] ARCCORE_HOST_DEVICE(Arcane::MDIndex<N> iter_name)
263#define RUNCOMMAND_LOOP2(iter_name, x1, x2) \
264 A_FUNCINFO << Arcane::ArrayBounds<MDDim2>(x1, x2) << [=] ARCCORE_HOST_DEVICE(Arcane::MDIndex<2> iter_name)
267#define RUNCOMMAND_LOOP3(iter_name, x1, x2, x3) \
268 A_FUNCINFO << Arcane::ArrayBounds<MDDim3>(x1, x2, x3) << [=] ARCCORE_HOST_DEVICE(Arcane::MDIndex<3> iter_name)
271#define RUNCOMMAND_LOOP4(iter_name, x1, x2, x3, x4) \
272 A_FUNCINFO << Arcane::ArrayBounds<MDDim4>(x1, x2, x3, x4) << [=] ARCCORE_HOST_DEVICE(Arcane::MDIndex<4> iter_name)
282#define RUNCOMMAND_LOOP1(iter_name, x1, ...) \
283 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedArrayBoundLoop(::Arcane::SimpleForLoopRanges<1>(x1) __VA_OPT__(, __VA_ARGS__)) \
284 << [=] ARCCORE_HOST_DEVICE(Arcane::MDIndex<1> iter_name __VA_OPT__(ARCANE_RUNCOMMAND_REDUCER_FOR_EACH(__VA_ARGS__)))
289#define RUNCOMMAND_SINGLE(...) \
290 A_FUNCINFO << ::Arcane::Accelerator::impl::makeExtendedArrayBoundLoop(::Arcane::SimpleForLoopRanges<1>(1) __VA_OPT__(, __VA_ARGS__)) \
291 << [=] ARCCORE_HOST_DEVICE(Arcane::MDIndex<1> __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 _applyGenericLoop(RunCommand &command, LoopBoundType bounds, const Lambda &func, const RemainingArgs &... other_args)
Applique la lambda func sur une boucle bounds.
void runExtended(RunCommand &command, LoopBoundType bounds, const Lambda &func, const std::tuple< RemainingArgs... > &other_args)
Applique la lambda func sur l'intervalle d'itération donnée par bounds.
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.
Gestion d'une commande sur accélérateur.
Classe pour conserver les arguments d'une RunCommand.
Classe pour gérer les paramètres supplémentaires des commandes.
Interval d'itération complexe.
Interval d'itération simple.
Espace de nom pour l'utilisation des accélérateurs.
void arccoreParallelFor(WorkGroupLoopRange bounds, ForLoopRunInfo run_info, const Lambda &func, const RemainingArgs &... remaining_args)
Applique le fonctor func sur une boucle parallèle.
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.
void arcaneSequentialFor(WorkGroupLoopRange bounds, const Lambda &func, const RemainingArgs &... remaining_args)
Applique le fonctor func sur une boucle séqentielle.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.