Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
RunQueue.cc
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.cc (C) 2000-2024 */
9/* */
10/* Gestion d'une file d'exécution sur accélérateur. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/accelerator/core/internal/AcceleratorCoreGlobalInternal.h"
15#include "arcane/accelerator/core/RunQueue.h"
16
17#include "arcane/utils/FatalErrorException.h"
18
19#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
20#include "arcane/accelerator/core/internal/IRunQueueStream.h"
21#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
22#include "arcane/accelerator/core/internal/RunQueueImpl.h"
23#include "arcane/accelerator/core/internal/RunnerImpl.h"
24#include "arcane/accelerator/core/Runner.h"
25#include "arcane/accelerator/core/RunQueueEvent.h"
26#include "arcane/accelerator/core/Memory.h"
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31namespace Arcane::Accelerator
32{
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37// NOTE : Les constructeurs et destructeurs doivent être dans le fichier source,
38// car le type \a m_p est opaque pour l'utilisation n'est pas connu dans
39// la définition de la classe.
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
46{
47}
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
53RunQueue(const Runner& runner)
54: m_p(impl::RunQueueImpl::create(runner._impl()))
55{
56}
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
62RunQueue(const Runner& runner, const RunQueueBuildInfo& bi)
63: m_p(impl::RunQueueImpl::create(runner._impl(), bi))
64{
65}
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
71RunQueue(const Runner& runner, bool)
72: m_p(impl::RunQueueImpl::create(runner._impl()))
73{
74}
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
80RunQueue(const Runner& runner, const RunQueueBuildInfo& bi, bool)
81: m_p(impl::RunQueueImpl::create(runner._impl(), bi))
82{
83}
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
89RunQueue(const RunQueue& x)
90: m_p(x.m_p)
91{
92}
93
94/*---------------------------------------------------------------------------*/
95/*---------------------------------------------------------------------------*/
96
98RunQueue(RunQueue&& x) noexcept
99: m_p(x.m_p)
100{
101}
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
107RunQueue(impl::RunQueueImpl* p)
108: m_p(p)
109{
110}
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114
115RunQueue& RunQueue::
116operator=(const RunQueue& x)
117{
118 if (&x != this)
119 m_p = x.m_p;
120 return (*this);
121}
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126RunQueue& RunQueue::
127operator=(RunQueue&& x) noexcept
128{
129 m_p = x.m_p;
130 return (*this);
131}
132
133/*---------------------------------------------------------------------------*/
134/*---------------------------------------------------------------------------*/
135
136RunQueue::
137~RunQueue()
138{
139}
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
147void RunQueue::
148_checkNotNull() const
149{
150 if (!m_p)
151 ARCANE_FATAL("Invalid operation on null RunQueue");
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
158barrier() const
159{
160 if (m_p)
161 m_p->_internalBarrier();
162}
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
168executionPolicy() const
169{
170 if (m_p)
171 return m_p->executionPolicy();
173}
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177
178impl::IRunnerRuntime* RunQueue::
179_internalRuntime() const
180{
181 _checkNotNull();
182 return m_p->_internalRuntime();
183}
184
185/*---------------------------------------------------------------------------*/
186/*---------------------------------------------------------------------------*/
187
188impl::IRunQueueStream* RunQueue::
189_internalStream() const
190{
191 _checkNotNull();
192 return m_p->_internalStream();
193}
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
197
198impl::RunCommandImpl* RunQueue::
199_getCommandImpl() const
200{
201 _checkNotNull();
202 return m_p->_internalCreateOrGetRunCommandImpl();
203}
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
208impl::RunQueueImpl* RunQueue::
209_internalImpl() const
210{
211 _checkNotNull();
212 return m_p.get();
213}
214
215/*---------------------------------------------------------------------------*/
216/*---------------------------------------------------------------------------*/
217
219platformStream() const
220{
221 if (m_p)
222 return m_p->_internalStream()->_internalImpl();
223 return nullptr;
224}
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
230copyMemory(const MemoryCopyArgs& args) const
231{
232 _checkNotNull();
233 m_p->copyMemory(args);
234}
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238
240prefetchMemory(const MemoryPrefetchArgs& args) const
241{
242 _checkNotNull();
243 m_p->prefetchMemory(args);
244}
245
246/*---------------------------------------------------------------------------*/
247/*---------------------------------------------------------------------------*/
248
251{
252 _checkNotNull();
253 m_p->waitEvent(event);
254}
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
260waitEvent(Ref<RunQueueEvent>& event)
261{
262 RunQueueEvent* e = event.get();
264 waitEvent(*e);
265}
266
267/*---------------------------------------------------------------------------*/
268/*---------------------------------------------------------------------------*/
269
272{
273 _checkNotNull();
274 m_p->recordEvent(event);
275}
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279
281recordEvent(Ref<RunQueueEvent>& event)
282{
283 RunQueueEvent* e = event.get();
285 recordEvent(*e);
286}
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290
292setAsync(bool v)
293{
294 _checkNotNull();
295 m_p->m_is_async = v;
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
302addAsync(bool is_async) const
303{
304 _checkNotNull();
305 m_p->m_is_async = is_async;
306 return (*this);
307}
308
309/*---------------------------------------------------------------------------*/
310/*---------------------------------------------------------------------------*/
311
313isAsync() const
314{
315 if (m_p)
316 return m_p->m_is_async;
317 return false;
318}
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
331
333allocationOptions() const
334{
335 if (m_p)
336 return m_p->allocationOptions();
337 return {};
338}
339
340/*---------------------------------------------------------------------------*/
341/*---------------------------------------------------------------------------*/
342
345{
346 _checkNotNull();
347 m_p->m_memory_ressource = mem;
348}
349
350/*---------------------------------------------------------------------------*/
351/*---------------------------------------------------------------------------*/
352
354memoryRessource() const
355{
356 if (m_p)
357 return m_p->m_memory_ressource;
359}
360
361/*---------------------------------------------------------------------------*/
362/*---------------------------------------------------------------------------*/
363
364extern "C++" ePointerAccessibility
365getPointerAccessibility(RunQueue* queue, const void* ptr, PointerAttribute* ptr_attr)
366{
367 if (!queue || queue->isNull())
369 return impl::RuntimeStaticInfo::getPointerAccessibility(queue->executionPolicy(), ptr, ptr_attr);
370}
371
372extern "C++" void impl::
373arcaneCheckPointerIsAccessible(const RunQueue* queue, const void* ptr,
374 const char* name, const TraceInfo& ti)
375{
376 if (!queue || queue->isNull())
377 return;
378 return impl::RuntimeStaticInfo::checkPointerIsAcccessible(queue->executionPolicy(), ptr, name, ti);
379}
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383
384} // namespace Arcane::Accelerator
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Arguments pour la copie mémoire.
Definition Memory.h:63
Arguments pour le préfetching mémoire.
Definition Memory.h:125
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.
bool isAsync() const
Indique si la file d'exécution est asynchrone.
Definition RunQueue.cc:313
void waitEvent(RunQueueEvent &event)
Bloque l'exécution sur l'instance tant que les jobs enregistrés dans event ne sont pas terminés.
Definition RunQueue.cc:250
void copyMemory(const MemoryCopyArgs &args) const
Copie des informations entre deux zones mémoires.
Definition RunQueue.cc:230
RunQueue()
Créé une file nulle.
Definition RunQueue.cc:45
void setAsync(bool v)
Positionne l'asynchronisme de l'instance.
Definition RunQueue.cc:292
void * platformStream() const
Pointeur sur la structure interne dépendante de l'implémentation.
Definition RunQueue.cc:219
void recordEvent(RunQueueEvent &event)
Definition RunQueue.cc:271
bool isNull() const
Indique si la RunQueue est nulle.
void prefetchMemory(const MemoryPrefetchArgs &args) const
Effectue un préfetching de la mémoire.
Definition RunQueue.cc:240
MemoryAllocationOptions allocationOptions() const
Options d'allocation associée à cette file.
Definition RunQueue.cc:333
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
Definition RunQueue.cc:158
eMemoryRessource memoryRessource() const
Ressource mémoire utilisée pour les allocations avec cette instance.
Definition RunQueue.cc:354
const RunQueue & addAsync(bool is_async) const
Positionne l'asynchronisme de l'instance.
Definition RunQueue.cc:302
void setMemoryRessource(eMemoryRessource mem)
Positionne la ressource mémoire utilisée pour les allocations avec cette instance.
Definition RunQueue.cc:344
eExecutionPolicy executionPolicy() const
Politique d'exécution de la file.
Definition RunQueue.cc:168
bool isAcceleratorPolicy() const
Indique si l'instance est associée à un accélérateur.
Definition RunQueue.cc:324
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
T * get() const
Retourne l'objet référé par l'instance.
Definition AutoRef.h:189
Options pour configurer les allocations.
Espace de nom pour l'utilisation des accélérateurs.
ePointerAccessibility getPointerAccessibility(eExecutionPolicy policy, const void *ptr, PointerAttribute *ptr_attr)
Accessibilité de l'adresse ptr pour une politique d'exécutionpolicy.
ePointerAccessibility
Informations d'accessibilité d'une adresse mémoire.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ None
Aucune politique d'exécution.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
eMemoryRessource
Liste des ressources mémoire disponibles.
@ Unknown
Valeur inconnue ou non initialisée.