Arcane  v4.1.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CooperativeWorkGroupLoopRange.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CooperativeWorkGroupLoopRange.h (C) 2000-2026 */
9/* */
10/* Boucle pour le parallélisme hiérarchique coopératif. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_ACCELERATOR_COOPERATIVEWORKGROUPLOOPRANGE_H
13#define ARCCORE_ACCELERATOR_COOPERATIVEWORKGROUPLOOPRANGE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/accelerator/WorkGroupLoopRange.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane::Accelerator
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \brief Gère une grille de WorkItem dans un
29 * CooperativeWorkGroupLoopRange pour l'hôte.
30 *
31 * Cette classe possède juste une méthode barrier() qui effectue
32 * une barrière sur l'ensemble des threads participants en mode multi-thread.
33 */
34class CooperativeHostWorkItemGrid
35{
36 template<typename T> friend class CooperativeWorkGroupLoopContext;
37
38 private:
39
40 //! Constructeur pour l'hôte
41 explicit CooperativeHostWorkItemGrid()
42 {}
43
44 public:
45
46 //! Bloque tant que tous les \a WorkItem de la grille ne sont pas arrivés ici.
47 void barrier()
48 {
49 // TODO: A implementer pour le multi-threading via std::barrier()
50 }
51};
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
56#if defined(ARCCORE_COMPILING_CUDA_OR_HIP)
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60/*!
61 * \brief Gère la grille de WorkItem dans un
62 * CooperativeWorkGroupLoopRange pour un device CUDA ou HIP.
63 */
64class CooperativeDeviceWorkItemGrid
65{
66 template <typename T> friend class CooperativeWorkGroupLoopContext;
67
68 private:
69
70 /*!
71 * \brief Constructeur pour le device.
72 *
73 * Ce constructeur n'a pas besoin d'informations spécifiques car tout est
74 * récupéré via cooperative_groups::this_grid()
75 */
76 __device__ CooperativeDeviceWorkItemGrid()
77 : m_grid_group(cooperative_groups::this_grid())
78 {}
79
80 public:
81
82 //! Bloque tant que tous les \a WorkItem de la grille ne sont pas arrivés ici.
83 __device__ void barrier() { m_grid_group.sync(); }
84
85 private:
86
87 cooperative_groups::grid_group m_grid_group;
88};
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93#endif
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97/*!
98 * \brief Contexte d'exécution d'une commande sur un ensemble de blocs.
99 *
100 * Cette classe est utilisée pour l'hôte (séquentiel et multi-thread) et
101 * pour CUDA et ROCM/HIP.
102 * La méthode group() est différente sur accélérateur et sur l'hôte ce qui
103 * permet de particulariser le traitement de la commande.
104 */
105template <typename IndexType_>
106class CooperativeWorkGroupLoopContext
107: public WorkGroupLoopContextBase<IndexType_>
108{
109 // Pour accéder aux constructeurs
110 friend class CooperativeWorkGroupLoopRange<IndexType_>;
113 using BaseClass = WorkGroupLoopContextBase<IndexType_>;
114
115 private:
116
117 //! Ce constructeur est utilisé dans l'implémentation hôte.
118 constexpr CooperativeWorkGroupLoopContext(Int32 loop_index, Int32 group_index,
119 Int32 group_size, Int32 nb_active_item, Int64 total_size)
120 : BaseClass(loop_index, group_index, group_size, nb_active_item, total_size)
121 {
122 }
123
124 // Ce constructeur n'est utilisé que sur le device
125 // Il ne fait rien car les valeurs utiles sont récupérées via cooperative_groups::this_thread_block()
126 explicit constexpr ARCCORE_DEVICE CooperativeWorkGroupLoopContext(Int64 total_size)
127 : BaseClass(total_size)
128 {}
129
130 public:
131
132#if defined(ARCCORE_DEVICE_CODE) && !defined(ARCCORE_COMPILING_SYCL)
133 //! Groupe courant. Pour CUDA/ROCM, il s'agit d'un bloc de threads.
134 __device__ CooperativeDeviceWorkItemGrid grid() const { return CooperativeDeviceWorkItemGrid{}; }
135#else
136 //! Groupe courant
138#endif
139};
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143/*
144 * Implémentation pour SYCL.
145 */
146#if defined(ARCCORE_COMPILING_SYCL)
147
148/*!
149 * \brief Gère la grille de WorkItem dans un CooperativeWorkGroupLoopRange pour un device Sycl.
150 */
151class SyclCooperativeDeviceWorkItemGrid
152{
153 template <typename T> friend class SyclCooperativeWorkGroupLoopContext;
154
155 private:
156
157 explicit SyclCooperativeDeviceWorkItemGrid(sycl::nd_item<1> n)
158 : m_nd_item(n)
159 {
160 }
161
162 public:
163
164 //! Bloque tant que tous les \a CooperativeWorkItem de la grille ne sont pas arrivés ici.
165 void barrier() { /* Not Yet Implemented */ }
166
167 private:
168
169 sycl::nd_item<1> m_nd_item;
170};
171
172/*---------------------------------------------------------------------------*/
173/*---------------------------------------------------------------------------*/
174/*!
175 * \brief Contexte d'exécution d'une CooperativeWorkGroupLoopRange pour Sycl.
176 *
177 * Cette classe est utilisée uniquement pour la polique
178 * d'exécution eAcceleratorPolicy::SYCL.
179 */
180template <typename IndexType_>
182: public SyclWorkGroupLoopContextBase<IndexType_>
183{
184 friend CooperativeWorkGroupLoopRange<IndexType_>;
185 friend Impl::WorkGroupLoopContextBuilder;
186
187 private:
188
189 // Ce constructeur n'est utilisé que sur le device
190 explicit SyclCooperativeWorkGroupLoopContext(sycl::nd_item<1> nd_item, Int64 total_size)
191 : SyclWorkGroupLoopContextBase<IndexType_>(nd_item, total_size)
192 {
193 }
194
195 public:
196
197 //! Grille courante
198 SyclCooperativeDeviceWorkItemGrid grid() const
199 {
200 return SyclCooperativeDeviceWorkItemGrid(this->m_nd_item);
201 }
202};
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207#endif // ARCCORE_COMPILING_SYCL
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211/*!
212 * \brief Intervalle d'itération d'une boucle utilisant le parallélisme
213 * hiérarchique collaboratif.
214 *
215 * \sa WorkGroupLoopRangeBase
216 */
217template <typename IndexType_>
218class CooperativeWorkGroupLoopRange
219: public WorkGroupLoopRangeBase<IndexType_>
220{
221 public:
222
224 using IndexType = IndexType_;
225
226 // Pour indiquer au KernelLauncher qu'on souhaite un lancement coopératif.
227 static constexpr bool isCooperativeLaunch() { return true; }
228
229 public:
230
231 CooperativeWorkGroupLoopRange() = default;
232 explicit CooperativeWorkGroupLoopRange(IndexType total_nb_element)
233 : WorkGroupLoopRangeBase<IndexType_>(total_nb_element)
234 {}
235
236 public:
237};
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242} // namespace Arcane::Accelerator
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247#endif
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
Gère une grille de WorkItem dans un CooperativeWorkGroupLoopRange pour l'hôte.
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.
constexpr WorkGroupLoopContextBase(IndexType loop_index, Int32 group_index, Int32 group_size, Int32 nb_active_item, Int64 total_size)
Ce constructeur est utilisé dans l'implémentation hôte.
Espace de nom pour l'utilisation des accélérateurs.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.