Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
core/internal/RunQueueImpl.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/* RunQueueImpl.h (C) 2000-2024 */
9/* */
10/* Implémentation d'une 'RunQueue'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_CORE_INTERNAL_RUNQUEUEIMPL_H
13#define ARCANE_ACCELERATOR_CORE_INTERNAL_RUNQUEUEIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arcane/utils/Array.h"
20#include "arcane/utils/MemoryRessource.h"
21
22#include <stack>
23#include <atomic>
24#include <mutex>
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane::Accelerator::impl
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
41class ARCANE_ACCELERATOR_CORE_EXPORT RunQueueImpl
42{
43 friend class Arcane::Accelerator::Runner;
45 friend class RunCommandImpl;
46 friend class RunQueueImplStack;
47 friend class RunnerImpl;
48
49 class Lock;
50
51 private:
52
54
55 private:
56
57 // Il faut utiliser _destroy() pour détruire l'instance.
59
60 public:
61
62 RunQueueImpl(const RunQueueImpl&) = delete;
63 RunQueueImpl(RunQueueImpl&&) = delete;
64 RunQueueImpl& operator=(const RunQueueImpl&) = delete;
65 RunQueueImpl& operator=(RunQueueImpl&&) = delete;
66
67 public:
68
69 static RunQueueImpl* create(RunnerImpl* r, const RunQueueBuildInfo& bi);
70 static RunQueueImpl* create(RunnerImpl* r);
71
72 public:
73
74 eExecutionPolicy executionPolicy() const { return m_execution_policy; }
75 RunnerImpl* runner() const { return m_runner_impl; }
76 MemoryAllocationOptions allocationOptions() const;
77 bool isAutoPrefetchCommand() const;
78
79 void copyMemory(const MemoryCopyArgs& args) const;
80 void prefetchMemory(const MemoryPrefetchArgs& args) const;
81
82 void recordEvent(RunQueueEvent& event);
83 void waitEvent(RunQueueEvent& event);
84
85 void setConcurrentCommandCreation(bool v);
86 bool isConcurrentCommandCreation() const { return m_use_pool_mutex; }
87
88 void dumpStats(std::ostream& ostr) const;
89 bool isAsync() const { return m_is_async; }
90
91 void _internalBarrier();
92 IRunnerRuntime* _internalRuntime() const { return m_runtime; }
93 IRunQueueStream* _internalStream() const { return m_queue_stream; }
94
95 public:
96
97 void addRef()
98 {
99 ++m_nb_ref;
100 }
101 void removeRef()
102 {
103 Int32 v = std::atomic_fetch_add(&m_nb_ref, -1);
104 if (v == 1)
105 _release();
106 }
107
108 private:
109
110 RunCommandImpl* _internalCreateOrGetRunCommandImpl();
111 void _internalFreeRunningCommands();
112 bool _isInPool() const { return m_is_in_pool; }
113 void _release();
114 void _setDefaultMemoryRessource();
115 void _addRunningCommand(RunCommandImpl* p);
116 void _putInCommandPool(RunCommandImpl* p);
117 void _freeCommandsInPool();
118 void _checkPutCommandInPoolNoLock(RunCommandImpl* p);
119 static RunQueueImpl* _reset(RunQueueImpl* p);
120 static void _destroy(RunQueueImpl* q);
121
122 private:
123
124 RunnerImpl* m_runner_impl = nullptr;
125 eExecutionPolicy m_execution_policy = eExecutionPolicy::None;
126 IRunnerRuntime* m_runtime = nullptr;
127 IRunQueueStream* m_queue_stream = nullptr;
129 std::stack<RunCommandImpl*> m_run_command_pool;
133 Int32 m_id = 0;
135 bool m_is_in_pool = false;
137 std::atomic<Int32> m_nb_ref = 0;
139 bool m_is_async = false;
141 eMemoryRessource m_memory_ressource = eMemoryRessource::Unknown;
142
143 // Mutex pour les commandes (actif si \a m_use_pool_mutex est vrai)
144 std::unique_ptr<std::mutex> m_pool_mutex;
145 bool m_use_pool_mutex = false;
146};
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151} // namespace Arcane::Accelerator::impl
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156#endif
Arguments pour la copie mémoire.
Definition Memory.h:63
Arguments pour le préfetching mémoire.
Definition Memory.h:125
Informations pour créer une RunQueue.
Evènement pour une file d'exécution.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:68
Interface d'un flux d'exécution pour une RunQueue.
Interface du runtime associé à un accélérateur.
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.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Options pour configurer les allocations.
eExecutionPolicy
Politique d'exécution pour un Runner.
eMemoryResource
Liste des ressources mémoire disponibles.
std::int32_t Int32
Type entier signé sur 32 bits.