14#include "arccore/common/accelerator/Runner.h"
16#include "arccore/base/FatalErrorException.h"
17#include "arccore/base/NotImplementedException.h"
18#include "arccore/base/ArgumentException.h"
19#include "arccore/base/MemoryView.h"
20#include "arccore/base/Profiling.h"
21#include "arccore/base/Convert.h"
22#include "arccore/base/internal/ProfilingInternal.h"
24#include "arccore/common/accelerator/RunQueueBuildInfo.h"
25#include "arccore/common/accelerator/DeviceId.h"
26#include "arccore/common/accelerator/DeviceMemoryInfo.h"
27#include "arccore/common/accelerator/IDeviceInfoList.h"
28#include "arccore/common/accelerator/PointerAttribute.h"
29#include "arccore/common/accelerator/KernelLaunchArgs.h"
30#include "arccore/common/accelerator/internal/IRunnerRuntime.h"
31#include "arccore/common/accelerator/internal/AcceleratorCoreGlobalInternal.h"
32#include "arccore/common/accelerator/internal/RunQueueImpl.h"
33#include "arccore/common/accelerator/internal/RunnerImpl.h"
45 inline Impl::IRunnerRuntime*
48 Impl::IRunnerRuntime* runtime =
nullptr;
53 return Impl::getSYCLRunQueueRuntime();
55 return Impl::getHIPRunQueueRuntime();
57 return Impl::getCUDARunQueueRuntime();
59 return Impl::getSequentialRunQueueRuntime();
61 return Impl::getThreadRunQueueRuntime();
66 inline Impl::IRunnerRuntime*
69 auto* x = _getRuntimeNoCheck(p);
71 ARCCORE_FATAL(
"No runtime is available for execution policy '{0}'", p);
78 auto* x = _getRuntimeNoCheck(p);
85 auto* x = _getRuntimeNoCheck(p);
98namespace Arcane::Accelerator::Impl
110 ARCCORE_THROW(ArgumentException,
"executionPolicy should not be eExecutionPolicy::None");
111 if (device.isHost() || device.isNull())
112 ARCCORE_THROW(ArgumentException,
"device should not be Device::hostDevice() or Device::nullDevice()");
114 m_execution_policy = v;
115 m_device_id = device;
116 m_runtime = _getRuntime(v);
117 m_device_info = m_runtime->deviceInfoList()->deviceInfo(m_device_id.asInt32());
119 m_is_auto_prefetch_command =
false;
123 m_is_auto_prefetch_command = (v.value() != 0);
126 m_run_queue_pool.initialize(runner->_impl());
136 ARCCORE_FATAL(
"Runner is not initialized. Call method initialize() before");
145 RunQueueImplStack& s = m_run_queue_pool;
147 RunQueueImpl* q = s.top();
148 RunQueueImpl::_destroy(q);
156RunQueueImplStack* RunnerImpl::
159 return &m_run_queue_pool;
166_internalPutRunQueueImplInPool(RunQueueImpl* p)
168 RunnerImpl::Lock my_lock(
this);
175Impl::RunQueueImpl* RunnerImpl::
176_internalCreateOrGetRunQueueImpl()
180 auto pool = getPool();
183 Impl::RunnerImpl::Lock my_lock(
this);
184 if (!pool->empty()) {
185 Impl::RunQueueImpl* p = pool->top();
191 return pool->createRunQueue(RunQueueBuildInfo{});
197Impl::RunQueueImpl* RunnerImpl::
198_internalCreateOrGetRunQueueImpl(
const RunQueueBuildInfo& bi)
204 return _internalCreateOrGetRunQueueImpl();
205 Impl::IRunnerRuntime* runtime = m_runtime;
207 auto* queue =
new Impl::RunQueueImpl(
this, 0, bi);
214RunQueueImpl* RunQueueImplStack::
215createRunQueue(
const RunQueueBuildInfo& bi)
219 Int32 x = ++m_nb_created;
220 auto* q =
new Impl::RunQueueImpl(m_runner_impl, x, bi);
221 q->m_is_in_pool =
true;
228IRunQueueEventImpl* RunnerImpl::
232 return m_runtime->createEventImpl();
238IRunQueueEventImpl* RunnerImpl::
239_createEventWithTimer()
242 return m_runtime->createEventImplWithTimer();
264: m_p(std::make_shared<Impl::RunnerImpl>())
294Impl::IRunnerRuntime* Runner::
295_internalRuntime()
const
298 return m_p->runtime();
307 return m_p->executionPolicy();
316 return m_p->isInit();
344 std::cout <<
"Warning: Runner::setDeviceReducePolicy(): only 'eDeviceReducePolicy::Grid' is supported\n";
353 return m_p->m_reduce_policy;
362 m_p->initialize(
this, v,
DeviceId());
371 m_p->initialize(
this, v, device_id);
381 ARCCORE_FATAL(
"Runner is not initialized. Call method initialize() before");
390 return m_p->cumulativeCommandTime();
400 m_p->runtime()->setMemoryAdvice(buffer, advice, m_p->m_device_id);
410 m_p->runtime()->unsetMemoryAdvice(buffer, advice, m_p->m_device_id);
420 m_p->runtime()->setCurrentDevice(m_p->m_device_id);
429 return m_p->m_device_id;
444 if (device_id >= nb_device)
457 Impl::IRunnerRuntime* r = _getRuntime(policy);
458 return r->deviceInfoList();
468 return m_p->runtime()->getDeviceMemoryInfo(
deviceId());
478 m_p->runtime()->getPointerAttribute(attr, ptr);
485_isAutoPrefetchCommand()
const
487 return m_p->isAutoPrefetchCommand();
496 return m_p->_internalApi();
534 m_runner_impl->runtime()->startProfiling();
543 m_runner_impl->runtime()->stopProfiling();
552 return m_runner_impl->runtime()->isProfilingActive();
559printProfilingInfos(std::ostream& o)
561 bool is_active = isProfilingActive();
567 using Arcane::Impl::AcceleratorStatInfoList;
568 auto f = [&](
const AcceleratorStatInfoList& stat_list) {
586 return Impl::RuntimeStaticInfo::getPointerAccessibility(runner->
executionPolicy(), ptr, ptr_attr);
589extern "C++" void Impl::
590arcaneCheckPointerIsAccessible(
const Runner* runner,
const void* ptr,
595 return Impl::RuntimeStaticInfo::checkPointerIsAcccessible(runner->
executionPolicy(), ptr, name, ti);
604void Impl::IRunnerRuntime::
605_fillPointerAttribute(PointerAttribute& attribute,
607 int device,
const void* pointer,
const void* device_pointer,
608 const void* host_pointer)
610 attribute = PointerAttribute(mem_type, device, pointer, device_pointer, host_pointer);
616void Impl::IRunnerRuntime::
627 [[maybe_unused]]
const void* kernel_ptr,
628 [[maybe_unused]]
Int64 total_loop_size)
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCCORE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCCORE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Identifiant d'un composant du système.
Int32 asInt32() const
Valeur numérique du device.
Information sur un accélérateur.
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.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
static std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Interface du gestionnaire de traces.
static void visitAcceleratorStat(const std::function< void(const Arcane::Impl::AcceleratorStatInfoList &)> &f)
Visite la liste des statistiques sur accélérateur.
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.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.