Arcane  v4.1.1.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CommonAcceleratorGlobal.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/* AcceleratorCoreGlobal.h (C) 2000-2025 */
9/* */
10/* Déclarations générales pour le support des accélérateurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_COMMON_ACCELERATOR_COMMONACCELERATORCOREGLOBAL_H
13#define ARCCORE_COMMON_ACCELERATOR_COMMONACCELERATORCOREGLOBAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/common/CommonGlobal.h"
18#include "arccore/trace/TraceGlobal.h"
19
20#include <iosfwd>
21
22/*!
23 * \file AcceleratorCoreGlobal.h
24 *
25 * Ce fichier contient les déclarations des types de la composante
26 * 'arcane_accelerator_core'.
27 */
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34namespace Arcane::Accelerator
35{
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40class IAcceleratorMng;
41class Runner;
42class RunQueue;
43class RunQueuePool;
44class RunCommand;
45class RunQueueEvent;
48class MemoryCopyArgs;
50class DeviceId;
51class DeviceInfo;
53class ProfileRegion;
54class IDeviceInfoList;
56class ViewBuildInfo;
57class RunnerInternal;
58enum class eMemoryAdvice;
59
60namespace impl
61{
62 class RuntimeStaticInfo;
63 class IRunnerRuntime;
64 // typedef pour compatibilité avec anciennes versions (octobre 2022)
65 using IRunQueueRuntime = IRunnerRuntime;
66 class IRunQueueStream;
67 class RunCommandImpl;
69 class ReduceMemoryImpl;
70 class RunQueueImpl;
71 class IRunQueueEventImpl;
72 class RunnerImpl;
73 class RunQueueImplStack;
74} // namespace impl
75
76namespace Impl
77{
78 class KernelLaunchArgs;
80 class NativeStream;
81 class CudaUtils;
82 class HipUtils;
83 class SyclUtils;
84} // namespace Impl
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88/*!
89 * \brief Politique d'exécution pour un Runner.
90 */
92{
93 //! Aucune politique d'exécution
95 //! Politique d'exécution séquentielle
97 //! Politique d'exécution multi-thread
99 //! Politique d'exécution utilisant l'environnement CUDA
101 //! Politique d'exécution utilisant l'environnement HIP
103 //! Politique d'exécution utilisant l'environnement SYCL
105};
106
107//! Affiche le nom de la politique d'exécution
108extern "C++" ARCCORE_COMMON_EXPORT
109std::ostream&
110operator<<(std::ostream& o, eExecutionPolicy exec_policy);
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114/*!
115 * \brief Politique des opératations de réduction sur les accélérateurs.
116 *
117 * \note A partir de la version 3.15 de Arcane, seule la politique Grid
118 * est disponible.
119 */
121{
122 /*!
123 * \brief Utilise des opérations atomiques entre les blocs.
124 *
125 * \deprecated Cette politique n'est plus disponible. Si on
126 * spécifie cette politique, elle se comportera comme
127 * eDeviceReducePolicy::Grid.
128 */
129 Atomic ARCCORE_DEPRECATED_REASON("Y2025: Use eDeviceReducePolicy::Grid instead") = 1,
130 //! Utilise un noyau de calcul avec une synchronisations entre les blocs.
132};
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
136/*!
137 * \brief Niveaux de priorité prédéfinis pour les files d'exécution
138 * sur les accélérateurs
139 */
140enum class eRunQueuePriority : int
141{
142 //! Utilise 0 comme valeur par défaut
144 //! Une valeur arbitraire négative pour définir une priorité élevée
145 High = -100,
146 //! Une valeur arbitraire positive pour définir une priorité faible
147 Low = 100
148};
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153//! Type de mémoire pour un pointeur
155{
156 //NOTE: Les valeurs sont équivalentes à cudaMemoryType. Si on
157 // change ces valeurs il faut changer la fonction correspondante
158 // dans le runtime (getPointerAttribute()).
159 Unregistered = 0,
160 Host = 1,
161 Device = 2,
162 Managed = 3
163};
164
165//! Affiche le nom du type de mémoire
166extern "C++" ARCCORE_COMMON_EXPORT
167std::ostream&
168operator<<(std::ostream& o, ePointerMemoryType mem_type);
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172/*!
173 * \brief Informations d'accessibilité d'une adresse mémoire.
174 *
175 * Indique si une adresse mémoire est accessible sur un accélérateur ou
176 * sur le CPU.
177 *
178 * \sa getPointerAccessibility()
179 */
181{
182 //! Accessibilité inconnue
184 //! Non accessible
185 No = 1,
186 //! Accessible
187 Yes = 2
188};
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193//! Indique si \a exec_policy correspond à un accélérateur
194inline bool
196{
197 return exec_policy == eExecutionPolicy::CUDA || exec_policy == eExecutionPolicy::HIP || exec_policy == eExecutionPolicy::SYCL;
198}
199
200/*---------------------------------------------------------------------------*/
201/*---------------------------------------------------------------------------*/
202/*!
203 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur la file \a queue.
204 *
205 * Si \a queue est nul, retourne ePointerAccessibility::Unknown.
206 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
207 * comme si on avait appelé Runner::fillPointerAttribute().
208 */
209extern "C++" ARCCORE_COMMON_EXPORT ePointerAccessibility
210getPointerAccessibility(RunQueue* queue, const void* ptr, PointerAttribute* ptr_attr = nullptr);
211
212/*!
213 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur \a runner.
214 *
215 * Si \a runner est nul, retourne ePointerAccessibility::Unknown.
216 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
217 * comme si on avait appelé Runner::fillPointerAttribute().
218 */
219extern "C++" ARCCORE_COMMON_EXPORT ePointerAccessibility
220getPointerAccessibility(Runner* runner, const void* ptr, PointerAttribute* ptr_attr = nullptr);
221
222/*!
223 * \brief Accessibilité de l'adresse \a ptr pour une politique d'exécution\a policy.
224 *
225 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
226 * comme si on avait appelé Runner::fillPointerAttribute().
227 */
228extern "C++" ARCCORE_COMMON_EXPORT ePointerAccessibility
229getPointerAccessibility(eExecutionPolicy policy, const void* ptr, PointerAttribute* ptr_attr = nullptr);
230
231//! Accessibilité de l'adresse \a ptr pour une exécution sur \a queue_or_runner_or_policy.
232template <typename T> inline ePointerAccessibility
233getPointerAccessibility(T& queue_or_runner_or_policy, const void* ptr, PointerAttribute* ptr_attr = nullptr)
234{
235 return getPointerAccessibility(&queue_or_runner_or_policy, ptr, ptr_attr);
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
240
241} // namespace Arcane::Accelerator
242
243/*---------------------------------------------------------------------------*/
244/*---------------------------------------------------------------------------*/
245
246namespace Arcane::Accelerator::impl
247{
249
250/*!
251 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a queue.
252 *
253 * Lève une exception FatalErrorException si ce n'est pas le cas.
254 */
255extern "C++" ARCCORE_COMMON_EXPORT void
256arcaneCheckPointerIsAccessible(const RunQueue* queue, const void* ptr,
257 const char* name, const TraceInfo& ti);
258
259/*!
260 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a runner.
261 *
262 * Lève une exception FatalErrorException si ce n'est pas le cas.
263 */
264extern "C++" ARCCORE_COMMON_EXPORT void
265arcaneCheckPointerIsAccessible(const Runner* runner, const void* ptr,
266 const char* name, const TraceInfo& ti);
267
268/*!
269 * \brief Vérifie si \a ptr est accessible pour une exécution \a policy.
270 *
271 * Lève une exception FatalErrorException si ce n'est pas le cas.
272 */
273extern "C++" ARCCORE_COMMON_EXPORT void
274arcaneCheckPointerIsAccessible(eExecutionPolicy policy, const void* ptr,
275 const char* name, const TraceInfo& ti);
276
277inline void
278arcaneCheckPointerIsAccessible(const RunQueue& queue, const void* ptr,
279 const char* name, const TraceInfo& ti)
280{
281 arcaneCheckPointerIsAccessible(&queue, ptr, name, ti);
282}
283
284inline void
285arcaneCheckPointerIsAccessible(const Runner& runner, const void* ptr,
286 const char* name, const TraceInfo& ti)
287{
288 arcaneCheckPointerIsAccessible(&runner, ptr, name, ti);
289}
290
291} // namespace Arcane::Accelerator::impl
292
293/*---------------------------------------------------------------------------*/
294/*---------------------------------------------------------------------------*/
295/*!
296 * \brief Macro qui vérifie si \a ptr est accessible pour une RunQueue ou un Runner.
297 *
298 * Lance une exception si ce n'est pas le cas.
299 */
300#define ARCCORE_CHECK_ACCESSIBLE_POINTER_ALWAYS(queue_or_runner_or_policy, ptr) \
301 ::Arcane::Accelerator::impl::arcaneCheckPointerIsAccessible((queue_or_runner_or_policy), (ptr), #ptr, A_FUNCINFO)
302
303#define ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS(queue_or_runner_or_policy, ptr) \
304 ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS((queue_or_runner_or_policy), (ptr))
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
309#if defined(ARCCORE_CHECK)
310
311//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
312#define ARCCORE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr) \
313 ARCCORE_CHECK_ACCESSIBLE_POINTER_ALWAYS((queue_or_runner_or_policy), (ptr))
314
315#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr) \
316 ARCCORE_CHECK_ACCESSIBLE_POINTER((queue_or_runner_or_policy), (ptr))
317
318//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
319#else
320
321//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
322#define ARCCORE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
323
324#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
325
326#endif
327
328/*---------------------------------------------------------------------------*/
329/*---------------------------------------------------------------------------*/
330
331#endif
Gestionnaire d'exécution pour accélérateur.
Informations pour construire une vue pour les données sur accélérateur.
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.
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.
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.
@ 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.
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.