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);
115 m_is_auto_prefetch_command =
false;
118 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_ACCELERATOR_PREFETCH_COMMAND",
true))
119 m_is_auto_prefetch_command = (v.value() != 0);
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();
259: m_p(std::make_shared<impl::RunnerImpl>())
289impl::IRunnerRuntime* Runner::
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());
365 m_p->initialize(
this, v, device_id);
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;
434 Int32 nb_device = dlist->
nbDevice();
438 if (device_id >= nb_device)
451 impl::IRunnerRuntime* r = _getRuntime(policy);
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();
543printProfilingInfos(std::ostream& o)
545 bool is_active = isProfilingActive();
551 using Arcane::impl::AcceleratorStatInfoList;
552 auto f = [&](
const AcceleratorStatInfoList& stat_list) {
555 ProfilingRegistry::visitAcceleratorStat(f);
570 return impl::RuntimeStaticInfo::getPointerAccessibility(runner->
executionPolicy(), ptr, ptr_attr);
573extern "C++" void impl::
574arcaneCheckPointerIsAccessible(
const Runner* runner,
const void* ptr,
579 return impl::RuntimeStaticInfo::checkPointerIsAcccessible(runner->
executionPolicy(), ptr, name, ti);
588void impl::IRunnerRuntime::
591 int device,
const void* pointer,
const void* device_pointer,
592 const void* host_pointer)
594 attribute =
PointerAttribute(mem_type, device, pointer, device_pointer, host_pointer);
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.
virtual const DeviceInfo & deviceInfo(Int32 i) const =0
Informations du i-ème device.
virtual Int32 nbDevice() const =0
Nombre de device de la liste.
Informations sur une adresse mémoire.
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 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.