Arcane  v4.1.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
core/Runner.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Runner.h (C) 2000-2025 */
9/* */
10/* Gestion de l'exécution sur accélérateur. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_CORE_RUNNER_H
13#define ARCANE_ACCELERATOR_CORE_RUNNER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/Ref.h"
18
19#include "arcane/accelerator/core/RunQueue.h"
20
21#include <memory>
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane::Accelerator
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31/*!
32 * \brief Gestionnaire d'exécution pour accélérateur.
33 *
34 * Cette classe utilise une sémantique par référence
35 *
36 * Une instance de cette classe représente un back-end d'exécution. Il faut
37 * d'abord appelé initialize() avant de pouvoir utiliser les méthodes de
38 * l'instance ou alors il faut appeler l'un des constructeurs autre que le
39 * constructeur par défaut. Le back-end utilisé est choisi via l'énumération
40 * eExecutionPolicy. Les back-ends sont de deux types:
41 * - les back-ends qui s'exécutent sur l'hôte: eExecutionPolicy::Sequential
42 * et eExecutionPolicy::Thread,
43 * - les back-ends qui s'exécutent sur accélérateurs : eExecutionPolicy::CUDA,
44 * eExecutionPolicy::HIP et eExecutionPolicy::SYCL.
45 *
46 * La fonction \arcaneacc{isAcceleratorPolicy()} permet de savoir si une
47 * eExecutionPolicy est associée à un accélérateur.
48 *
49 * Si une instance de cette classe est associée à un accélérateur, celui-ci
50 * n'est pas forcément celui utilisé par défaut pour le thread courant.
51 * Pour garantir que les kernels associés à ce runner seront bien exécutés
52 * sur le bon device il est nécessaire d'appeler au moins une fois
53 * la méthode setAsCurrentDevice() et de le refaire si une autre partie du code
54 * ou si une bibliothèque externe change l'accélérateur par défaut.
55 *
56 * La classe Runner permet de créer des files d'exécutions (RunQueue)
57 * via la fonction makeQueue(). Ces files peuvent ensuite être utilisées
58 * pour lancer des commandes (RunCommand). La page \ref arcanedoc_acceleratorapi
59 * décrit le fonctionnement de l'API accélérateur.
60 *
61 * Il est possible de changer le mécanisme utilisé pour les réductions via
62 * la méthode setDeviceReducePolicy(). Par défaut on utilise un kernel
63 * utilisant des synchronisations entre blocs. Cela permet de garantir la
64 * répétabilité des résultats.
65 */
66class ARCANE_ACCELERATOR_CORE_EXPORT Runner
67{
68 friend impl::RunQueueImpl;
69 friend impl::RunCommandImpl;
70 friend RunQueue;
71 friend RunQueueEvent;
72 friend impl::RunnerImpl;
73
74 friend RunQueue makeQueue(const Runner& runner);
75 friend RunQueue makeQueue(const Runner* runner);
76 friend RunQueue makeQueue(const Runner& runner, const RunQueueBuildInfo& bi);
77 friend RunQueue makeQueue(const Runner* runner, const RunQueueBuildInfo& bi);
78 friend Ref<RunQueue> makeQueueRef(const Runner& runner);
79 friend Ref<RunQueue> makeQueueRef(Runner& runner, const RunQueueBuildInfo& bi);
80 friend Ref<RunQueue> makeQueueRef(Runner* runner);
81
82 public:
83
84 /*!
85 * \brief Créé un gestionnaire d'exécution non initialisé.
86 *
87 * Il faudra appeler initialize() avant de pouvoir utiliser l'instance
88 */
89 Runner();
90 //! Créé et initialise un gestionnaire pour l'accélérateur \a p
91 explicit Runner(eExecutionPolicy p);
92 //! Créé et initialise un gestionnaire pour l'accélérateur \a p et l'accélérateur \a device
94
95 public:
96
97 //! Politique d'exécution associée
99
100 //! Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
102
103 //! Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
104 void initialize(eExecutionPolicy v, DeviceId device);
105
106 //! Indique si l'instance a été initialisée
107 bool isInitialized() const;
108
109 /*!
110 * \brief Indique si on autorise la création de RunQueue depuis plusieurs threads.
111 *
112 * \deprecated La création de file est toujours thread-safe depuis la version
113 * 3.15 de Arcane.
114 */
115 ARCANE_DEPRECATED_REASON("Y2025: this method is a no op. Concurrent queue creation is always thread-safe")
116 void setConcurrentQueueCreation(bool v);
117
118 //! Indique si la création concurrent de plusieurs RunQueue est autorisé
119 bool isConcurrentQueueCreation() const;
120
121 /*!
122 * \brief Temps total passé dans les commandes associées à cette instance.
123 *
124 * Ce temps n'est significatif que si les RunQueue sont synchrones.
125 */
126 double cumulativeCommandTime() const;
127
128 //! Positionne la politique d'exécution des réductions
129 ARCANE_DEPRECATED_REASON("Y2025: this method is a no op. reduce policy is always eDeviceReducePolicy::Grid")
131
132 //! politique d'exécution des réductions
134
135 //! Positionne un conseil sur la gestion d'une zone mémoire
136 void setMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice);
137
138 //! Supprime un conseil sur la gestion d'une zone mémoire
140
141 //! Device associé à cette instance.
142 DeviceId deviceId() const;
143
144 /*!
145 * \brief Positionne le device associé à cette instance comme le device par défaut du contexte.
146 *
147 * Cet appel est équivalent à cudaSetDevice() ou hipSetDevice();
148 */
149 void setAsCurrentDevice();
150
151 //! Information sur le device associé à cette instance.
152 const DeviceInfo& deviceInfo() const;
153
154 //! Information sur le device associé à cette instance.
156
157 //! Remplit \a attr avec les informations concernant la zone mémoire pointée par \a ptr
158 void fillPointerAttribute(PointerAttribute& attr, const void* ptr);
159
160 public:
161
162 /*!
163 * \brief Liste des devices pour la politique d'exécution \a policy.
164 *
165 * Si le runtime associé n'a pas encore été initialisé, cette méthode retourne \a nullptr.
166 */
167 static const IDeviceInfoList* deviceInfoList(eExecutionPolicy policy);
168
169 private:
170
171 // La création est réservée aux méthodes globales makeQueue()
172 static RunQueue _makeQueue(const Runner& runner)
173 {
174 return RunQueue(runner, true);
175 }
176 static RunQueue _makeQueue(const Runner& runner, const RunQueueBuildInfo& bi)
177 {
178 return RunQueue(runner, bi, true);
179 }
180 static Ref<RunQueue> _makeQueueRef(const Runner& runner)
181 {
182 return makeRef(new RunQueue(runner, true));
183 }
184 static Ref<RunQueue> _makeQueueRef(Runner& runner, const RunQueueBuildInfo& bi)
185 {
186 return makeRef(new RunQueue(runner, bi, true));
187 }
188
189 public:
190
191 //! API interne à Arcane
192 RunnerInternal* _internalApi();
193
194 private:
195
196 impl::IRunnerRuntime* _internalRuntime() const;
197 impl::RunnerImpl* _impl() const { return m_p.get(); }
198
199 private:
200
201 std::shared_ptr<impl::RunnerImpl> m_p;
202
203 private:
204
205 void _checkIsInit() const;
206 bool _isAutoPrefetchCommand() const;
207};
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215/*!
216 * \brief Créé une file associée à \a runner.
217 *
218 * Cet appel est thread-safe.
219 */
220inline RunQueue
221makeQueue(const Runner& runner)
222{
223 return Runner::_makeQueue(runner);
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228/*!
229 * \brief Créé une file associée à \a runner.
230 *
231 * Cet appel est thread-safe.
232 */
233inline RunQueue
234makeQueue(const Runner* runner)
235{
236 ARCANE_CHECK_POINTER(runner);
237 return Runner::_makeQueue(*runner);
238}
239
240/*---------------------------------------------------------------------------*/
241/*---------------------------------------------------------------------------*/
242/*!
243 * \brief Créé une file associée à \a runner avec les propriétés \a bi.
244 *
245 * Cet appel est thread-safe.
246 */
247inline RunQueue
248makeQueue(const Runner& runner, const RunQueueBuildInfo& bi)
249{
250 return Runner::_makeQueue(runner, bi);
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255/*!
256 * \brief Créé une file associée à \a runner avec les propriétés \a bi.
257 *
258 * Cet appel est thread-safe.
259 */
260inline RunQueue
261makeQueue(const Runner* runner, const RunQueueBuildInfo& bi)
262{
263 ARCANE_CHECK_POINTER(runner);
264 return Runner::_makeQueue(*runner, bi);
265}
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269/*!
270 * \brief Créé une référence sur file avec la politique d'exécution par défaut de \a runner.
271 *
272 * Si la file est temporaire, il est préférable d'utiliser makeQueue() à la place
273 * pour éviter une allocation inutile.
274 */
275inline Ref<RunQueue>
276makeQueueRef(const Runner& runner)
277{
278 return Runner::_makeQueueRef(runner);
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283/*!
284 * \brief Créé une référence sur file avec la politique d'exécution par défaut de \a runner.
285 *
286 * Si la file est temporaire, il est préférable d'utiliser makeQueue() à la place
287 * pour éviter une allocation inutile.
288 */
289inline Ref<RunQueue>
291{
292 return Runner::_makeQueueRef(runner, bi);
293}
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297/*!
298 * \brief Créé une référence sur file avec la politique d'exécution par défaut de \a runner.
299 *
300 * Si la file est temporaire, il est préférable d'utiliser makeQueue() à la place
301 * pour éviter une allocation inutile.
302 */
303inline Ref<RunQueue>
305{
306 ARCANE_CHECK_POINTER(runner);
307 return Runner::_makeQueueRef(*runner);
308}
309
310/*---------------------------------------------------------------------------*/
311/*---------------------------------------------------------------------------*/
312
313} // End namespace Arcane::Accelerator
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318#endif
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Gestion des références à une classe C++.
Identifiant d'un composant du système.
Definition DeviceId.h:33
Information sur un device.
Definition DeviceInfo.h:32
Information mémoire d'un accélérateur.
Interface d'une liste de devices.
Informations sur une adresse mémoire.
Informations pour créer une RunQueue.
File d'exécution pour un accélérateur.
void fillPointerAttribute(PointerAttribute &attr, const void *ptr)
Remplit attr avec les informations concernant la zone mémoire pointée par ptr.
Definition Runner.cc:473
void setConcurrentQueueCreation(bool v)
Indique si on autorise la création de RunQueue depuis plusieurs threads.
Definition Runner.cc:321
static const IDeviceInfoList * deviceInfoList(eExecutionPolicy policy)
Liste des devices pour la politique d'exécution policy.
Definition Runner.cc:451
bool isInitialized() const
Indique si l'instance a été initialisée.
Definition Runner.cc:312
Runner()
Créé un gestionnaire d'exécution non initialisé.
Definition Runner.cc:261
RunnerInternal * _internalApi()
API interne à Arcane.
Definition Runner.cc:492
double cumulativeCommandTime() const
Temps total passé dans les commandes associées à cette instance.
Definition Runner.cc:386
friend Ref< RunQueue > makeQueueRef(const Runner &runner)
Créé une référence sur file avec la politique d'exécution par défaut de runner.
bool isConcurrentQueueCreation() const
Indique si la création concurrent de plusieurs RunQueue est autorisé
Definition Runner.cc:330
DeviceId deviceId() const
Device associé à cette instance.
Definition Runner.cc:425
void setDeviceReducePolicy(eDeviceReducePolicy v)
Positionne la politique d'exécution des réductions.
Definition Runner.cc:339
const DeviceInfo & deviceInfo() const
Information sur le device associé à cette instance.
Definition Runner.cc:434
DeviceMemoryInfo deviceMemoryInfo() const
Information sur le device associé à cette instance.
Definition Runner.cc:463
void initialize(eExecutionPolicy v)
Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
Definition Runner.cc:358
friend RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
void setAsCurrentDevice()
Positionne le device associé à cette instance comme le device par défaut du contexte.
Definition Runner.cc:415
eDeviceReducePolicy deviceReducePolicy() const
politique d'exécution des réductions
Definition Runner.cc:349
void setMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice)
Positionne un conseil sur la gestion d'une zone mémoire.
Definition Runner.cc:395
void unsetMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice)
Supprime un conseil sur la gestion d'une zone mémoire.
Definition Runner.cc:405
eExecutionPolicy executionPolicy() const
Politique d'exécution associée.
Definition Runner.cc:303
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
Référence à une instance.
Espace de nom pour l'utilisation des accélérateurs.
Ref< RunQueue > makeQueueRef(const Runner &runner)
Créé une référence sur file avec la politique d'exécution par défaut de runner.
eDeviceReducePolicy
Politique des opératations de réduction sur les accélérateurs.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
eMemoryAdvice
Conseils pour la gestion mémoire.
Definition Memory.h:34
eExecutionPolicy
Politique d'exécution pour un Runner.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.