Arcane  v3.15.0.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-2025 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-2025 */
9/* */
10/* Implémentation d'un 'Runner'. */
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 : m_mutex_ptr(&p->m_pool_mutex)
75 {
76 m_mutex_ptr->lock();
77 }
78 ~Lock()
79 {
80 m_mutex_ptr->unlock();
81 }
82 Lock(const Lock&) = delete;
83 Lock& operator=(const Lock&) = delete;
84
85 private:
86
87 std::mutex* m_mutex_ptr = nullptr;
88 };
89
90 public:
91
93 : m_internal_api(this)
94 {
95 }
96
98 {
99 _freePool();
100 }
101
102 public:
103
104 void initialize(Runner* runner, eExecutionPolicy v, DeviceId device);
105
106 public:
107
108 RunQueueImplStack* getPool();
109 void addTime(double v)
110 {
111 // 'v' est en seconde. On le convertit en nanosecond.
112 Int64 x = static_cast<Int64>(v * 1.0e9);
114 }
115 double cumulativeCommandTime() const
116 {
118 return static_cast<double>(x) / 1.0e9;
119 }
120
121 impl::IRunnerRuntime* runtime() const { return m_runtime; }
122 bool isAutoPrefetchCommand() const { return m_is_auto_prefetch_command; }
123
124 eExecutionPolicy executionPolicy() const { return m_execution_policy; }
125 bool isInit() const { return m_is_init; }
126 eDeviceReducePolicy reducePolicy() const { return m_reduce_policy; }
127 DeviceId deviceId() const { return m_device_id; }
128
129 public:
130
131 void _internalPutRunQueueImplInPool(RunQueueImpl* p);
132 RunQueueImpl* _internalCreateOrGetRunQueueImpl();
133 RunQueueImpl* _internalCreateOrGetRunQueueImpl(const RunQueueBuildInfo& bi);
134 IRunQueueEventImpl* _createEvent();
135 IRunQueueEventImpl* _createEventWithTimer();
136 RunnerInternal* _internalApi() { return &m_internal_api; }
137
138 private:
139
140 eExecutionPolicy m_execution_policy = eExecutionPolicy::None;
141 bool m_is_init = false;
142 const eDeviceReducePolicy m_reduce_policy = eDeviceReducePolicy::Grid;
143 DeviceId m_device_id;
144 impl::IRunnerRuntime* m_runtime = nullptr;
145 RunQueueImplStack m_run_queue_pool;
146 std::mutex m_pool_mutex;
151 std::atomic<Int64> m_cumulative_command_time = 0;
152
155
156 RunnerInternal m_internal_api;
157
158 private:
159
160 void _freePool();
161 void _checkIsInit() const;
162};
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
167} // namespace Arcane::Accelerator::impl
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
172#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:68
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:154
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:151
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
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.
std::int64_t Int64
Type entier signé sur 64 bits.