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;
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_>
131 using IndexType = IndexType_;
139 : BaseClass(loop_index, group_index, group_size, nb_active_item, total_size)
140 , m_nb_block(nb_block)
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.
CooperativeHostWorkItemGrid(Int32 nb_block, Impl::ThreadGridSynchronizer *syncer)
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.
CooperativeHostWorkItemGrid grid() const
Groupe courant.
constexpr CooperativeWorkGroupLoopContext(IndexType loop_index, Int32 group_index, Int32 group_size, Int32 nb_active_item, IndexType total_size, Int32 nb_block, Impl::ThreadGridSynchronizer *syncer)
Ce constructeur est utilisé dans l'implémentation hôte.
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;.
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.