Arcane  v3.16.0.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;
53class MemoryCopyArgs;
55class DeviceId;
56class DeviceInfo;
58class ProfileRegion;
59class IDeviceInfoList;
61class ViewBuildInfo;
62class RunnerInternal;
63enum class eMemoryAdvice;
64
65namespace impl
66{
67 class KernelLaunchArgs;
68 class RuntimeStaticInfo;
69 class IRunnerRuntime;
70 // typedef pour compatibilité avec anciennes versions (octobre 2022)
71 using IRunQueueRuntime = IRunnerRuntime;
72 class IRunQueueStream;
73 class RunCommandImpl;
75 class ReduceMemoryImpl;
76 class RunQueueImpl;
77 class IRunQueueEventImpl;
79 class RunnerImpl;
80 class RunQueueImplStack;
81 class NativeStream;
82 class CudaUtils;
83 class HipUtils;
84 class SyclUtils;
85} // namespace impl
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89/*!
90 * \brief Politique d'exécution pour un Runner.
91 */
93{
94 //! Aucune politique d'exécution
96 //! Politique d'exécution séquentielle
98 //! Politique d'exécution multi-thread
100 //! Politique d'exécution utilisant l'environnement CUDA
102 //! Politique d'exécution utilisant l'environnement HIP
104 //! Politique d'exécution utilisant l'environnement SYCL
106};
107
108//! Affiche le nom de la politique d'exécution
109extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT
110std::ostream&
111operator<<(std::ostream& o, eExecutionPolicy exec_policy);
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115/*!
116 * \brief Politique des opératations de réduction sur les accélérateurs
117 */
119{
120 //! Utilise des opérations atomiques entre les blocs
122 //! Utilise un noyau de calcul avec une synchronisations entre les blocs.
124};
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128/*!
129 * \brief Niveaux de priorité prédéfinis pour les files d'exécution
130 * sur les accélérateurs
131 */
132enum class eRunQueuePriority : int
133{
134 //! Utilise 0 comme valeur par défaut
136 //! Une valeur arbitraire négative pour définir une priorité élevée
137 High = -100,
138 //! Une valeur arbitraire positive pour définir une priorité faible
139 Low = 100
140};
141
142/*---------------------------------------------------------------------------*/
143/*---------------------------------------------------------------------------*/
144
145//! Type de mémoire pour un pointeur
147{
148 //NOTE: Les valeurs sont équivalentes à cudaMemoryType. Si on
149 // change ces valeurs il faut changer la fonction correspondante
150 // dans le runtime (getPointerAttribute()).
151 Unregistered = 0,
152 Host = 1,
153 Device = 2,
154 Managed = 3
155};
156
157//! Affiche le nom du type de mémoire
158extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT
159std::ostream&
160operator<<(std::ostream& o, ePointerMemoryType mem_type);
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164/*!
165 * \brief Informations d'accessibilité d'une adresse mémoire.
166 *
167 * Indique si une adresse mémoire est accessible sur un accélérateur ou
168 * sur le CPU.
169 *
170 * \sa getPointerAccessibility()
171 */
173{
174 //! Accessibilité inconnue
176 //! Non accessible
177 No = 1,
178 //! Accessible
179 Yes = 2
180};
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185//! Indique si \a exec_policy correspond à un accélérateur
186inline bool
188{
189 return exec_policy == eExecutionPolicy::CUDA || exec_policy == eExecutionPolicy::HIP || exec_policy == eExecutionPolicy::SYCL;
190}
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194/*!
195 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur la file \a queue.
196 *
197 * Si \a queue est nul, retourne ePointerAccessibility::Unknown.
198 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
199 * comme si on avait appelé Runner::fillPointerAttribute().
200 */
201extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT ePointerAccessibility
202getPointerAccessibility(RunQueue* queue, const void* ptr, PointerAttribute* ptr_attr = nullptr);
203
204/*!
205 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur \a runner.
206 *
207 * Si \a runner est nul, retourne ePointerAccessibility::Unknown.
208 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
209 * comme si on avait appelé Runner::fillPointerAttribute().
210 */
211extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT ePointerAccessibility
212getPointerAccessibility(Runner* runner, const void* ptr, PointerAttribute* ptr_attr = nullptr);
213
214/*!
215 * \brief Accessibilité de l'adresse \a ptr pour une politique d'exécution\a policy.
216 *
217 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
218 * comme si on avait appelé Runner::fillPointerAttribute().
219 */
220extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT ePointerAccessibility
221getPointerAccessibility(eExecutionPolicy policy, const void* ptr, PointerAttribute* ptr_attr = nullptr);
222
223//! Accessibilité de l'adresse \a ptr pour une exécution sur \a queue_or_runner_or_policy.
224template <typename T> inline ePointerAccessibility
225getPointerAccessibility(T& queue_or_runner_or_policy, const void* ptr, PointerAttribute* ptr_attr = nullptr)
226{
227 return getPointerAccessibility(&queue_or_runner_or_policy, ptr, ptr_attr);
228}
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
233} // namespace Arcane::Accelerator
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
238namespace Arcane::Accelerator::impl
239{
241
242/*!
243 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a queue.
244 *
245 * Lève une exception FatalErrorException si ce n'est pas le cas.
246 */
247extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT void
248arcaneCheckPointerIsAccessible(const RunQueue* queue, const void* ptr,
249 const char* name, const TraceInfo& ti);
250
251/*!
252 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a runner.
253 *
254 * Lève une exception FatalErrorException si ce n'est pas le cas.
255 */
256extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT void
257arcaneCheckPointerIsAccessible(const Runner* runner, const void* ptr,
258 const char* name, const TraceInfo& ti);
259
260/*!
261 * \brief Vérifie si \a ptr est accessible pour une exécution \a policy.
262 *
263 * Lève une exception FatalErrorException si ce n'est pas le cas.
264 */
265extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT void
266arcaneCheckPointerIsAccessible(eExecutionPolicy policy, const void* ptr,
267 const char* name, const TraceInfo& ti);
268
269inline void
270arcaneCheckPointerIsAccessible(const RunQueue& queue, const void* ptr,
271 const char* name, const TraceInfo& ti)
272{
273 arcaneCheckPointerIsAccessible(&queue, ptr, name, ti);
274}
275
276inline void
277arcaneCheckPointerIsAccessible(const Runner& runner, const void* ptr,
278 const char* name, const TraceInfo& ti)
279{
280 arcaneCheckPointerIsAccessible(&runner, ptr, name, ti);
281}
282
283} // namespace Arcane::Accelerator::impl
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287/*!
288 * \brief Macro qui vérifie si \a ptr est accessible pour une RunQueue ou un Runner.
289 *
290 * Lance une exception si ce n'est pas le cas.
291 */
292#define ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS(queue_or_runner_or_policy, ptr) \
293 ::Arcane::Accelerator::impl::arcaneCheckPointerIsAccessible((queue_or_runner_or_policy), (ptr), #ptr, A_FUNCINFO)
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
298#ifdef ARCANE_CHECK
299//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
300#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr) \
301 ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS((queue_or_runner_or_policy), (ptr))
302#else
303//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
304#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
305#endif
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310#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:403
Déclarations des types utilisés dans Arcane.
Identifiant d'un composant du système.
Definition DeviceId.h:33
Information sur un device.
Definition DeviceInfo.h:32
Information mémoire d'un accélérateur.
Interface du gestionnaire des accélérateurs.
Interface d'une liste de devices.
Arguments pour la copie mémoire.
Definition Memory.h:63
Arguments pour le préfetching mémoire.
Definition Memory.h:125
Informations sur une adresse mémoire.
Région pour le profiling.
Gestion d'une commande sur accélérateur.
Informations pour créer une RunQueue.
Evènement pour une file d'exécution.
Collection de RunQueue.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:68
Informations pour construire une vue pour les données sur accélérateur.
Type opaque pour encapsuler une 'stream' native.
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.