14#include "arcane/accelerator/core/internal/RunQueueImpl.h"
16#include "arcane/utils/FatalErrorException.h"
18#include "arcane/utils/SmallArray.h"
20#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
21#include "arcane/accelerator/core/internal/IRunQueueStream.h"
22#include "arcane/accelerator/core/internal/RunCommandImpl.h"
23#include "arcane/accelerator/core/internal/RunnerImpl.h"
24#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
25#include "arcane/accelerator/core/Runner.h"
26#include "arcane/accelerator/core/RunQueueBuildInfo.h"
27#include "arcane/accelerator/core/DeviceId.h"
28#include "arcane/accelerator/core/RunQueueEvent.h"
30#include <unordered_set>
35namespace Arcane::Accelerator::impl
48 if (
p->m_use_pool_mutex) {
49 m_mutex =
p->m_pool_mutex.get();
61 Lock& operator=(
const Lock&) =
delete;
65 std::mutex* m_mutex =
nullptr;
76, m_queue_stream(m_runtime->createStream(
bi))
87 delete m_queue_stream;
105 std::cerr <<
"Command is present several times in the command pool\n";
108 RunCommand::_internalDestroyImpl(
c);
117_destroy(RunQueueImpl* q)
119 q->_freeCommandsInPool();
138 if (!_internalStream()->_barrierNoException()) {
142 std::cerr <<
"WARNING: Error in internal accelerator barrier\n";
145 m_runner_impl->_internalPutRunQueueImplInPool(
this);
155_setDefaultMemoryRessource()
165MemoryAllocationOptions RunQueueImpl::
166allocationOptions()
const
169 Int16 device_id =
static_cast<Int16
>(m_runner_impl->deviceId().
asInt32());
170 opt.setDevice(device_id);
178isAutoPrefetchCommand()
const
180 return m_runner_impl->isAutoPrefetchCommand();
187copyMemory(
const MemoryCopyArgs& args)
const
196prefetchMemory(
const MemoryPrefetchArgs& args)
const
205recordEvent(RunQueueEvent& event)
207 auto* p =
event._internalEventImpl();
208 return p->recordQueue(_internalStream());
215waitEvent(RunQueueEvent& event)
217 auto* p =
event._internalEventImpl();
218 return p->waitForEvent(_internalStream());
224RunQueueImpl* RunQueueImpl::
227 return _reset(r->_internalCreateOrGetRunQueueImpl());
233RunQueueImpl* RunQueueImpl::
234create(RunnerImpl* r,
const RunQueueBuildInfo& bi)
236 return _reset(r->_internalCreateOrGetRunQueueImpl(bi));
242RunCommandImpl* RunQueueImpl::
243_internalCreateOrGetRunCommandImpl()
245 RunCommandImpl* p =
nullptr;
256 p = RunCommand::_internalCreateImpl(
this);
272 if (m_use_pool_mutex) {
284 p->notifyEndExecuteKernel();
295 p->notifyEndExecuteKernel();
317 if (
p->m_has_living_run_command)
318 p->m_may_be_put_in_pool =
true;
337_putInCommandPool(RunCommandImpl*
p)
367 p->m_is_async =
false;
368 p->_setDefaultMemoryRessource();
376setConcurrentCommandCreation(
bool v)
378 m_use_pool_mutex = v;
379 if (!m_pool_mutex.get())
380 m_pool_mutex = std::make_unique<std::mutex>();
387dumpStats(std::ostream&
ostr)
const
Fonctions de gestion mémoire et des allocateurs.
Int32 asInt32() const
Valeur numérique du device.
Informations pour créer une RunQueue.
virtual void barrier()=0
Bloque jusqu'à ce que toutes les actions associées à cette file soient terminées.
virtual void prefetchMemory(const MemoryPrefetchArgs &args)=0
Effectue un pré-chargement d'une zone mémoire.
virtual void copyMemory(const MemoryCopyArgs &args)=0
Effectue une copie entre deux zones mémoire.
Implémentation d'une commande pour accélérateur.
Verrou pour le pool de RunCommand en multi-thread.
File d'exécution pour accélérateur.
void _checkPutCommandInPoolNoLock(RunCommandImpl *p)
Remet la commande dans le pool si possible.
static RunQueueImpl * _reset(RunQueueImpl *p)
Réinitialise l'implémentation.
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.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
std::int32_t Int32
Type entier signé sur 32 bits.