12#ifndef ARCCORE_ACCELERATOR_COOPERATIVEWORKGROUPLOOPRANGE_H
13#define ARCCORE_ACCELERATOR_COOPERATIVEWORKGROUPLOOPRANGE_H
17#include "arccore/accelerator/WorkGroupLoopRange.h"
36 template<
typename T>
friend class CooperativeWorkGroupLoopContext;
59#if defined(ARCCORE_COMPILING_CUDA_OR_HIP)
67class CooperativeDeviceWorkItemGrid
79 __device__ CooperativeDeviceWorkItemGrid()
80 : m_grid_group(cooperative_groups::this_grid())
86 __device__ Int32 nbBlock()
const {
return m_grid_group.group_dim().x; }
89 __device__
void barrier() { m_grid_group.sync(); }
93 cooperative_groups::grid_group m_grid_group;
111template <
typename IndexType_>
123 using IndexType = IndexType_;
129 Int32 group_size,
Int32 nb_active_item, IndexType total_size)
130 : BaseClass(loop_index, group_index, group_size, nb_active_item, total_size)
137 : BaseClass(total_size)
142#if defined(ARCCORE_DEVICE_CODE) && !defined(ARCCORE_COMPILING_SYCL)
144 __device__ CooperativeDeviceWorkItemGrid
grid()
const {
return CooperativeDeviceWorkItemGrid{}; }
156#if defined(ARCCORE_COMPILING_SYCL)
161class SyclCooperativeDeviceWorkItemGrid
167 explicit SyclCooperativeDeviceWorkItemGrid(sycl::nd_item<1> n)
175 Int32 nbBlock()
const {
return static_cast<Int32
>(m_nd_item.get_group_range(0)); }
182 sycl::nd_item<1> m_nd_item;
193template <
typename IndexType_>
197 friend CooperativeWorkGroupLoopRange<IndexType_>;
198 friend Impl::WorkGroupLoopContextBuilder;
202 using IndexType = IndexType_;
207 explicit SyclCooperativeWorkGroupLoopContext(sycl::nd_item<1> nd_item, IndexType total_size)
208 : SyclWorkGroupLoopContextBase<IndexType_>(nd_item, total_size)
215 SyclCooperativeDeviceWorkItemGrid grid()
const
217 return SyclCooperativeDeviceWorkItemGrid(this->m_nd_item);
234template <
typename IndexType_>
235class CooperativeWorkGroupLoopRange
236:
public WorkGroupLoopRangeBase<IndexType_>
241 using IndexType = IndexType_;
244 static constexpr bool isCooperativeLaunch() {
return true; }
248 CooperativeWorkGroupLoopRange() =
default;
249 explicit CooperativeWorkGroupLoopRange(IndexType total_nb_element)
250 : WorkGroupLoopRangeBase<IndexType_>(total_nb_element)
Gère une grille de WorkItem dans un CooperativeWorkGroupLoopRange pour l'hôte.
CooperativeHostWorkItemGrid()
Constructeur pour l'hôte.
Int32 nbBlock() const
Nombre de blocs dans la grille.
void barrier()
Bloque tant que tous les WorkItem de la grille ne sont pas arrivés ici.
Contexte d'exécution d'une commande sur un ensemble de blocs.
constexpr CooperativeWorkGroupLoopContext(IndexType loop_index, Int32 group_index, Int32 group_size, Int32 nb_active_item, IndexType total_size)
Ce constructeur est utilisé dans l'implémentation hôte.
CooperativeHostWorkItemGrid grid() const
Groupe courant.
Intervalle d'itération d'une boucle utilisant le parallélisme hiérarchique collaboratif.
Classe pour exécuter en séquentiel sur l'hôte une partie de la boucle.
constexpr WorkGroupLoopContextBase(IndexType loop_index, Int32 group_index, Int32 group_size, Int32 nb_active_item, IndexType total_size)
Ce constructeur est utilisé dans l'implémentation hôte.
Espace de nom pour l'utilisation des accélérateurs.
std::int32_t Int32
Type entier signé sur 32 bits.