Arcane  v3.14.10.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-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/* Runner.h (C) 2000-2024 */
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 "arcane/utils/Ref.h"
18#include "arcane/utils/MemoryRessource.h"
19
20#include "arcane/accelerator/core/RunQueue.h"
21
22#include <memory>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane::Accelerator
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32/*!
33 * \brief Gestionnaire d'exécution pour accélérateur.
34 *
35 * Cette classe utilise une sémantique par référence
36 *
37 * Une instance de cette classe représente un backend d'exécution. Il faut
38 * d'abord appelé initialize() avant de pouvoir utiliser les méthodes de
39 * l'instance ou alors il faut appeler l'un des constructeurs autre que le
40 * constructeur par défaut.
41 *
42 * Une instance de cette classe est associée à un device qui n'est pas forcément
43 * celui utilisé par défaut pour le thread courant. Pour garantir que les
44 * kernels associés à ce runner seront bien exécutés sur le bon device il
45 * est nécessaire d'appeler au moins une fois la méthode setAsCurrentDevice().
46 *
47 * Il est possible de changer le mécanisme utilisé pour les réductions via
48 * la méthode setDeviceReducePolicy(). Par défaut on utilise un kernel
49 * utilisant des synchronisations entre blocs. Cela permet de garantir la
50 * répétabilité des résultats.
51 */
52class ARCANE_ACCELERATOR_CORE_EXPORT Runner
53{
54 friend impl::RunQueueImpl;
55 friend impl::RunCommandImpl;
56 friend RunQueue;
57 friend RunQueueEvent;
58 friend impl::RunnerImpl;
59
60 friend RunQueue makeQueue(const Runner& runner);
61 friend RunQueue makeQueue(const Runner* runner);
62 friend RunQueue makeQueue(const Runner& runner, const RunQueueBuildInfo& bi);
63 friend RunQueue makeQueue(const Runner* runner, const RunQueueBuildInfo& bi);
64 friend Ref<RunQueue> makeQueueRef(const Runner& runner);
65 friend Ref<RunQueue> makeQueueRef(Runner& runner, const RunQueueBuildInfo& bi);
66 friend Ref<RunQueue> makeQueueRef(Runner* runner);
67
68 public:
69
70 /*!
71 * \brief Créé un gestionnaire d'exécution non initialisé.
72 *
73 * Il faudra appeler initialize() avant de pouvoir utiliser l'instance
74 */
75 Runner();
76 //! Créé et initialise un gestionnaire pour l'accélérateur \a p
77 explicit Runner(eExecutionPolicy p);
78 //! Créé et initialise un gestionnaire pour l'accélérateur \a p et l'accélérateur \a device
80
81 public:
82
83 //! Politique d'exécution associée
84 eExecutionPolicy executionPolicy() const;
85
86 //! Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
87 void initialize(eExecutionPolicy v);
88
89 //! Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
90 void initialize(eExecutionPolicy v, DeviceId device);
91
92 //! Indique si l'instance a été initialisée
93 bool isInitialized() const;
94
95 /*!
96 * \brief Indique si on autorise la création de RunQueue depuis plusieurs threads.
97 *
98 * Cela nécessite d'utiliser un verrou (comme std::mutex) et peut dégrader les
99 * performances. Le défaut est \a false.
100 */
101 void setConcurrentQueueCreation(bool v);
102
103 //! Indique si la création concurrent de plusieurs RunQueue est autorisé
104 bool isConcurrentQueueCreation() const;
105
106 /*!
107 * \brief Temps total passé dans les commandes associées à cette instance.
108 *
109 * Ce temps n'est significatif que si les RunQueue sont synchrones.
110 */
111 double cumulativeCommandTime() const;
112
113 //! Positionne la politique d'exécution des réductions
114 void setDeviceReducePolicy(eDeviceReducePolicy v);
115
116 //! politique d'exécution des réductions
117 eDeviceReducePolicy deviceReducePolicy() const;
118
119 //! Positionne un conseil sur la gestion d'une zone mémoire
120 void setMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice);
121
122 //! Supprime un conseil sur la gestion d'une zone mémoire
123 void unsetMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice);
124
125 //! Device associé à cette instance.
126 DeviceId deviceId() const;
127
128 /*!
129 * \brief Positionne le device associé à cette instance comme le device par défaut du contexte.
130 *
131 * Cet appel est équivalent à cudaSetDevice() ou hipSetDevice();
132 */
133 void setAsCurrentDevice();
134
135 //! Information sur le device associé à cette instance.
136 const DeviceInfo& deviceInfo() const;
137
138 //! Remplit \a attr avec les informations concernant la zone mémoire pointée par \a ptr
139 void fillPointerAttribute(PointerAttribute& attr, const void* ptr);
140
141 public:
142
143 /*!
144 * \brief Liste des devices pour la politique d'exécution \a policy.
145 *
146 * Si le runtime associé n'a pas encore été initialisé, cette méthode retourne \a nullptr.
147 */
148 static const IDeviceInfoList* deviceInfoList(eExecutionPolicy policy);
149
150 private:
151
152 // La création est réservée aux méthodes globales makeQueue()
153 static RunQueue _makeQueue(const Runner& runner)
154 {
155 return RunQueue(runner, true);
156 }
157 static RunQueue _makeQueue(const Runner& runner, const RunQueueBuildInfo& bi)
158 {
159 return RunQueue(runner, bi, true);
160 }
161 static Ref<RunQueue> _makeQueueRef(const Runner& runner)
162 {
163 return makeRef(new RunQueue(runner, true));
164 }
165 static Ref<RunQueue> _makeQueueRef(Runner& runner, const RunQueueBuildInfo& bi)
166 {
167 return makeRef(new RunQueue(runner, bi, true));
168 }
169
170 public:
171
172 //! API interne à Arcane
173 RunnerInternal* _internalApi();
174
175 private:
176
177 impl::IRunnerRuntime* _internalRuntime() const;
178 impl::RunnerImpl* _impl() const { return m_p.get(); }
179
180 private:
181
182 std::shared_ptr<impl::RunnerImpl> m_p;
183
184 private:
185
186 void _checkIsInit() const;
187 bool _isAutoPrefetchCommand() const;
188};
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
196/*!
197 * \brief Créé une file associée à \a runner.
198 *
199 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
200 */
201inline RunQueue
202makeQueue(const Runner& runner)
203{
204 return Runner::_makeQueue(runner);
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209/*!
210 * \brief Créé une file associée à \a runner.
211 *
212 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
213 */
214inline RunQueue
215makeQueue(const Runner* runner)
216{
217 ARCANE_CHECK_POINTER(runner);
218 return Runner::_makeQueue(*runner);
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223/*!
224 * \brief Créé une file associée à \a runner avec les propriétés \a bi.
225 *
226 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
227 */
228inline RunQueue
229makeQueue(const Runner& runner, const RunQueueBuildInfo& bi)
230{
231 return Runner::_makeQueue(runner, bi);
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236/*!
237 * \brief Créé une file associée à \a runner avec les propriétés \a bi.
238 *
239 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
240 */
241inline RunQueue
242makeQueue(const Runner* runner, const RunQueueBuildInfo& bi)
243{
244 ARCANE_CHECK_POINTER(runner);
245 return Runner::_makeQueue(*runner, bi);
246}
247
248/*---------------------------------------------------------------------------*/
249/*---------------------------------------------------------------------------*/
250/*!
251 * \brief Créé une référence sur file avec la politique d'exécution par défaut de \a runner.
252 *
253 * Si la file est temporaire, il est préférable d'utiliser makeQueue() à la place
254 * pour éviter une allocation inutile.
255 */
256inline Ref<RunQueue>
257makeQueueRef(const Runner& runner)
258{
259 return Runner::_makeQueueRef(runner);
260}
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264/*!
265 * \brief Créé une référence sur file avec la politique d'exécution par défaut de \a runner.
266 *
267 * Si la file est temporaire, il est préférable d'utiliser makeQueue() à la place
268 * pour éviter une allocation inutile.
269 */
270inline Ref<RunQueue>
272{
273 return Runner::_makeQueueRef(runner, bi);
274}
275
276/*---------------------------------------------------------------------------*/
277/*---------------------------------------------------------------------------*/
278/*!
279 * \brief Créé une référence sur file avec la politique d'exécution par défaut de \a runner.
280 *
281 * Si la file est temporaire, il est préférable d'utiliser makeQueue() à la place
282 * pour éviter une allocation inutile.
283 */
284inline Ref<RunQueue>
286{
287 ARCANE_CHECK_POINTER(runner);
288 return Runner::_makeQueueRef(*runner);
289}
290
291/*---------------------------------------------------------------------------*/
292/*---------------------------------------------------------------------------*/
293
294} // End namespace Arcane::Accelerator
295
296/*---------------------------------------------------------------------------*/
297/*---------------------------------------------------------------------------*/
298
299#endif
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Identifiant d'un composant du système.
Definition DeviceId.h:33
Information sur un device.
Definition DeviceInfo.h:32
Interface d'une liste de devices.
Informations sur une adresse mémoire.
Informations pour créer une RunQueue.
Evènement pour une file d'exécution.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
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:36
eExecutionPolicy
Politique d'exécution pour un Runner.