Arcane  v4.1.1.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 ARCCORE_COMMON_ACCELERATOR_INTERNAL_RUNNERIMPL_H
13#define ARCCORE_COMMON_ACCELERATOR_INTERNAL_RUNNERIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/common/accelerator/DeviceInfo.h"
18#include "arccore/common/accelerator/internal/RunnerInternal.h"
19
20#include <stack>
21#include <mutex>
22#include <atomic>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane::Accelerator::impl
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
34{
35 public:
36
37 void initialize(RunnerImpl* v) { m_runner_impl = v; }
38
39 public:
40
41 bool empty() const { return m_stack.empty(); }
42 void pop() { m_stack.pop(); }
43 impl::RunQueueImpl* top() { return m_stack.top(); }
44 void push(impl::RunQueueImpl* v) { m_stack.push(v); }
45
46 public:
47
48 RunQueueImpl* createRunQueue(const RunQueueBuildInfo& bi);
49
50 private:
51
52 std::stack<impl::RunQueueImpl*> m_stack;
53 std::atomic<Int32> m_nb_created = -1;
54 RunnerImpl* m_runner_impl = nullptr;
55};
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
60class RunnerImpl
61{
62 friend ::Arcane::Accelerator::Runner;
63
64 public:
65
67 class Lock
68 {
69 public:
70
71 explicit Lock(RunnerImpl* p)
72 : m_mutex_ptr(&p->m_pool_mutex)
73 {
74 m_mutex_ptr->lock();
75 }
76 ~Lock()
77 {
78 m_mutex_ptr->unlock();
79 }
80 Lock(const Lock&) = delete;
81 Lock& operator=(const Lock&) = delete;
82
83 private:
84
85 std::mutex* m_mutex_ptr = nullptr;
86 };
87
88 public:
89
90 RunnerImpl()
91 : m_internal_api(this)
92 {
93 }
94
96 {
97 _freePool();
98 }
99
100 public:
101
102 void initialize(Runner* runner, eExecutionPolicy v, DeviceId device);
103
104 public:
105
106 RunQueueImplStack* getPool();
107 void addTime(double v)
108 {
109 // 'v' est en seconde. On le convertit en nanosecond.
110 Int64 x = static_cast<Int64>(v * 1.0e9);
112 }
113 double cumulativeCommandTime() const
114 {
116 return static_cast<double>(x) / 1.0e9;
117 }
118
119 impl::IRunnerRuntime* runtime() const { return m_runtime; }
120 bool isAutoPrefetchCommand() const { return m_is_auto_prefetch_command; }
121
122 eExecutionPolicy executionPolicy() const { return m_execution_policy; }
123 bool isInit() const { return m_is_init; }
124 eDeviceReducePolicy reducePolicy() const { return m_reduce_policy; }
125 DeviceId deviceId() const { return m_device_id; }
126 const DeviceInfo& deviceInfo() const { return m_device_info; }
127
128 public:
129
130 void _internalPutRunQueueImplInPool(RunQueueImpl* p);
131 RunQueueImpl* _internalCreateOrGetRunQueueImpl();
132 RunQueueImpl* _internalCreateOrGetRunQueueImpl(const RunQueueBuildInfo& bi);
133 IRunQueueEventImpl* _createEvent();
134 IRunQueueEventImpl* _createEventWithTimer();
135 RunnerInternal* _internalApi() { return &m_internal_api; }
136
137 private:
138
139 eExecutionPolicy m_execution_policy = eExecutionPolicy::None;
140 bool m_is_init = false;
141 const eDeviceReducePolicy m_reduce_policy = eDeviceReducePolicy::Grid;
142 DeviceId m_device_id;
143 DeviceInfo m_device_info;
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
Gestionnaire d'exécution pour accélérateur.
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
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.
std::int64_t Int64
Type entier signé sur 64 bits.