Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
AcceleratorCoreGlobal.h
Aller à la documentation de ce fichier.
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/* AcceleratorCoreGlobal.h (C) 2000-2024 */
9/* */
10/* Déclarations générales pour le support des accélérateurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_CORE_ACCELERATORCOREGLOBAL_H
13#define ARCANE_ACCELERATOR_CORE_ACCELERATORCOREGLOBAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include <iosfwd>
20
21/*!
22 * \file AcceleratorCoreGlobal.h
23 *
24 * Ce fichier contient les déclarations des types de la composante
25 * 'arcane_accelerator_core'.
26 */
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30#ifdef ARCANE_COMPONENT_arcane_accelerator_core
31#define ARCANE_ACCELERATOR_CORE_EXPORT ARCANE_EXPORT
32#else
33#define ARCANE_ACCELERATOR_CORE_EXPORT ARCANE_IMPORT
34#endif
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
39namespace Arcane::Accelerator
40{
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45class IAcceleratorMng;
46class Runner;
47class RunQueue;
48class RunQueuePool;
49class RunCommand;
50class RunQueueEvent;
51class AcceleratorRuntimeInitialisationInfo;
52class RunQueueBuildInfo;
53class MemoryCopyArgs;
54class MemoryPrefetchArgs;
55class DeviceId;
56class DeviceInfo;
57class ProfileRegion;
58class IDeviceInfoList;
59class PointerAttribute;
60class ViewBuildInfo;
61class RunnerInternal;
62enum class eMemoryAdvice;
63
64namespace impl
65{
66 class RuntimeStaticInfo;
67 class IRunnerRuntime;
68 // typedef pour compatibilité avec anciennes versions (octobre 2022)
69 using IRunQueueRuntime = IRunnerRuntime;
70 class IRunQueueStream;
71 class RunCommandImpl;
72 class IReduceMemoryImpl;
73 class ReduceMemoryImpl;
74 class RunQueueImpl;
75 class IRunQueueEventImpl;
76 class RunCommandLaunchInfo;
77 class RunnerImpl;
78 class RunQueueImplStack;
79} // namespace impl
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
83/*!
84 * \brief Politique d'exécution pour un Runner.
85 */
87{
88 //! Aucune politique d'exécution
89 None,
90 //! Politique d'exécution séquentielle
92 //! Politique d'exécution multi-thread
93 Thread,
94 //! Politique d'exécution utilisant l'environnement CUDA
95 CUDA,
96 //! Politique d'exécution utilisant l'environnement HIP
97 HIP,
98 //! Politique d'exécution utilisant l'environnement SYCL
99 SYCL
100};
101
102//! Affiche le nom de la politique d'exécution
103extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT
104std::ostream&
105operator<<(std::ostream& o, eExecutionPolicy exec_policy);
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109/*!
110 * \brief Politique des opératations de réduction sur les accélérateurs
111 */
113{
114 //! Utilise des opérations atomiques entre les blocs
115 Atomic = 1,
116 //! Utilise un noyau de calcul avec une synchronisations entre les blocs.
117 Grid = 2
118};
119
120/*---------------------------------------------------------------------------*/
121/*---------------------------------------------------------------------------*/
122/*!
123 * \brief Niveaux de priorité prédéfinis pour les files d'exécution
124 * sur les accélérateurs
125 */
126enum class eRunQueuePriority : int
127{
128 //! Utilise 0 comme valeur par défaut
129 Default = 0,
130 //! Une valeur arbitraire négative pour définir une priorité élevée
131 High = -100,
132 //! Une valeur arbitraire positive pour définir une priorité faible
133 Low = 100
134};
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
138
139//! Type de mémoire pour un pointeur
141{
142 //NOTE: Les valeurs sont équivalentes à cudaMemoryType. Si on
143 // change ces valeurs il faut changer la fonction correspondante
144 // dans le runtime (getPointerAttribute()).
145 Unregistered = 0,
146 Host = 1,
147 Device = 2,
148 Managed = 3
149};
150
151//! Affiche le nom du type de mémoire
152extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT
153std::ostream&
154operator<<(std::ostream& o, ePointerMemoryType mem_type);
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158/*!
159 * \brief Informations d'accessibilité d'une adresse mémoire.
160 *
161 * Indique si une adresse mémoire est accessible sur un accélérateur ou
162 * sur le CPU.
163 *
164 * \sa getPointerAccessibility()
165 */
167{
168 //! Accessibilité inconnue
169 Unknown = 0,
170 //! Non accessible
171 No = 1,
172 //! Accessible
173 Yes = 2
174};
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
179//! Indique si \a exec_policy correspond à un accélérateur
180inline bool
182{
183 return exec_policy == eExecutionPolicy::CUDA || exec_policy == eExecutionPolicy::HIP || exec_policy == eExecutionPolicy::SYCL;
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188/*!
189 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur la file \a queue.
190 *
191 * Si \a queue est nul, retourne ePointerAccessibility::Unknown.
192 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
193 * comme si on avait appelé Runner::fillPointerAttribute().
194 */
195extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT ePointerAccessibility
196getPointerAccessibility(RunQueue* queue, const void* ptr, PointerAttribute* ptr_attr = nullptr);
197
198/*!
199 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur \a runner.
200 *
201 * Si \a runner est nul, retourne ePointerAccessibility::Unknown.
202 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
203 * comme si on avait appelé Runner::fillPointerAttribute().
204 */
205extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT ePointerAccessibility
206getPointerAccessibility(Runner* runner, const void* ptr, PointerAttribute* ptr_attr = nullptr);
207
208/*!
209 * \brief Accessibilité de l'adresse \a ptr pour une politique d'exécution\a policy.
210 *
211 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
212 * comme si on avait appelé Runner::fillPointerAttribute().
213 */
214extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT ePointerAccessibility
215getPointerAccessibility(eExecutionPolicy policy, const void* ptr, PointerAttribute* ptr_attr = nullptr);
216
217//! Accessibilité de l'adresse \a ptr pour une exécution sur \a queue_or_runner_or_policy.
218template <typename T> inline ePointerAccessibility
219getPointerAccessibility(T& queue_or_runner_or_policy, const void* ptr, PointerAttribute* ptr_attr = nullptr)
220{
221 return getPointerAccessibility(&queue_or_runner_or_policy, ptr, ptr_attr);
222}
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
227} // namespace Arcane::Accelerator
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
231
232namespace Arcane::Accelerator::impl
233{
235
236/*!
237 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a queue.
238 *
239 * Lève une exception FatalErrorException si ce n'est pas le cas.
240 */
241extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT void
242arcaneCheckPointerIsAccessible(const RunQueue* queue, const void* ptr,
243 const char* name, const TraceInfo& ti);
244
245/*!
246 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a runner.
247 *
248 * Lève une exception FatalErrorException si ce n'est pas le cas.
249 */
250extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT void
251arcaneCheckPointerIsAccessible(const Runner* runner, const void* ptr,
252 const char* name, const TraceInfo& ti);
253
254/*!
255 * \brief Vérifie si \a ptr est accessible pour une exécution \a policy.
256 *
257 * Lève une exception FatalErrorException si ce n'est pas le cas.
258 */
259extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT void
260arcaneCheckPointerIsAccessible(eExecutionPolicy policy, const void* ptr,
261 const char* name, const TraceInfo& ti);
262
263inline void
264arcaneCheckPointerIsAccessible(const RunQueue& queue, const void* ptr,
265 const char* name, const TraceInfo& ti)
266{
267 arcaneCheckPointerIsAccessible(&queue, ptr, name, ti);
268}
269
270inline void
271arcaneCheckPointerIsAccessible(const Runner& runner, const void* ptr,
272 const char* name, const TraceInfo& ti)
273{
274 arcaneCheckPointerIsAccessible(&runner, ptr, name, ti);
275}
276
277} // namespace Arcane::Accelerator::impl
278
279/*---------------------------------------------------------------------------*/
280/*---------------------------------------------------------------------------*/
281/*!
282 * \brief Macro qui vérifie si \a ptr est accessible pour une RunQueue ou un Runner.
283 *
284 * Lance une exception si ce n'est pas le cas.
285 */
286#define ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS(queue_or_runner_or_policy, ptr) \
287 ::Arcane::Accelerator::impl::arcaneCheckPointerIsAccessible((queue_or_runner_or_policy), (ptr), #ptr, A_FUNCINFO)
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291
292#ifdef ARCANE_CHECK
293//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
294#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr) \
295 ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS((queue_or_runner_or_policy), (ptr))
296#else
297//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
298#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
299#endif
300
301/*---------------------------------------------------------------------------*/
302/*---------------------------------------------------------------------------*/
303
304#endif
void arcaneCheckPointerIsAccessible(const RunQueue *queue, const void *ptr, const char *name, const TraceInfo &ti)
Vérifie si ptr est accessible pour une exécution sur queue.
Definition RunQueue.cc:373
Déclarations des types utilisés dans Arcane.
Informations sur une adresse mémoire.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
Espace de nom pour l'utilisation des accélérateurs.
ePointerAccessibility getPointerAccessibility(eExecutionPolicy policy, const void *ptr, PointerAttribute *ptr_attr)
Accessibilité de l'adresse ptr pour une politique d'exécutionpolicy.
std::ostream & operator<<(std::ostream &o, eExecutionPolicy exec_policy)
Affiche le nom de la politique d'exécution.
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.
@ Atomic
Utilise des opérations atomiques entre les blocs.
ePointerAccessibility
Informations d'accessibilité d'une adresse mémoire.
eMemoryAdvice
Conseils pour la gestion mémoire.
Definition Memory.h:36
ePointerMemoryType
Type de mémoire pour un pointeur.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
@ None
Aucune politique d'exécution.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.
eRunQueuePriority
Niveaux de priorité prédéfinis pour les files d'exécution sur les accélérateurs.
@ Low
Une valeur arbitraire positive pour définir une priorité faible.
@ High
Une valeur arbitraire négative pour définir une priorité élevée.
@ Default
Utilise 0 comme valeur par défaut.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
@ Host
Alloue sur l'hôte.
@ Device
Alloue sur le device.