14#include "arcane/accelerator/core/Runner.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/NotImplementedException.h"
19#include "arcane/utils/ArgumentException.h"
20#include "arcane/utils/MemoryView.h"
21#include "arcane/utils/ValueConvert.h"
22#include "arcane/utils/Profiling.h"
23#include "arcane/utils/internal/ProfilingInternal.h"
25#include "arcane/accelerator/core/RunQueueBuildInfo.h"
26#include "arcane/accelerator/core/DeviceId.h"
27#include "arcane/accelerator/core/IDeviceInfoList.h"
28#include "arcane/accelerator/core/PointerAttribute.h"
29#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
30#include "arcane/accelerator/core/internal/AcceleratorCoreGlobalInternal.h"
31#include "arcane/accelerator/core/internal/RunQueueImpl.h"
32#include "arcane/accelerator/core/internal/RunnerImpl.h"
42 inline impl::IRunnerRuntime*
45 impl::IRunnerRuntime* runtime =
nullptr;
50 return impl::getSYCLRunQueueRuntime();
52 return impl::getHIPRunQueueRuntime();
54 return impl::getCUDARunQueueRuntime();
56 return impl::getSequentialRunQueueRuntime();
58 return impl::getThreadRunQueueRuntime();
63 inline impl::IRunnerRuntime*
66 auto* x = _getRuntimeNoCheck(p);
68 ARCANE_FATAL(
"No runtime is available for execution policy '{0}'", p);
75 auto* x = _getRuntimeNoCheck(p);
82 auto* x = _getRuntimeNoCheck(p);
95namespace Arcane::Accelerator::impl
107 ARCANE_THROW(ArgumentException,
"executionPolicy should not be eExecutionPolicy::None");
108 if (device.isHost() || device.isNull())
109 ARCANE_THROW(ArgumentException,
"device should not be Device::hostDevice() or Device::nullDevice()");
111 m_execution_policy = v;
112 m_device_id = device;
113 m_runtime = _getRuntime(v);
118 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_ACCELERATOR_PREFETCH_COMMAND",
true))
122 m_run_queue_pool.initialize(runner->_impl());
132 ARCANE_FATAL(
"Runner is not initialized. Call method initialize() before");
141 RunQueueImplStack& s = m_run_queue_pool;
151RunQueueImplStack* RunnerImpl::
154 return &m_run_queue_pool;
161_internalPutRunQueueImplInPool(RunQueueImpl* p)
163 RunnerImpl::Lock my_lock(
this);
170impl::RunQueueImpl* RunnerImpl::
171_internalCreateOrGetRunQueueImpl()
175 auto pool = getPool();
178 impl::RunnerImpl::Lock my_lock(
this);
179 if (!pool->empty()) {
180 impl::RunQueueImpl* p = pool->top();
186 return pool->createRunQueue(RunQueueBuildInfo{});
192impl::RunQueueImpl* RunnerImpl::
193_internalCreateOrGetRunQueueImpl(
const RunQueueBuildInfo& bi)
199 return _internalCreateOrGetRunQueueImpl();
200 impl::IRunnerRuntime* runtime = m_runtime;
202 auto* queue =
new impl::RunQueueImpl(
this, 0, bi);
209RunQueueImpl* RunQueueImplStack::
210createRunQueue(
const RunQueueBuildInfo& bi)
214 Int32 x = ++m_nb_created;
215 auto* q =
new impl::RunQueueImpl(m_runner_impl, x, bi);
216 q->m_is_in_pool =
true;
223IRunQueueEventImpl* RunnerImpl::
227 return m_runtime->createEventImpl();
233IRunQueueEventImpl* RunnerImpl::
234_createEventWithTimer()
237 return m_runtime->createEventImplWithTimer();
290_internalRuntime()
const
293 return m_p->runtime();
302 return m_p->executionPolicy();
311 return m_p->isInit();
320 m_p->setConcurrentQueueCreation(v);
329 return m_p->isConcurrentQueueCreation();
338 m_p->m_reduce_policy = v;
347 return m_p->m_reduce_policy;
356 m_p->initialize(
this, v,
DeviceId());
375 ARCANE_FATAL(
"Runner is not initialized. Call method initialize() before");
384 return m_p->cumulativeCommandTime();
394 m_p->runtime()->setMemoryAdvice(buffer,
advice, m_p->m_device_id);
404 m_p->runtime()->unsetMemoryAdvice(buffer,
advice, m_p->m_device_id);
414 m_p->runtime()->setCurrentDevice(m_p->m_device_id);
423 return m_p->m_device_id;
452 return r->deviceInfoList();
462 m_p->runtime()->getPointerAttribute(attr,
ptr);
470_isAutoPrefetchCommand()
const
472 return m_p->isAutoPrefetchCommand();
481 return m_p->_internalApi();
518 m_runner_impl->runtime()->startProfiling();
527 m_runner_impl->runtime()->stopProfiling();
536 return m_runner_impl->runtime()->isProfilingActive();
573extern "C++" void impl::
574arcaneCheckPointerIsAccessible(
const Runner* runner,
const void*
ptr,
579 return impl::RuntimeStaticInfo::checkPointerIsAcccessible(runner->
executionPolicy(),
ptr, name,
ti);
588void impl::IRunnerRuntime::
600void impl::IRunnerRuntime::
#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_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Identifiant d'un composant du système.
Int32 asInt32() const
Valeur numérique du device.
Information sur un device.
Interface d'une liste de devices.
Informations sur une adresse mémoire.
static void finalize(ITraceMng *tm)
Finalise l'exécution.
void startProfiling()
Démarre le profiling pour le runtime associé
bool isProfilingActive()
Indique si le profiling est actif pour le runtime associé
static void stopAllProfiling()
Stoppe toutes les activités de profiling.
void stopProfiling()
Stoppe le profiling pour le runtime associé
void printProfilingInfos(std::ostream &o)
Affiche les informations de profiling.
Gestionnaire d'exécution pour accélérateur.
void fillPointerAttribute(PointerAttribute &attr, const void *ptr)
Remplit attr avec les informations concernant la zone mémoire pointée par ptr.
void setConcurrentQueueCreation(bool v)
Indique si on autorise la création de RunQueue depuis plusieurs threads.
static const IDeviceInfoList * deviceInfoList(eExecutionPolicy policy)
Liste des devices pour la politique d'exécution policy.
bool isInitialized() const
Indique si l'instance a été initialisée.
Runner()
Créé un gestionnaire d'exécution non initialisé.
RunnerInternal * _internalApi()
API interne à Arcane.
double cumulativeCommandTime() const
Temps total passé dans les commandes associées à cette instance.
bool isConcurrentQueueCreation() const
Indique si la création concurrent de plusieurs RunQueue est autorisé
DeviceId deviceId() const
Device associé à cette instance.
void setDeviceReducePolicy(eDeviceReducePolicy v)
Positionne la politique d'exécution des réductions.
const DeviceInfo & deviceInfo() const
Information sur le device associé à cette instance.
void initialize(eExecutionPolicy v)
Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
void setAsCurrentDevice()
Positionne le device associé à cette instance comme le device par défaut du contexte.
eDeviceReducePolicy deviceReducePolicy() const
politique d'exécution des réductions
void setMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice)
Positionne un conseil sur la gestion d'une zone mémoire.
void unsetMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice)
Supprime un conseil sur la gestion d'une zone mémoire.
eExecutionPolicy executionPolicy() const
Politique d'exécution associée.
Interface du runtime associé à une RunQueue.
bool m_is_auto_prefetch_command
Indique si on pré-copie les données avant une commande de cette RunQueue.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
static void visitAcceleratorStat(const std::function< void(const impl::AcceleratorStatInfoList &)> &f)
Visite la liste des statistiques sur accélérateur.
Statistiques pour les accélérateurs.
Interface du gestionnaire de traces.
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.
eDeviceReducePolicy
Politique des opératations de réduction sur les accélérateurs.
ePointerAccessibility
Informations d'accessibilité d'une adresse mémoire.
@ Unknown
Accessibilité inconnue.
eMemoryAdvice
Conseils pour la gestion mémoire.
ePointerMemoryType
Type de mémoire pour un pointeur.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
@ None
Aucune politique d'exécution.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.