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"
51 return Impl::getSYCLRunQueueRuntime();
53 return Impl::getHIPRunQueueRuntime();
55 return Impl::getCUDARunQueueRuntime();
57 return Impl::getSequentialRunQueueRuntime();
59 return Impl::getThreadRunQueueRuntime();
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());
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);
157 return &m_run_queue_pool;
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);
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;
230 return m_runtime->createEventImpl();
237_createEventWithTimer()
240 return m_runtime->createEventImplWithTimer();
251namespace Arcane::Accelerator
262: m_p(std::make_shared<Impl::RunnerImpl>())
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)
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();
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::
615_fillPointerAttribute(PointerAttribute& attribute,
const void* pointer)
617 attribute = PointerAttribute(pointer);
623Impl::KernelLaunchArgs Impl::IRunnerRuntime::
624computeKernalLaunchArgs(
const Impl::KernelLaunchArgs& orig_args,
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.
Interface for event implementation.
Interface of the runtime associated with an accelerator.
Execution queue for accelerator.
bool m_is_auto_prefetch_command
Indicates whether data is pre-copied before a command in this RunQueue.
Information about a memory address.
static void finalize(ITraceMng *tm)
Finalizes execution.
void startProfiling()
Starts profiling for the associated runtime.
bool isProfilingActive()
Indicates whether profiling is active for the associated runtime.
static void stopAllProfiling()
Stops all profiling activities.
void stopProfiling()
Stops profiling for the associated runtime.
void printProfilingInfos(std::ostream &o)
Displays profiling information.
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)
Statistics for accelerators.
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.