12#ifndef ARCCORE_ACCELERATOR_COOPERATIVEWORKGROUPLOOPRANGE_H
13#define ARCCORE_ACCELERATOR_COOPERATIVEWORKGROUPLOOPRANGE_H
17#include "arccore/accelerator/WorkGroupLoopRange.h"
34class CooperativeHostWorkItemGrid
36 template<
typename T>
friend class CooperativeWorkGroupLoopContext;
42 : m_nb_block(nb_block)
67#if defined(ARCCORE_COMPILING_CUDA_OR_HIP)
75class CooperativeDeviceWorkItemGrid
87 __device__ CooperativeDeviceWorkItemGrid()
88 : m_grid_group(cooperative_groups::this_grid())
94 __device__ Int32 nbBlock()
const {
return m_grid_group.group_dim().x; }
97 __device__
void barrier() { m_grid_group.sync(); }
101 cooperative_groups::grid_group m_grid_group;
119template <
typename IndexType_>
120class CooperativeWorkGroupLoopContext
131 using IndexType = IndexType_;
136 constexpr CooperativeWorkGroupLoopContext(IndexType loop_index,
Int32 group_index,
139 : BaseClass(loop_index, group_index, group_size, nb_active_item, total_size)
140 , m_nb_block(nb_block)
147 explicit constexpr ARCCORE_DEVICE CooperativeWorkGroupLoopContext(IndexType total_size)
148 : BaseClass(total_size)
153#if defined(ARCCORE_DEVICE_CODE) && !defined(ARCCORE_COMPILING_SYCL)
155 __device__ CooperativeDeviceWorkItemGrid
grid()
const {
return CooperativeDeviceWorkItemGrid{}; }
163 Int32 m_nb_block = 0;
172#if defined(ARCCORE_COMPILING_SYCL)
177class SyclCooperativeDeviceWorkItemGrid
183 explicit SyclCooperativeDeviceWorkItemGrid(sycl::nd_item<1> n)
191 Int32 nbBlock()
const {
return static_cast<Int32
>(m_nd_item.get_group_range(0)); }
198 sycl::nd_item<1> m_nd_item;
209template <
typename IndexType_>
213 friend CooperativeWorkGroupLoopRange<IndexType_>;
214 friend Impl::WorkGroupLoopContextBuilder;
218 using IndexType = IndexType_;
223 explicit SyclCooperativeWorkGroupLoopContext(sycl::nd_item<1> nd_item, IndexType total_size)
224 : SyclWorkGroupLoopContextBase<IndexType_>(nd_item, total_size)
231 SyclCooperativeDeviceWorkItemGrid grid()
const
233 return SyclCooperativeDeviceWorkItemGrid(this->m_nd_item);
250template <
typename IndexType_>
251class CooperativeWorkGroupLoopRange
252:
public WorkGroupLoopRangeBase<true, IndexType_>
257 using IndexType = IndexType_;
261 CooperativeWorkGroupLoopRange() =
default;
262 explicit CooperativeWorkGroupLoopRange(IndexType total_nb_element)
263 : WorkGroupLoopRangeBase<true, IndexType_>(total_nb_element)
Gère une grille de WorkItem dans un CooperativeWorkGroupLoopRange 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.
CooperativeHostWorkItemGrid grid() const
Groupe courant.
Intervalle d'itération d'une boucle utilisant le parallélisme hiérarchique collaboratif.
Classe pour gérer la synchronisation de grille en multi-thread;.
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.