14#include "arccore/common/accelerator/internal/RunCommandImpl.h"
15#include "arccore/common/accelerator/internal/AcceleratorCoreGlobalInternal.h"
17#include "arccore/base/FatalErrorException.h"
18#include "arccore/base/ForLoopTraceInfo.h"
19#include "arccore/base/PlatformUtils.h"
20#include "arccore/base/Convert.h"
21#include "arccore/base/ConcurrencyBase.h"
23#include "arccore/common/accelerator/Runner.h"
24#include "arccore/common/accelerator/internal/IRunQueueEventImpl.h"
25#include "arccore/common/accelerator/internal/IRunQueueStream.h"
26#include "arccore/common/accelerator/internal/IRunnerRuntime.h"
27#include "arccore/common/accelerator/internal/RunQueueImpl.h"
28#include "arccore/common/accelerator/internal/ReduceMemoryImpl.h"
29#include "arccore/common/accelerator/internal/RunnerImpl.h"
34namespace Arcane::Accelerator::Impl
43, m_execution_policy(queue->runner()->executionPolicy())
44, m_use_accelerator(isAcceleratorPolicy(m_execution_policy))
66 while (!m_reduce_memory_pool.empty()) {
67 delete m_reduce_memory_pool.top();
68 m_reduce_memory_pool.pop();
75IRunQueueEventImpl* RunCommandImpl::
78 if (m_use_sequential_timer_event)
79 return getSequentialRunQueueRuntime()->createEventImplWithTimer();
80 return runner()->_createEventWithTimer();
97 if (m_use_accelerator && !ProfilingRegistry::hasProfiling())
98 m_use_sequential_timer_event =
true;
100 m_start_event = _createEvent();
101 m_stop_event = _createEvent();
103 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_ACCELERATOR_ALLOW_REUSE_COMMAND",
true))
104 m_is_allow_reuse_command = (v.value() != 0);
110RunCommandImpl* RunCommandImpl::
111create(RunQueueImpl* r)
113 RunCommandImpl* c = r->_internalCreateOrGetRunCommandImpl();
124notifyBeginLaunchKernel()
128 ARCCORE_FATAL(
"Command has already been launched. You can not re-use the same command.\n"
129 " You can temporarily allow it if you set environment variable\n"
130 " ARCANE_ACCELERATOR_ALLOW_REUSE_COMMAND to 1\n");
139 m_loop_one_exec_stat_ptr = &m_loop_one_exec_stat;
152notifyEndLaunchKernel()
159 m_queue->_addRunningCommand(
this);
172notifyLaunchKernelSyclEvent(
void* sycl_event_ptr)
192notifyEndExecuteKernel()
198 Int64 diff_time_ns = 0;
201 runner()->addTime((
double)diff_time_ns / 1.0e9);
221 m_nb_thread_per_block = 0;
225 m_loop_one_exec_stat.reset();
226 m_loop_one_exec_stat_ptr =
nullptr;
227 m_has_been_launched =
false;
228 m_has_living_run_command =
false;
229 m_may_be_put_in_pool =
false;
230 m_shared_memory_size = 0;
237IReduceMemoryImpl* RunCommandImpl::
238getOrCreateReduceMemoryImpl()
240 ReduceMemoryImpl* p = _getOrCreateReduceMemoryImpl();
242 m_active_reduce_memory_list.insert(p);
251releaseReduceMemoryImpl(ReduceMemoryImpl* p)
253 auto x = m_active_reduce_memory_list.find(p);
254 if (x == m_active_reduce_memory_list.end())
256 m_active_reduce_memory_list.erase(x);
257 m_reduce_memory_pool.push(p);
263IRunQueueStream* RunCommandImpl::
264internalStream()
const
266 return m_queue->_internalStream();
272RunnerImpl* RunCommandImpl::
275 return m_queue->runner();
281ReduceMemoryImpl* RunCommandImpl::
282_getOrCreateReduceMemoryImpl()
286 if (!m_use_accelerator)
289 auto& pool = m_reduce_memory_pool;
292 ReduceMemoryImpl* p = pool.top();
296 return new ReduceMemoryImpl(
this);
305_notifyDestroyRunCommand()
310 m_queue->_putInCommandPool(
this);
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Interface d'un flux d'exécution pour une RunQueue.
virtual void notifyEndLaunchKernel(RunCommandImpl &command)=0
Notification de fin de lancement de la commande.
virtual void _setSyclLastCommandEvent(void *sycl_event_ptr)
Pour SYCL, positionne l'évènement associé à la dernière commande exécutée.
virtual void notifyBeginLaunchKernel(RunCommandImpl &command)=0
Notification avant le lancement de la commande.
bool m_use_profiling
Indique si on souhaite le profiling.
bool m_may_be_put_in_pool
Indique si on peut remettre la commande dans le pool associé à la RunQueue.
bool m_is_allow_reuse_command
Indique si on autorise à utiliser plusieurs fois la même commande.
bool m_has_been_launched
Indique si la commande a été lancée.
IRunQueueEventImpl * m_start_event
Évènements pour le début et la fin de l'exécution.
Int64 m_begin_time
Temps au lancement de la commande.
IRunQueueEventImpl * m_stop_event
Évènements pour la fin de l'exécution.
File d'exécution pour accélérateur.
static const ParallelLoopOptions & defaultParallelLoopOptions()
Valeurs par défaut d'exécution d'une boucle parallèle.
Classe pour gérer le profiling d'une seule exécution d'une boucle.
void setEndTime(Int64 v)
Positionne le temps de fin de la boucle en nanoseconde.
Informations de trace pour une boucle 'for'.
static Impl::ForLoopStatInfoList * _threadLocalForLoopInstance()
static bool hasProfiling()
Indique si le profilage est actif.
Chaîne de caractères unicode.
std::int64_t Int64
Type entier signé sur 64 bits.