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/DeviceMemoryInfo.h"
28#include "arcane/accelerator/core/IDeviceInfoList.h"
29#include "arcane/accelerator/core/PointerAttribute.h"
30#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
31#include "arcane/accelerator/core/internal/AcceleratorCoreGlobalInternal.h"
32#include "arcane/accelerator/core/internal/RunQueueImpl.h"
33#include "arcane/accelerator/core/internal/RunnerImpl.h"
43 inline impl::IRunnerRuntime*
46 impl::IRunnerRuntime* runtime =
nullptr;
51 return impl::getSYCLRunQueueRuntime();
53 return impl::getHIPRunQueueRuntime();
55 return impl::getCUDARunQueueRuntime();
57 return impl::getSequentialRunQueueRuntime();
59 return impl::getThreadRunQueueRuntime();
64 inline impl::IRunnerRuntime*
67 auto* x = _getRuntimeNoCheck(p);
69 ARCANE_FATAL(
"No runtime is available for execution policy '{0}'", p);
76 auto* x = _getRuntimeNoCheck(p);
83 auto* x = _getRuntimeNoCheck(p);
96namespace Arcane::Accelerator::impl
108 ARCANE_THROW(ArgumentException,
"executionPolicy should not be eExecutionPolicy::None");
109 if (device.isHost() || device.isNull())
110 ARCANE_THROW(ArgumentException,
"device should not be Device::hostDevice() or Device::nullDevice()");
112 m_execution_policy = v;
113 m_device_id = device;
114 m_runtime = _getRuntime(v);
116 m_is_auto_prefetch_command =
false;
119 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_ACCELERATOR_PREFETCH_COMMAND",
true))
120 m_is_auto_prefetch_command = (v.value() != 0);
123 m_run_queue_pool.initialize(runner->_impl());
133 ARCANE_FATAL(
"Runner is not initialized. Call method initialize() before");
142 RunQueueImplStack& s = m_run_queue_pool;
144 RunQueueImpl* q = s.top();
145 RunQueueImpl::_destroy(q);
153RunQueueImplStack* RunnerImpl::
156 return &m_run_queue_pool;
163_internalPutRunQueueImplInPool(RunQueueImpl* p)
165 RunnerImpl::Lock my_lock(
this);
172impl::RunQueueImpl* RunnerImpl::
173_internalCreateOrGetRunQueueImpl()
177 auto pool = getPool();
180 impl::RunnerImpl::Lock my_lock(
this);
181 if (!pool->empty()) {
182 impl::RunQueueImpl* p = pool->top();
188 return pool->createRunQueue(RunQueueBuildInfo{});
194impl::RunQueueImpl* RunnerImpl::
195_internalCreateOrGetRunQueueImpl(
const RunQueueBuildInfo& bi)
201 return _internalCreateOrGetRunQueueImpl();
202 impl::IRunnerRuntime* runtime = m_runtime;
204 auto* queue =
new impl::RunQueueImpl(
this, 0, bi);
211RunQueueImpl* RunQueueImplStack::
212createRunQueue(
const RunQueueBuildInfo& bi)
216 Int32 x = ++m_nb_created;
217 auto* q =
new impl::RunQueueImpl(m_runner_impl, x, bi);
218 q->m_is_in_pool =
true;
225IRunQueueEventImpl* RunnerImpl::
229 return m_runtime->createEventImpl();
235IRunQueueEventImpl* RunnerImpl::
236_createEventWithTimer()
239 return m_runtime->createEventImplWithTimer();
261: m_p(std::make_shared<impl::RunnerImpl>())
291impl::IRunnerRuntime* Runner::
292_internalRuntime()
const
295 return m_p->runtime();
304 return m_p->executionPolicy();
313 return m_p->isInit();
341 std::cout <<
"Warning: Runner::setDeviceReducePolicy(): only 'eDeviceReducePolicy::Grid' is supported\n";
350 return m_p->m_reduce_policy;
359 m_p->initialize(
this, v,
DeviceId());
368 m_p->initialize(
this, v, device_id);
378 ARCANE_FATAL(
"Runner is not initialized. Call method initialize() before");
387 return m_p->cumulativeCommandTime();
397 m_p->runtime()->setMemoryAdvice(buffer, advice, m_p->m_device_id);
407 m_p->runtime()->unsetMemoryAdvice(buffer, advice, m_p->m_device_id);
417 m_p->runtime()->setCurrentDevice(m_p->m_device_id);
426 return m_p->m_device_id;
437 Int32 nb_device = dlist->
nbDevice();
441 if (device_id >= nb_device)
454 impl::IRunnerRuntime* r = _getRuntime(policy);
455 return r->deviceInfoList();
465 return m_p->runtime()->getDeviceMemoryInfo(
deviceId());
475 m_p->runtime()->getPointerAttribute(attr, ptr);
482_isAutoPrefetchCommand()
const
484 return m_p->isAutoPrefetchCommand();
493 return m_p->_internalApi();
530 m_runner_impl->runtime()->startProfiling();
539 m_runner_impl->runtime()->stopProfiling();
548 return m_runner_impl->runtime()->isProfilingActive();
555printProfilingInfos(std::ostream& o)
557 bool is_active = isProfilingActive();
563 using Arcane::impl::AcceleratorStatInfoList;
564 auto f = [&](
const AcceleratorStatInfoList& stat_list) {
567 ProfilingRegistry::visitAcceleratorStat(f);
582 return impl::RuntimeStaticInfo::getPointerAccessibility(runner->
executionPolicy(), ptr, ptr_attr);
585extern "C++" void impl::
586arcaneCheckPointerIsAccessible(
const Runner* runner,
const void* ptr,
591 return impl::RuntimeStaticInfo::checkPointerIsAcccessible(runner->
executionPolicy(), ptr, name, ti);
600void impl::IRunnerRuntime::
603 int device,
const void* pointer,
const void* device_pointer,
604 const void* host_pointer)
606 attribute =
PointerAttribute(mem_type, device, pointer, device_pointer, host_pointer);
612void 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.
Information mémoire d'un accélérateur.
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.
DeviceMemoryInfo deviceMemoryInfo() 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.
@ Grid
Utilise un noyau de calcul avec une synchronisations entre les blocs.
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.