Arcane  v4.1.2.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 class KernelLaunchArgs;
76 class NativeStream;
77 class CudaUtils;
78 class HipUtils;
79 class SyclUtils;
80} // namespace Impl
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84/*!
85 * \brief Politique d'exécution pour un Runner.
86 */
88{
89 //! Aucune politique d'exécution
91 //! Politique d'exécution séquentielle
93 //! Politique d'exécution multi-thread
95 //! Politique d'exécution utilisant l'environnement CUDA
97 //! Politique d'exécution utilisant l'environnement HIP
99 //! Politique d'exécution utilisant l'environnement SYCL
101};
102
103//! Affiche le nom de la politique d'exécution
104extern "C++" ARCCORE_COMMON_EXPORT
105std::ostream&
106operator<<(std::ostream& o, eExecutionPolicy exec_policy);
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110/*!
111 * \brief Politique des opératations de réduction sur les accélérateurs.
112 *
113 * \note A partir de la version 3.15 de Arcane, seule la politique Grid
114 * est disponible.
115 */
117{
118 /*!
119 * \brief Utilise des opérations atomiques entre les blocs.
120 *
121 * \deprecated Cette politique n'est plus disponible. Si on
122 * spécifie cette politique, elle se comportera comme
123 * eDeviceReducePolicy::Grid.
124 */
125 Atomic ARCCORE_DEPRECATED_REASON("Y2025: Use eDeviceReducePolicy::Grid instead") = 1,
126 //! Utilise un noyau de calcul avec une synchronisations entre les blocs.
128};
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132/*!
133 * \brief Niveaux de priorité prédéfinis pour les files d'exécution
134 * sur les accélérateurs
135 */
136enum class eRunQueuePriority : int
137{
138 //! Utilise 0 comme valeur par défaut
140 //! Une valeur arbitraire négative pour définir une priorité élevée
141 High = -100,
142 //! Une valeur arbitraire positive pour définir une priorité faible
143 Low = 100
144};
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
149//! Type de mémoire pour un pointeur
151{
152 //NOTE: Les valeurs sont équivalentes à cudaMemoryType. Si on
153 // change ces valeurs il faut changer la fonction correspondante
154 // dans le runtime (getPointerAttribute()).
155 Unregistered = 0,
156 Host = 1,
157 Device = 2,
158 Managed = 3
159};
160
161//! Affiche le nom du type de mémoire
162extern "C++" ARCCORE_COMMON_EXPORT
163std::ostream&
164operator<<(std::ostream& o, ePointerMemoryType mem_type);
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168/*!
169 * \brief Informations d'accessibilité d'une adresse mémoire.
170 *
171 * Indique si une adresse mémoire est accessible sur un accélérateur ou
172 * sur le CPU.
173 *
174 * \sa getPointerAccessibility()
175 */
177{
178 //! Accessibilité inconnue
180 //! Non accessible
181 No = 1,
182 //! Accessible
183 Yes = 2
184};
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189//! Indique si \a exec_policy correspond à un accélérateur
190inline bool
192{
193 return exec_policy == eExecutionPolicy::CUDA || exec_policy == eExecutionPolicy::HIP || exec_policy == eExecutionPolicy::SYCL;
194}
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198/*!
199 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur la file \a queue.
200 *
201 * Si \a queue 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++" ARCCORE_COMMON_EXPORT ePointerAccessibility
206getPointerAccessibility(RunQueue* queue, const void* ptr, PointerAttribute* ptr_attr = nullptr);
207
208/*!
209 * \brief Accessibilité de l'adresse \a ptr pour une exécution sur \a runner.
210 *
211 * Si \a runner est nul, retourne ePointerAccessibility::Unknown.
212 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
213 * comme si on avait appelé Runner::fillPointerAttribute().
214 */
215extern "C++" ARCCORE_COMMON_EXPORT ePointerAccessibility
216getPointerAccessibility(Runner* runner, const void* ptr, PointerAttribute* ptr_attr = nullptr);
217
218/*!
219 * \brief Accessibilité de l'adresse \a ptr pour une politique d'exécution\a policy.
220 *
221 * Si \a ptr_attr est non nul, il sera remplit avec les informations du pointeur
222 * comme si on avait appelé Runner::fillPointerAttribute().
223 */
224extern "C++" ARCCORE_COMMON_EXPORT ePointerAccessibility
225getPointerAccessibility(eExecutionPolicy policy, const void* ptr, PointerAttribute* ptr_attr = nullptr);
226
227//! Accessibilité de l'adresse \a ptr pour une exécution sur \a queue_or_runner_or_policy.
228template <typename T> inline ePointerAccessibility
229getPointerAccessibility(T& queue_or_runner_or_policy, const void* ptr, PointerAttribute* ptr_attr = nullptr)
230{
231 return getPointerAccessibility(&queue_or_runner_or_policy, ptr, ptr_attr);
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
237} // namespace Arcane::Accelerator
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242namespace Arcane::Accelerator::Impl
243{
245
246/*!
247 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a queue.
248 *
249 * Lève une exception FatalErrorException si ce n'est pas le cas.
250 */
251extern "C++" ARCCORE_COMMON_EXPORT void
252arcaneCheckPointerIsAccessible(const RunQueue* queue, const void* ptr,
253 const char* name, const TraceInfo& ti);
254
255/*!
256 * \brief Vérifie si \a ptr est accessible pour une exécution sur \a runner.
257 *
258 * Lève une exception FatalErrorException si ce n'est pas le cas.
259 */
260extern "C++" ARCCORE_COMMON_EXPORT void
261arcaneCheckPointerIsAccessible(const Runner* runner, const void* ptr,
262 const char* name, const TraceInfo& ti);
263
264/*!
265 * \brief Vérifie si \a ptr est accessible pour une exécution \a policy.
266 *
267 * Lève une exception FatalErrorException si ce n'est pas le cas.
268 */
269extern "C++" ARCCORE_COMMON_EXPORT void
270arcaneCheckPointerIsAccessible(eExecutionPolicy policy, const void* ptr,
271 const char* name, const TraceInfo& ti);
272
273inline void
274arcaneCheckPointerIsAccessible(const RunQueue& queue, const void* ptr,
275 const char* name, const TraceInfo& ti)
276{
277 arcaneCheckPointerIsAccessible(&queue, ptr, name, ti);
278}
279
280inline void
281arcaneCheckPointerIsAccessible(const Runner& runner, const void* ptr,
282 const char* name, const TraceInfo& ti)
283{
284 arcaneCheckPointerIsAccessible(&runner, ptr, name, ti);
285}
286
287} // namespace Arcane::Accelerator::Impl
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291/*!
292 * \brief Macro qui vérifie si \a ptr est accessible pour une RunQueue ou un Runner.
293 *
294 * Lance une exception si ce n'est pas le cas.
295 */
296#define ARCCORE_CHECK_ACCESSIBLE_POINTER_ALWAYS(queue_or_runner_or_policy, ptr) \
297 ::Arcane::Accelerator::Impl::arcaneCheckPointerIsAccessible((queue_or_runner_or_policy), (ptr), #ptr, A_FUNCINFO)
298
299#define ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS(queue_or_runner_or_policy, ptr) \
300 ARCANE_CHECK_ACCESSIBLE_POINTER_ALWAYS((queue_or_runner_or_policy), (ptr))
301
302/*---------------------------------------------------------------------------*/
303/*---------------------------------------------------------------------------*/
304
305#if defined(ARCCORE_CHECK)
306
307//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
308#define ARCCORE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr) \
309 ARCCORE_CHECK_ACCESSIBLE_POINTER_ALWAYS((queue_or_runner_or_policy), (ptr))
310
311#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr) \
312 ARCCORE_CHECK_ACCESSIBLE_POINTER((queue_or_runner_or_policy), (ptr))
313
314//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
315#else
316
317//! Macro qui vérifie en mode check si \a ptr est accessible pour une RunQueue ou un Runner.
318#define ARCCORE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
319
320#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
321
322#endif
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
327#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.