Arcane  v3.15.0.0
Documentation développeur
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#include "arcane/accelerator/core/NativeStream.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::Accelerator
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38// NOTE : Les constructeurs et destructeurs doivent être dans le fichier source,
39// car le type \a m_p est opaque pour l'utilisation n'est pas connu dans
40// la définition de la classe.
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
47{
48}
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
54RunQueue(const Runner& runner)
55: m_p(impl::RunQueueImpl::create(runner._impl()))
56{
57}
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
63RunQueue(const Runner& runner, const RunQueueBuildInfo& bi)
64: m_p(impl::RunQueueImpl::create(runner._impl(), bi))
65{
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
72RunQueue(const Runner& runner, bool)
73: m_p(impl::RunQueueImpl::create(runner._impl()))
74{
75}
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
81RunQueue(const Runner& runner, const RunQueueBuildInfo& bi, bool)
82: m_p(impl::RunQueueImpl::create(runner._impl(), bi))
83{
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
90RunQueue(const RunQueue& x)
91: m_p(x.m_p)
92{
93}
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
100: m_p(x.m_p)
101{
102}
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106
108RunQueue(impl::RunQueueImpl* p)
109: m_p(p)
110{
111}
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
116RunQueue& RunQueue::
117operator=(const RunQueue& x)
118{
119 if (&x != this)
120 m_p = x.m_p;
121 return (*this);
122}
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126
127RunQueue& RunQueue::
128operator=(RunQueue&& x) noexcept
129{
130 m_p = x.m_p;
131 return (*this);
132}
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136
137RunQueue::
138~RunQueue()
139{
140}
141
142/*---------------------------------------------------------------------------*/
143/*---------------------------------------------------------------------------*/
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
148void RunQueue::
149_checkNotNull() const
150{
151 if (!m_p)
152 ARCANE_FATAL("Invalid operation on null RunQueue");
153}
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
159barrier() const
160{
161 if (m_p)
162 m_p->_internalBarrier();
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169executionPolicy() const
170{
171 if (m_p)
172 return m_p->executionPolicy();
174}
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
179impl::IRunnerRuntime* RunQueue::
180_internalRuntime() const
181{
182 return m_p->_internalRuntime();
183}
184
185/*---------------------------------------------------------------------------*/
186/*---------------------------------------------------------------------------*/
187
188impl::IRunQueueStream* RunQueue::
189_internalStream() const
190{
191 return m_p->_internalStream();
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197impl::RunCommandImpl* RunQueue::
198_getCommandImpl() const
199{
200 return m_p->_internalCreateOrGetRunCommandImpl();
201}
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205
206impl::RunQueueImpl* RunQueue::
207_internalImpl() const
208{
209 _checkNotNull();
210 return m_p.get();
211}
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
216impl::NativeStream RunQueue::
217_internalNativeStream() const
218{
219 if (m_p)
220 return m_p->_internalStream()->nativeStream();
221 return {};
222}
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
227void* RunQueue::
228platformStream() const
229{
230 return _internalNativeStream().m_native_pointer;
231}
232
233/*---------------------------------------------------------------------------*/
234/*---------------------------------------------------------------------------*/
235
237copyMemory(const MemoryCopyArgs& args) const
238{
239 _checkNotNull();
240 m_p->copyMemory(args);
241}
242
243/*---------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
245
247prefetchMemory(const MemoryPrefetchArgs& args) const
248{
249 _checkNotNull();
250 m_p->prefetchMemory(args);
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255
258{
259 _checkNotNull();
260 m_p->waitEvent(event);
261}
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
265
268{
269 RunQueueEvent* e = event.get();
271 waitEvent(*e);
272}
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
279{
280 _checkNotNull();
281 m_p->recordEvent(event);
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
289{
290 RunQueueEvent* e = event.get();
292 recordEvent(*e);
293}
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
299setAsync(bool v)
300{
301 _checkNotNull();
302 m_p->m_is_async = v;
303}
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
309addAsync(bool is_async) const
310{
311 _checkNotNull();
312 m_p->m_is_async = is_async;
313 return (*this);
314}
315
316/*---------------------------------------------------------------------------*/
317/*---------------------------------------------------------------------------*/
318
320isAsync() const
321{
322 if (m_p)
323 return m_p->m_is_async;
324 return false;
325}
326
327/*---------------------------------------------------------------------------*/
328/*---------------------------------------------------------------------------*/
329
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
340allocationOptions() const
341{
342 if (m_p)
343 return m_p->allocationOptions();
344 return {};
345}
346
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
349
352{
353 _checkNotNull();
354 m_p->m_memory_ressource = mem;
355}
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359
361memoryRessource() const
362{
363 if (m_p)
364 return m_p->m_memory_ressource;
365 return eMemoryRessource::Unknown;
366}
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
370
373{
374 _checkNotNull();
376 ARCANE_FATAL("setting concurrent command creation is not supported for RunQueue running on accelerator");
377 m_p->setConcurrentCommandCreation(v);
378}
379
380/*---------------------------------------------------------------------------*/
381/*---------------------------------------------------------------------------*/
382
385{
386 if (m_p)
387 return m_p->isConcurrentCommandCreation();
388 return false;
389}
390
391/*---------------------------------------------------------------------------*/
392/*---------------------------------------------------------------------------*/
393
394extern "C++" ePointerAccessibility
396{
397 if (!queue || queue->isNull())
399 return impl::RuntimeStaticInfo::getPointerAccessibility(queue->executionPolicy(), ptr, ptr_attr);
400}
401
402extern "C++" void impl::
403arcaneCheckPointerIsAccessible(const RunQueue* queue, const void* ptr,
404 const char* name, const TraceInfo& ti)
405{
406 if (!queue || queue->isNull())
407 return;
408 return impl::RuntimeStaticInfo::checkPointerIsAcccessible(queue->executionPolicy(), ptr, name, ti);
409}
410
411/*---------------------------------------------------------------------------*/
412/*---------------------------------------------------------------------------*/
413
414} // namespace Arcane::Accelerator
415
416/*---------------------------------------------------------------------------*/
417/*---------------------------------------------------------------------------*/
#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:320
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:257
void copyMemory(const MemoryCopyArgs &args) const
Copie des informations entre deux zones mémoires.
Definition RunQueue.cc:237
RunQueue()
Créé une file nulle.
Definition RunQueue.cc:46
void setAsync(bool v)
Positionne l'asynchronisme de l'instance.
Definition RunQueue.cc:299
void recordEvent(RunQueueEvent &event)
Definition RunQueue.cc:278
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:247
MemoryAllocationOptions allocationOptions() const
Options d'allocation associée à cette file.
Definition RunQueue.cc:340
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
Definition RunQueue.cc:159
eMemoryRessource memoryRessource() const
Ressource mémoire utilisée pour les allocations avec cette instance.
Definition RunQueue.cc:361
const RunQueue & addAsync(bool is_async) const
Positionne l'asynchronisme de l'instance.
Definition RunQueue.cc:309
void setMemoryRessource(eMemoryRessource mem)
Positionne la ressource mémoire utilisée pour les allocations avec cette instance.
Definition RunQueue.cc:351
eExecutionPolicy executionPolicy() const
Politique d'exécution de la file.
Definition RunQueue.cc:169
bool isAcceleratorPolicy() const
Indique si l'instance est associée à un accélérateur.
Definition RunQueue.cc:331
bool isConcurrentCommandCreation() const
Indique si la création concurrente de plusieurs RunCommand est autorisée.
Definition RunQueue.cc:384
void setConcurrentCommandCreation(bool v)
Indique si on autorise la création de RunCommand pour cette instance depuis plusieurs threads.
Definition RunQueue.cc:372
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:68
Interface du runtime associé à un accélérateur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
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.
eMemoryResource
Liste des ressources mémoire disponibles.