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"
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 ARCCORE_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 ARCCORE_THROW(ArgumentException,
"executionPolicy should not be eExecutionPolicy::None");
109 if (device.isHost() || device.isNull())
110 ARCCORE_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);
115 m_device_info = m_runtime->deviceInfoList()->deviceInfo(m_device_id.asInt32());
117 m_is_auto_prefetch_command =
false;
121 m_is_auto_prefetch_command = (v.value() != 0);
124 m_run_queue_pool.initialize(runner->_impl());
134 ARCCORE_FATAL(
"Runner is not initialized. Call method initialize() before");
143 RunQueueImplStack& s = m_run_queue_pool;
145 RunQueueImpl* q = s.top();
146 RunQueueImpl::_destroy(q);
154RunQueueImplStack* RunnerImpl::
157 return &m_run_queue_pool;
164_internalPutRunQueueImplInPool(RunQueueImpl* p)
166 RunnerImpl::Lock my_lock(
this);
173Impl::RunQueueImpl* RunnerImpl::
174_internalCreateOrGetRunQueueImpl()
178 auto pool = getPool();
181 Impl::RunnerImpl::Lock my_lock(
this);
182 if (!pool->empty()) {
183 Impl::RunQueueImpl* p = pool->top();
189 return pool->createRunQueue(RunQueueBuildInfo{});
195Impl::RunQueueImpl* RunnerImpl::
196_internalCreateOrGetRunQueueImpl(
const RunQueueBuildInfo& bi)
202 return _internalCreateOrGetRunQueueImpl();
203 Impl::IRunnerRuntime* runtime = m_runtime;
205 auto* queue =
new Impl::RunQueueImpl(
this, 0, bi);
212RunQueueImpl* RunQueueImplStack::
213createRunQueue(
const RunQueueBuildInfo& bi)
217 Int32 x = ++m_nb_created;
218 auto* q =
new Impl::RunQueueImpl(m_runner_impl, x, bi);
219 q->m_is_in_pool =
true;
226IRunQueueEventImpl* RunnerImpl::
230 return m_runtime->createEventImpl();
236IRunQueueEventImpl* RunnerImpl::
237_createEventWithTimer()
240 return m_runtime->createEventImplWithTimer();
262: m_p(std::make_shared<Impl::RunnerImpl>())
292Impl::IRunnerRuntime* Runner::
293_internalRuntime()
const
296 return m_p->runtime();
305 return m_p->executionPolicy();
314 return m_p->isInit();
342 std::cout <<
"Warning: Runner::setDeviceReducePolicy(): only 'eDeviceReducePolicy::Grid' is supported\n";
351 return m_p->m_reduce_policy;
360 m_p->initialize(
this, v,
DeviceId());
369 m_p->initialize(
this, v, device_id);
379 ARCCORE_FATAL(
"Runner is not initialized. Call method initialize() before");
388 return m_p->cumulativeCommandTime();
398 m_p->runtime()->setMemoryAdvice(buffer, advice, m_p->m_device_id);
408 m_p->runtime()->unsetMemoryAdvice(buffer, advice, m_p->m_device_id);
418 m_p->runtime()->setCurrentDevice(m_p->m_device_id);
427 return m_p->m_device_id;
442 if (device_id >= nb_device)
455 Impl::IRunnerRuntime* r = _getRuntime(policy);
456 return r->deviceInfoList();
466 return m_p->runtime()->getDeviceMemoryInfo(
deviceId());
476 m_p->runtime()->getPointerAttribute(attr, ptr);
483_isAutoPrefetchCommand()
const
485 return m_p->isAutoPrefetchCommand();
494 return m_p->_internalApi();
532 m_runner_impl->runtime()->startProfiling();
541 m_runner_impl->runtime()->stopProfiling();
550 return m_runner_impl->runtime()->isProfilingActive();
557printProfilingInfos(std::ostream& o)
559 bool is_active = isProfilingActive();
565 using Arcane::Impl::AcceleratorStatInfoList;
566 auto f = [&](
const AcceleratorStatInfoList& stat_list) {
584 return Impl::RuntimeStaticInfo::getPointerAccessibility(runner->
executionPolicy(), ptr, ptr_attr);
587extern "C++" void Impl::
588arcaneCheckPointerIsAccessible(
const Runner* runner,
const void* ptr,
593 return Impl::RuntimeStaticInfo::checkPointerIsAcccessible(runner->
executionPolicy(), ptr, name, ti);
602void Impl::IRunnerRuntime::
603_fillPointerAttribute(PointerAttribute& attribute,
605 int device,
const void* pointer,
const void* device_pointer,
606 const void* host_pointer)
608 attribute = PointerAttribute(mem_type, device, pointer, device_pointer, host_pointer);
614void Impl::IRunnerRuntime::
625 [[maybe_unused]]
const void* kernel_ptr,
626 [[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 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.