Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
RunnerImpl.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* RunnerImpl.h (C) 2000-2024 */
9/* */
10/* Implémentation d'une 'RunQueue'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_CORE_INTERNAL_RUNNERIMPL_H
13#define ARCANE_ACCELERATOR_CORE_INTERNAL_RUNNERIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arcane/accelerator/core/DeviceId.h"
20#include "arcane/accelerator/core/internal/RunnerInternal.h"
21
22#include <stack>
23#include <mutex>
24#include <atomic>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane::Accelerator::impl
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
36{
37 public:
38
39 void initialize(RunnerImpl* v) { m_runner_impl = v; }
40
41 public:
42
43 bool empty() const { return m_stack.empty(); }
44 void pop() { m_stack.pop(); }
45 impl::RunQueueImpl* top() { return m_stack.top(); }
46 void push(impl::RunQueueImpl* v) { m_stack.push(v); }
47
48 public:
49
50 RunQueueImpl* createRunQueue(const RunQueueBuildInfo& bi);
51
52 private:
53
54 std::stack<impl::RunQueueImpl*> m_stack;
55 std::atomic<Int32> m_nb_created = -1;
56 RunnerImpl* m_runner_impl = nullptr;
57};
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
63{
64 friend ::Arcane::Accelerator::Runner;
65
66 public:
67
69 class Lock
70 {
71 public:
72
73 explicit Lock(RunnerImpl* p)
74 {
75 if (p->m_use_pool_mutex) {
76 m_mutex = p->m_pool_mutex.get();
77 if (m_mutex)
78 m_mutex->lock();
79 }
80 }
81 ~Lock()
82 {
83 if (m_mutex)
84 m_mutex->unlock();
85 }
86 Lock(const Lock&) = delete;
87 Lock& operator=(const Lock&) = delete;
88
89 private:
90
91 std::mutex* m_mutex = nullptr;
92 };
93
94 public:
95
97 : m_internal_api(this)
98 {
99 }
100
102 {
103 _freePool();
104 }
105
106 public:
107
108 void initialize(Runner* runner, eExecutionPolicy v, DeviceId device);
109
110 void setConcurrentQueueCreation(bool v)
111 {
112 m_use_pool_mutex = v;
113 if (!m_pool_mutex.get())
114 m_pool_mutex = std::make_unique<std::mutex>();
115 }
116 bool isConcurrentQueueCreation() const { return m_use_pool_mutex; }
117
118 public:
119
120 RunQueueImplStack* getPool();
121 void addTime(double v)
122 {
123 // 'v' est en seconde. On le convertit en nanosecond.
124 Int64 x = static_cast<Int64>(v * 1.0e9);
126 }
127 double cumulativeCommandTime() const
128 {
130 return static_cast<double>(x) / 1.0e9;
131 }
132
133 impl::IRunnerRuntime* runtime() const { return m_runtime; }
134 bool isAutoPrefetchCommand() const { return m_is_auto_prefetch_command; }
135
136 eExecutionPolicy executionPolicy() const { return m_execution_policy; }
137 bool isInit() const { return m_is_init; }
138 eDeviceReducePolicy reducePolicy() const { return m_reduce_policy; }
139 DeviceId deviceId() const { return m_device_id; }
140
141 public:
142
143 void _internalPutRunQueueImplInPool(RunQueueImpl* p);
144 RunQueueImpl* _internalCreateOrGetRunQueueImpl();
145 RunQueueImpl* _internalCreateOrGetRunQueueImpl(const RunQueueBuildInfo& bi);
146 IRunQueueEventImpl* _createEvent();
147 IRunQueueEventImpl* _createEventWithTimer();
148 RunnerInternal* _internalApi() { return &m_internal_api; }
149
150 private:
151
152 eExecutionPolicy m_execution_policy = eExecutionPolicy::None;
153 bool m_is_init = false;
155 DeviceId m_device_id;
156 impl::IRunnerRuntime* m_runtime = nullptr;
157 RunQueueImplStack m_run_queue_pool;
158 std::unique_ptr<std::mutex> m_pool_mutex;
159 bool m_use_pool_mutex = false;
164 std::atomic<Int64> m_cumulative_command_time = 0;
165
168
169 RunnerInternal m_internal_api;
170
171 private:
172
173 void _freePool();
174 void _checkIsInit() const;
175};
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
180} // namespace Arcane::Accelerator::impl
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185#endif
Identifiant d'un composant du système.
Definition DeviceId.h:33
Informations pour créer une RunQueue.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
File d'exécution pour accélérateur.
Verrou pour le pool de RunQueue en multi-thread.
Definition RunnerImpl.h:70
bool m_is_auto_prefetch_command
Indique si on pré-copie les données avant une commande de cette RunQueue.
Definition RunnerImpl.h:167
std::atomic< Int64 > m_cumulative_command_time
Temps passé dans le noyau en nano-seconde. On utilise un 'Int64' car les atomiques sur les flottants ...
Definition RunnerImpl.h:164
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
eDeviceReducePolicy
Politique des opératations de réduction sur les accélérateurs.
@ Grid
Utilise un noyau de calcul avec une synchronisations entre les blocs.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ None
Aucune politique d'exécution.