Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
core/RunQueue.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* RunQueue.h (C) 2000-2024 */
9/* */
10/* Gestion d'une file d'exécution sur accélérateur. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_CORE_RUNQUEUE_H
13#define ARCANE_ACCELERATOR_CORE_RUNQUEUE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/AutoRef.h"
18
19#include "arcane/accelerator/core/RunCommand.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane::Accelerator
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29/*!
30 * \brief File d'exécution pour un accélérateur.
31 *
32 * Cette classe utilise une sémantique par référence. La file d'exécution est
33 * détruite lorsque la dernière référence dessus est détruite.
34 *
35 * Une file est attachée à une instance de Runner et permet d'exécuter
36 * des commandes (RunCommand) sur un accélérateur ou sur le CPU. La méthode
37 * executionPolicy() permet de savoir où s'exécutera les commandes issues
38 * de la file.
39 *
40 * Les instances de cette classe sont créées par l'appel à makeQueue(Runner).
41 * On peut ensuite créer des noyaux de calcul (RunCommand) via l'appel
42 * à makeCommand().
43 *
44 * Le constructeur par défaut construit Une file nulle qui ne peut pas être
45 * utilisée pour lancer des commandes. Les seules opérations autorisées sur
46 * la file nulle sont isNull(), executionPolicy(), isAcceleratorPolicy(),
47 * barrier(), allocationOptions() et memoryRessource().
48 *
49 * Les méthodes de cette classe ne sont pas thread-safe pour une même instance.
50 */
51class ARCANE_ACCELERATOR_CORE_EXPORT RunQueue
52{
53 friend RunCommand;
54 friend ProfileRegion;
55 friend Runner;
56 friend ViewBuildInfo;
57 friend class impl::RunCommandLaunchInfo;
58 friend RunCommand makeCommand(const RunQueue& run_queue);
59 friend RunCommand makeCommand(const RunQueue* run_queue);
60
61 public:
62
63 //! Permet de modifier l'asynchronisme de la file pendant la durée de vie de l'instance
65 {
66 public:
67
68 explicit ScopedAsync(RunQueue* queue)
69 : m_queue(queue)
70 {
71 // Rend la file asynchrone
72 if (m_queue) {
73 m_is_async = m_queue->isAsync();
74 m_queue->setAsync(true);
75 }
76 }
77 ~ScopedAsync() noexcept(false)
78 {
79 // Remet la file dans l'état d'origine lors de l'appel au constructeur
80 if (m_queue)
81 m_queue->setAsync(m_is_async);
82 }
83
84 private:
85
86 RunQueue* m_queue = nullptr;
87 bool m_is_async = false;
88 };
89
90 public:
91
92 //! Créé une file nulle.
93 RunQueue();
94 ~RunQueue();
95
96 public:
97
98 //! Créé une file associée à \a runner avec les paramètres par défaut
99 ARCANE_DEPRECATED_REASON("Y2024: Use makeQueue(runner) instead")
100 explicit RunQueue(const Runner& runner);
101 //! Créé une file associée à \a runner avec les paramètres \a bi
102 ARCANE_DEPRECATED_REASON("Y2024: Use makeQueue(runner,bi) instead")
103 RunQueue(const Runner& runner, const RunQueueBuildInfo& bi);
104
105 public:
106
107 RunQueue(const RunQueue&);
108 RunQueue& operator=(const RunQueue&);
109 RunQueue(RunQueue&&) noexcept;
110 RunQueue& operator=(RunQueue&&) noexcept;
111
112 public:
113
114 //! Indique si la RunQueue est nulle
115 bool isNull() const { return !m_p; }
116
117 //! Politique d'exécution de la file.
118 eExecutionPolicy executionPolicy() const;
119 //! Indique si l'instance est associée à un accélérateur
120 bool isAcceleratorPolicy() const;
121
122 /*!
123 * \brief Positionne l'asynchronisme de l'instance.
124 *
125 * Si l'instance est asynchrone, les différentes commandes
126 * associées ne sont pas bloquantes et il faut appeler explicitement barrier()
127 * pour attendre la fin de l'exécution des commandes.
128 *
129 * \pre !isNull()
130 */
131 void setAsync(bool v);
132 //! Indique si la file d'exécution est asynchrone.
133 bool isAsync() const;
134
135 /*!
136 * \brief Positionne l'asynchronisme de l'instance.
137 *
138 * Retourne l'instance.
139 *
140 * \pre !isNull()
141 * \sa setAsync().
142 */
143 const RunQueue& addAsync(bool is_async) const;
144
145 //! Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
146 void barrier() const;
147
148 //! Copie des informations entre deux zones mémoires
149 void copyMemory(const MemoryCopyArgs& args) const;
150 //! Effectue un préfetching de la mémoire
151 void prefetchMemory(const MemoryPrefetchArgs& args) const;
152
153 /*!
154 * \name Gestion des évènements
155 * \pre !isNull()
156 */
157 //!@{
158 //! Enregistre l'état de l'instance dans \a event.
159 void recordEvent(RunQueueEvent& event);
160 //! Enregistre l'état de l'instance dans \a event.
161 void recordEvent(Ref<RunQueueEvent>& event);
162 //! Bloque l'exécution sur l'instance tant que les jobs enregistrés dans \a event ne sont pas terminés
163 void waitEvent(RunQueueEvent& event);
164 //! Bloque l'exécution sur l'instance tant que les jobs enregistrés dans \a event ne sont pas terminés
165 void waitEvent(Ref<RunQueueEvent>& event);
166 //!@}
167
168 //! \name Gestion mémoire
169 //!@{
170 /*!
171 * \brief Options d'allocation associée à cette file.
172 *
173 * Il est possible de changer la ressource mémoire et donc l'allocateur utilisé
174 * via setMemoryRessource().
175 */
176 MemoryAllocationOptions allocationOptions() const;
177
178 /*!
179 * \brief Positionne la ressource mémoire utilisée pour les allocations avec cette instance.
180 *
181 * La valeur par défaut est eMemoryRessource::UnifiedMemory
182 * si isAcceleratorPolicy()==true et eMemoryRessource::Host sinon.
183 *
184 * \sa memoryRessource()
185 * \sa allocationOptions()
186 *
187 * \pre !isNull()
188 */
189 void setMemoryRessource(eMemoryRessource mem);
190
191 //! Ressource mémoire utilisée pour les allocations avec cette instance.
192 eMemoryRessource memoryRessource() const;
193 //!@}
194
195 public:
196
197 /*!
198 * \brief Pointeur sur la structure interne dépendante de l'implémentation.
199 *
200 * Cette méthode est réservée à un usage avancée.
201 * La file retournée ne doit pas être conservée au delà de la vie de l'instance.
202 *
203 * Avec CUDA, le pointeur retourné est un 'cudaStream_t*'. Avec HIP, il
204 * s'agit d'un 'hipStream_t*'.
205 *
206 * \deprecated Utiliser toCudaNativeStream(), toHipNativeStream()
207 * ou toSyclNativeStream() à la place
208 */
209 ARCANE_DEPRECATED_REASON("Y2024: Use toCudaNativeStream(), toHipNativeStream() or toSyclNativeStream() instead")
210 void* platformStream() const;
211
212 private:
213
214 // Les méthodes de création sont réservée à Runner.
215 // On ajoute un argument supplémentaire non utilisé pour ne pas utiliser
216 // le constructeur obsolète.
217 RunQueue(const Runner& runner, bool);
218 //! Créé une file associée à \a runner avec les paramètres \a bi
219 RunQueue(const Runner& runner, const RunQueueBuildInfo& bi, bool);
220 explicit RunQueue(impl::RunQueueImpl* p);
221
222 private:
223
224 impl::IRunnerRuntime* _internalRuntime() const;
225 impl::IRunQueueStream* _internalStream() const;
226 impl::RunCommandImpl* _getCommandImpl() const;
227 impl::RunQueueImpl* _internalImpl() const;
228 void _checkNotNull() const;
229
230 // Pour VariableViewBase
231 friend class VariableViewBase;
232 friend class NumArrayViewBase;
233
234 private:
235
236 AutoRef2<impl::RunQueueImpl> m_p;
237};
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242/*---------------------------------------------------------------------------*/
243/*---------------------------------------------------------------------------*/
244/*!
245 * \brief Créé une commande associée à la file \a run_queue.
246 */
247inline RunCommand
248makeCommand(const RunQueue& run_queue)
249{
250 run_queue._checkNotNull();
251 return RunCommand(run_queue);
252}
253
254/*!
255 * \brief Créé une commande associée à la file \a run_queue.
256 */
257inline RunCommand
258makeCommand(const RunQueue* run_queue)
259{
260 ARCANE_CHECK_POINTER(run_queue);
261 run_queue->_checkNotNull();
262 return RunCommand(*run_queue);
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
268} // End namespace Arcane::Accelerator
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273#endif
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Arguments pour la copie mémoire.
Definition Memory.h:63
Arguments pour le préfetching mémoire.
Definition Memory.h:125
Classe de base des vues sur les 'NumArray'.
Région pour le profiling.
Gestion d'une commande sur accélérateur.
Informations pour créer une RunQueue.
Evènement pour une file d'exécution.
Permet de modifier l'asynchronisme de la file pendant la durée de vie de l'instance.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
Classe de base des vues sur les variables.
Informations pour construire une vue pour les données sur accélérateur.
Encapsulation d'un pointeur avec compteur de référence.
Definition AutoRef.h:123
Options pour configurer les allocations.
Espace de nom pour l'utilisation des accélérateurs.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
eExecutionPolicy
Politique d'exécution pour un Runner.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
eMemoryRessource
Liste des ressources mémoire disponibles.