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 throwing a FatalErrorException.
#define ARCCORE_THROW(exception_class,...)
Macro to throw an exception with formatting.
#define ARCCORE_CHECK_POINTER(ptr)
Macro that returns the pointer ptr if it is not null or throws an exception if it is null.
Identifier of a system component.
Int32 asInt32() const
Numerical value of the device.
Information about an accelerator.
Accelerator memory information.
Interface of a list of devices.
virtual const DeviceInfo & deviceInfo(Int32 i) const =0
Information about the i-th device.
virtual Int32 nbDevice() const =0
Number of devices in the list.
Information about a memory address.
Execution manager for accelerator.
void fillPointerAttribute(PointerAttribute &attr, const void *ptr)
Fills attr with information concerning the memory region pointed to by ptr.
void setConcurrentQueueCreation(bool v)
Indicates whether multiple threads are allowed to create RunQueues.
static const IDeviceInfoList * deviceInfoList(eExecutionPolicy policy)
List of devices for the execution policy policy.
bool isInitialized() const
Indicates whether the instance has been initialized.
Runner()
Creates an uninitialized execution manager.
RunnerInternal * _internalApi()
Internal API for Arcane.
double cumulativeCommandTime() const
Total time spent in commands associated with this instance.
bool isConcurrentQueueCreation() const
Indicates whether concurrent creation of multiple RunQueues is allowed.
DeviceId deviceId() const
Device associated with this instance.
void setDeviceReducePolicy(eDeviceReducePolicy v)
Sets the execution policy for reductions.
const DeviceInfo & deviceInfo() const
Information about the device associated with this instance.
DeviceMemoryInfo deviceMemoryInfo() const
Information about the device associated with this instance.
void initialize(eExecutionPolicy v)
Initializes the instance. This method must be called only once.
void setAsCurrentDevice()
Sets the device associated with this instance as the default context device.
eDeviceReducePolicy deviceReducePolicy() const
Reduction execution policy.
void setMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice)
Sets memory advice for a memory region.
void unsetMemoryAdvice(ConstMemoryView buffer, eMemoryAdvice advice)
Unsets memory advice for a memory region.
eExecutionPolicy executionPolicy() const
Associated execution policy.
Constant view on a contiguous memory region containing fixed-size elements.
static std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
static void visitAcceleratorStat(const std::function< void(const Arcane::Impl::AcceleratorStatInfoList &)> &f)
Visits the accelerator statistics list.
Namespace for accelerator usage.
ePointerAccessibility getPointerAccessibility(eExecutionPolicy policy, const void *ptr, PointerAttribute *ptr_attr)
Accessibility of address ptr for execution policypolicy.
eDeviceReducePolicy
Reduction operation policy on accelerators.
@ Grid
Uses a compute kernel with synchronization between blocks.
ePointerAccessibility
Accessibility information of a memory address.
@ Unknown
Unknown accessibility.
eMemoryAdvice
Memory management advice.
ePointerMemoryType
Memory type for a pointer.
eExecutionPolicy
Execution policy for a Runner.
@ SYCL
Execution policy using the SYCL environment.
@ HIP
Execution policy using the HIP environment.
@ None
No execution policy.
@ CUDA
Execution policy using the CUDA environment.
@ Sequential
Sequential execution policy.
@ Thread
Multi-threaded execution policy.
std::int64_t Int64
Signed integer type of 64 bits.
std::int32_t Int32
Signed integer type of 32 bits.