14#include "arcane/accelerator/core/internal/RunQueueImpl.h"
17#include "arcane/utils/SmallArray.h"
19#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
20#include "arcane/accelerator/core/internal/IRunQueueStream.h"
21#include "arcane/accelerator/core/internal/RunCommandImpl.h"
22#include "arcane/accelerator/core/internal/RunnerImpl.h"
23#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
24#include "arcane/accelerator/core/Runner.h"
25#include "arcane/accelerator/core/DeviceId.h"
26#include "arcane/accelerator/core/RunQueueEvent.h"
27#include "arcane/accelerator/core/KernelLaunchArgs.h"
29#include <unordered_set>
34namespace Arcane::Accelerator::impl
45 explicit Lock(RunQueueImpl* p)
47 if (p->m_use_pool_mutex) {
48 m_mutex = p->m_pool_mutex.get();
59 Lock(
const Lock&) =
delete;
60 Lock& operator=(
const Lock&) =
delete;
64 std::mutex* m_mutex =
nullptr;
72: m_runner_impl(runner_impl)
73, m_execution_policy(runner_impl->executionPolicy())
74, m_runtime(runner_impl->runtime())
75, m_queue_stream(m_runtime->createStream(bi))
86 delete m_queue_stream;
99 std::unordered_set<RunCommandImpl*> command_set;
103 if (command_set.find(c) != command_set.end())
104 std::cerr <<
"Command is present several times in the command pool\n";
105 command_set.insert(c);
107 RunCommand::_internalDestroyImpl(c);
116_destroy(RunQueueImpl* q)
118 q->_freeCommandsInPool();
137 if (!_internalStream()->_barrierNoException()) {
141 std::cerr <<
"WARNING: Error in internal accelerator barrier\n";
144 m_runner_impl->_internalPutRunQueueImplInPool(
this);
146 RunQueueImpl::_destroy(
this);
154_setDefaultMemoryRessource()
164MemoryAllocationOptions RunQueueImpl::
165allocationOptions()
const
168 Int16 device_id =
static_cast<Int16>(m_runner_impl->deviceId().asInt32());
169 opt.setDevice(device_id);
177isAutoPrefetchCommand()
const
179 return m_runner_impl->isAutoPrefetchCommand();
186copyMemory(
const MemoryCopyArgs& args)
const
188 _internalStream()->copyMemory(args);
195prefetchMemory(
const MemoryPrefetchArgs& args)
const
197 _internalStream()->prefetchMemory(args);
204recordEvent(RunQueueEvent& event)
206 auto* p =
event._internalEventImpl();
207 return p->recordQueue(_internalStream());
214waitEvent(RunQueueEvent& event)
216 auto* p =
event._internalEventImpl();
217 return p->waitForEvent(_internalStream());
223RunQueueImpl* RunQueueImpl::
226 return _reset(r->_internalCreateOrGetRunQueueImpl());
232RunQueueImpl* RunQueueImpl::
233create(RunnerImpl* r,
const RunQueueBuildInfo& bi)
235 return _reset(r->_internalCreateOrGetRunQueueImpl(bi));
241RunCommandImpl* RunQueueImpl::
242_internalCreateOrGetRunCommandImpl()
244 RunCommandImpl* p =
nullptr;
255 p = RunCommand::_internalCreateImpl(
this);
271 if (m_use_pool_mutex) {
282 for (RunCommandImpl* p : command_list) {
283 p->notifyEndExecuteKernel();
287 for (RunCommandImpl* p : command_list) {
294 p->notifyEndExecuteKernel();
336_putInCommandPool(RunCommandImpl* p)
350 _internalStream()->barrier();
367 p->_setDefaultMemoryRessource();
375setConcurrentCommandCreation(
bool v)
377 m_use_pool_mutex = v;
378 if (!m_pool_mutex.get())
379 m_pool_mutex = std::make_unique<std::mutex>();
386dumpStats(std::ostream& ostr)
const
Fonctions de gestion mémoire et des allocateurs.
Informations pour créer une RunQueue.
Implémentation d'une commande pour accélérateur.
bool m_may_be_put_in_pool
Indique si on peut remettre la commande dans le pool associé à la RunQueue.
bool m_has_living_run_command
Indique si une RunCommand a une référence sur cette instance.
Verrou pour le pool de RunCommand en multi-thread.
void _checkPutCommandInPoolNoLock(RunCommandImpl *p)
Remet la commande dans le pool si possible.
static RunQueueImpl * _reset(RunQueueImpl *p)
Réinitialise l'implémentation.
bool m_is_async
Indique si la file est asynchrone.
eMemoryRessource m_memory_ressource
Ressource mémoire par défaut.
void _internalBarrier()
Bloque jusqu'à ce que toutes les commandes soient terminées.
std::stack< RunCommandImpl * > m_run_command_pool
Pool de commandes.
Int32 m_id
Identifiant de la file.
UniqueArray< RunCommandImpl * > m_active_run_command_list
Liste des commandes en cours d'exécution.
void _internalFreeRunningCommands()
Libère les commandes en cours d'exécution.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Tableau 1D de données avec buffer pré-alloué sur la pile.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
MemoryAllocationOptions getAllocationOptions(eMemoryResource mem_resource)
Allocation par défaut pour la ressource mem_resource.
eMemoryResource getDefaultDataMemoryResource()
Ressource mémoire utilisée par l'allocateur par défaut pour les données.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.