Arcane  v3.15.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
arcane/src/arcane/utils/PlatformUtils.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/* PlatformUtils.h (C) 2000-2025 */
9/* */
10/* Fonctions utilitaires dépendant de la plateforme. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_PLATFORMUTILS_H
13#define ARCANE_UTILS_PLATFORMUTILS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/base/PlatformUtils.h"
19
20#include <iosfwd>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31class IOnlineDebuggerService;
32class IProfilingService;
33class IProcessorAffinityService;
34class IDynamicLibraryLoader;
35class ISymbolizerService;
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39/*!
40 \brief Espace de nom pour les fonctions dépendant de la plateforme.
41
42 Cet espace de nom contient toutes les fonctions dépendant de la plateforme.
43*/
44namespace platform
45{
46
47/*!
48 * \brief Initialisations spécifiques à une platforme.
49 *
50 Cette routine est appelé lors de l'initialisation de l'architecture.
51 Elle permet d'effectuer certains traitements qui dépendent de la
52 plateforme
53 */
54extern "C++" ARCANE_UTILS_EXPORT void platformInitialize();
55
56/*!
57 * \brief Routines de fin de programme spécifiques à une platforme.
58 *
59 Cette routine est appelé juste avant de quitter le programme.
60 */
61extern "C++" ARCANE_UTILS_EXPORT void platformTerminate();
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65/*!
66 * \brief Service utilisé pour obtenir des informations
67 * sur les symboles du code source.
68 *
69 * Peut retourner nul si aucun service n'est disponible.
70 */
71extern "C++" ARCANE_UTILS_EXPORT ISymbolizerService*
73
74/*!
75 * \brief Positionne le service pour obtenir des informations
76 * sur les symboles du code source.
77 *
78 * Retourne l'ancien service utilisé.
79 */
80extern "C++" ARCANE_UTILS_EXPORT ISymbolizerService*
81setSymbolizerService(ISymbolizerService* service);
82
83/*!
84 * \brief Service utilisé pour la gestion de l'affinité des processeurs.
85 *
86 * Peut retourner nul si aucun service n'est disponible.
87 */
88extern "C++" ARCANE_UTILS_EXPORT IProcessorAffinityService*
90
91/*!
92 * \brief Positionne le service utilisé pour la gestion de l'affinité des processeurs.
93 *
94 * Retourne l'ancien service utilisé.
95 */
96extern "C++" ARCANE_UTILS_EXPORT IProcessorAffinityService*
97setProcessorAffinityService(IProcessorAffinityService* service);
98
99/*!
100 * \brief Service utilisé pour obtenir pour obtenir des informations de profiling.
101 *
102 * Peut retourner nul si aucun service n'est disponible.
103 */
104extern "C++" ARCANE_UTILS_EXPORT IProfilingService*
106
107/*!
108 * \brief Positionne le service utilisé pour obtenir des informations de profiling.
109 *
110 * Retourne l'ancien service utilisé.
111 */
112extern "C++" ARCANE_UTILS_EXPORT IProfilingService*
113setProfilingService(IProfilingService* service);
114
115/*!
116 * \brief Service utilisé pour obtenir la mise en place d'une architecture en ligne de debug.
117 *
118 * Peut retourner nul si aucun service n'est disponible.
119 */
120extern "C++" ARCANE_UTILS_EXPORT IOnlineDebuggerService*
122
123/*!
124 * \brief Positionne le service a utiliser pour l'architecture en ligne de debug.
125 *
126 * Retourne l'ancien service utilisé.
127 */
128extern "C++" ARCANE_UTILS_EXPORT IOnlineDebuggerService*
129setOnlineDebuggerService(IOnlineDebuggerService* service);
130
131/*!
132 * \brief Service utilisé pour gérer les threads.
133 *
134 * Peut retourner nul si aucun service n'est disponible.
135 */
136extern "C++" ARCANE_UTILS_EXPORT IThreadImplementation*
138
139/*!
140 * \brief Positionne le service utilisé pour gérer les threads.
141 *
142 * Retourne l'ancien service utilisé.
143 */
144extern "C++" ARCANE_UTILS_EXPORT IThreadImplementation*
145setThreadImplementationService(IThreadImplementation* service);
146
147/*!
148 * \brief Service utilisé pour charger dynamiquement des bibliothèques.
149 *
150 * Peut retourner \c nullptr si le chargement dynamique n'est pas disponible.
151 */
152extern "C++" ARCANE_UTILS_EXPORT IDynamicLibraryLoader*
154
155/*!
156 * \brief Positionne le service utilisé pour charger dynamiquement des bibliothèques.
157 *
158 * Retourne l'ancien service utilisé.
159 */
160extern "C++" ARCANE_UTILS_EXPORT IDynamicLibraryLoader*
161setDynamicLibraryLoader(IDynamicLibraryLoader* idll);
162
163/*!
164 * \brief Positionne le service utilisé pour gérer les compteurs interne du processeur.
165 *
166 * Retourne l'ancien service utilisé.
167 */
168extern "C++" ARCANE_UTILS_EXPORT IPerformanceCounterService*
169setPerformanceCounterService(IPerformanceCounterService* service);
170
171/*!
172 * \brief Service utilisé pour obtenir pour obtenir les compteurs interne du processeur.
173 *
174 * Peut retourner nul si aucun service n'est disponible.
175 */
176extern "C++" ARCANE_UTILS_EXPORT IPerformanceCounterService*
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181/*!
182 * \brief Remet à timer d'alarme à \a nb_second.
183 *
184 * Le timer déclenchera un signal (SIGALRM) au bout de \a nb_second.
185 */
186extern "C++" ARCANE_UTILS_EXPORT void
187resetAlarmTimer(Integer nb_second);
188
189/*!
190 * \brief Vrai si le code s'exécute avec le runtime .NET.
191 */
192extern "C++" ARCANE_UTILS_EXPORT bool
194
195/*!
196 * \brief Positionne si le code s'exécute avec le runtime .NET.
197 *
198 * Cette fonction ne peut être positionnée qu'au démarrage
199 * du calcul avant arcaneInitialize().
200 */
201extern "C++" ARCANE_UTILS_EXPORT void
202setHasDotNETRuntime(bool v);
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207//! Appelle le Garbage Collector de '.Net' s'il est disponible
208extern "C++" ARCANE_UTILS_EXPORT void
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213/*!
214 * \brief Allocateur spécifique pour les accélérateurs.
215 *
216 * \deprecated Use MemoryUtils::getDefaultDataAllocator() instead.
217 */
218extern "C++" ARCANE_DEPRECATED_REASON("Y2024: Use MemoryUtils::getDefaultDataAllocator() instead.")
219ARCANE_UTILS_EXPORT IMemoryAllocator*
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224/*!
225 * \brief Positionne l'allocateur spécifique pour les accélérateurs.
226 *
227 * Retourne l'ancien allocateur utilisé. L'allocateur spécifié doit rester
228 * valide durant toute la durée de vie de l'application.
229 *
230 * \deprecated Cette méthode est interne à Arcane.
231 */
232extern "C++" ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane")
233ARCANE_UTILS_EXPORT IMemoryAllocator*
234setAcceleratorHostMemoryAllocator(IMemoryAllocator* a);
235
236/*---------------------------------------------------------------------------*/
237/*---------------------------------------------------------------------------*/
238/*!
239 * \brief Allocateur par défaut pour les données.
240 *
241 * Cette allocateur utilise celui getAcceleratorHostMemoryAllocator()
242 * s'il est disponible, sinon il utilise un allocateur aligné.
243 *
244 * Il est garanti que l'allocateur retourné permettra d'utiliser la donnée
245 * sur accélerateur si cela est disponible.
246 *
247 * Il est garanti que l'alignement est au moins celui retourné par
248 * AlignedMemoryAllocator::Simd().
249 */
250extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255/*!
256 * \brief Positionne le gestionnaire de ressource mémoire pour les données.
257 *
258 * Le gestionnaire doit rester valide durant toute l'exécution du programme.
259 *
260 * Retourne l'ancien gestionnaire.
261 *
262 * * \deprecated Cette méthode est interne à Arcane.
263 */
264extern "C++" ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane")
265ARCANE_UTILS_EXPORT IMemoryRessourceMng*
266setDataMemoryRessourceMng(IMemoryRessourceMng* mng);
267
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271/*!
272 * \brief Gestionnaire de ressource mémoire pour les données.
273 *
274 * Il est garanti que l'alignement est au moins celui retourné par
275 * AlignedMemoryAllocator::Simd().
276 *
277 * \deprecated Cette méthode est interne à Arcane.
278 */
279extern "C++" ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane. Use methods from MemoryUtils instead.")
280ARCANE_UTILS_EXPORT IMemoryRessourceMng*
282
283/*---------------------------------------------------------------------------*/
284/*---------------------------------------------------------------------------*/
285/*!
286 * \brief Lit le contenu d'un fichier et le conserve dans \a out_bytes.
287 *
288 * Lit le fichier de nom \a filename et remplit \a out_bytes avec le contenu
289 * de ce fichier. Si \a is_binary est vrai, le fichier est ouvert en mode
290 * binaire. Sinon il est ouvert en mode texte.
291 *
292 * \retval true en cas d'erreur
293 * \retval false sinon.
294 */
295extern "C++" ARCANE_UTILS_EXPORT bool
296readAllFile(StringView filename, bool is_binary, ByteArray& out_bytes);
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300/*!
301 * \brief Lit le contenu d'un fichier et le conserve dans \a out_bytes.
302 *
303 * Lit le fichier de nom \a filename et remplit \a out_bytes avec le contenu
304 * de ce fichier. Si \a is_binary est vrai, le fichier est ouvert en mode
305 * binaire. Sinon il est ouvert en mode texte.
306 *
307 * \retval true en cas d'erreur
308 * \retval false sinon.
309 */
310extern "C++" ARCANE_UTILS_EXPORT bool
311readAllFile(StringView filename, bool is_binary, Array<std::byte>& out_bytes);
312
313/*---------------------------------------------------------------------------*/
314/*---------------------------------------------------------------------------*/
315/*!
316 * \brief Retourne le nom complet avec le chemin de l'exécutable.
317 */
318extern "C++" ARCANE_UTILS_EXPORT String
320
321/*---------------------------------------------------------------------------*/
322/*---------------------------------------------------------------------------*/
323/*!
324 * \brief Temps horloge en nano-secondes.
325 */
326extern "C++" ARCANE_UTILS_EXPORT Int64
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
331/*!
332 * \brief Retourne le chemin complet d'une bibliothèque dynamique chargée.
333 *
334 * Retourne le chemin complet de la bibliothèque dynamique de nom
335 * \a dll_name. \a dll_name doit contenir juste le nom de la bibliothèque
336 * sans les extensions spécifiques à la plateforme. Par exemple, sous Linux,
337 * il ne faut pas mettre 'libtoto.so' mais juste 'toto'.
338 *
339 * Retourne une chaîne nulle si le chemin complet ne peut
340 * par être déterminé.
341 */
342extern "C++" ARCANE_UTILS_EXPORT String
343getLoadedSharedLibraryFullPath(const String& dll_name);
344
345/*---------------------------------------------------------------------------*/
346/*---------------------------------------------------------------------------*/
347/*!
348 * \brief Remplit \a arg_list avec les arguments de la ligne de commande.
349 *
350 * Cette fonction remplit \a arg_list avec les arguments utilisés dans
351 * l'appel à main().
352 *
353 * Actuellement cette méthode ne fonctionne que sous Linux. Pour les autres
354 * plateforme elle retourne une liste vide.
355 */
356extern "C++" ARCANE_UTILS_EXPORT void
358
359/*---------------------------------------------------------------------------*/
360/*---------------------------------------------------------------------------*/
361/*!
362 * \brief Taille des pages du système hôte en octets
363 */
364extern "C++" ARCANE_UTILS_EXPORT Int64
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369/*!
370 * \brief Récupère la pile d'appel via gdb.
371 *
372 * Cette méthode ne fonctionne que sous Linux et si GDB est installé. Dans
373 * les autres cas c'est la chaîne nulle qui est retournée.
374 *
375 * Cette méthode appelle la commande std::system() pour lancer gbd qui doit
376 * se trouver dans le PATH. Comme gdb charge ensuite les symboles de debug
377 * la commande peut être assez longue à s'exécuter.
378 */
379extern "C++" ARCANE_UTILS_EXPORT String
381
382/*---------------------------------------------------------------------------*/
383/*---------------------------------------------------------------------------*/
384/*!
385 * \brief Récupère la pile d'appel via lldb.
386 *
387 * Cette méthode est similaire à getGDBStack() mais utilise 'lldb' pour
388 * récupérer la pile d'appel. Si `dotnet-sos` est installé, cela permet
389 * aussi de récupérer les informations sur les méthodes du runtime 'dotnet'.
390 */
391extern "C++" ARCANE_UTILS_EXPORT String
393
394/*---------------------------------------------------------------------------*/
395/*---------------------------------------------------------------------------*/
396
397// Définition du pragma pour indiquer l'indépendance des itérations
398
399/*!
400 * \def ARCANE_PRAGMA_IVDEP
401 * Pragma pour indiquer au compilateur que les itérations d'une boucle sont
402 * indépendanntes. Ce pragma se positionne avant une boucle 'for'.
403 */
404
405/*!
406 * \def ARCANE_PRAGMA_IVDEP_VALUE
407 * Valeur du pragma ARCANE_PRAGMA_IVDEP
408 */
409
410// Pour les définitions, il faut finir par GCC car Clang et ICC définissent
411// la macro __GNU__
412// Pour CLANG, il n'y a pas encore d'équivalent au pragma ivdep de ICC.
413// Celui qui s'en approche le plus est:
414// #pragma clang loop vectorize(enable)
415// mais il ne force pas la vectorisation.
416#ifdef __clang__
417# define ARCANE_PRAGMA_IVDEP_VALUE "clang loop vectorize(enable)"
418#else
419# ifdef __INTEL_COMPILER
420# define ARCANE_PRAGMA_IVDEP_VALUE "ivdep"
421# else
422# ifdef __GNUC__
423# if (__GNUC__>=5)
424# define ARCANE_PRAGMA_IVDEP_VALUE "GCC ivdep"
425# endif
426# endif
427# endif
428#endif
429
430#ifdef ARCANE_PRAGMA_IVDEP_VALUE
431#define ARCANE_PRAGMA_IVDEP _Pragma(ARCANE_PRAGMA_IVDEP_VALUE)
432#else
433#define ARCANE_PRAGMA_IVDEP
434#define ARCANE_PRAGMA_IVDEP_VALUE ""
435#endif
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439
440} // End namespace platform
441
442/*---------------------------------------------------------------------------*/
443/*---------------------------------------------------------------------------*/
444
445} // End namespace Arcane
446
447/*---------------------------------------------------------------------------*/
448/*---------------------------------------------------------------------------*/
449
450#endif
Déclarations des types utilisés dans Arcane.
IPerformanceCounterService * setPerformanceCounterService(IPerformanceCounterService *service)
Positionne le service utilisé pour gérer les compteurs interne du processeur.
void callDotNETGarbageCollector()
Appelle le Garbage Collector de '.Net' s'il est disponible.
String getLLDBStack()
Récupère la pile d'appel via lldb.
String getLoadedSharedLibraryFullPath(const String &dll_name)
Retourne le chemin complet d'une bibliothèque dynamique chargée.
ISymbolizerService * setSymbolizerService(ISymbolizerService *service)
Positionne le service pour obtenir des informations sur les symboles du code source.
IDynamicLibraryLoader * getDynamicLibraryLoader()
Service utilisé pour charger dynamiquement des bibliothèques.
void fillCommandLineArguments(StringList &arg_list)
Remplit arg_list avec les arguments de la ligne de commande.
IMemoryRessourceMng * setDataMemoryRessourceMng(IMemoryRessourceMng *mng)
Positionne le gestionnaire de ressource mémoire pour les données.
void platformInitialize()
Initialisations spécifiques à une platforme.
IOnlineDebuggerService * setOnlineDebuggerService(IOnlineDebuggerService *service)
Positionne le service a utiliser pour l'architecture en ligne de debug.
ISymbolizerService * getSymbolizerService()
Service utilisé pour obtenir des informations sur les symboles du code source.
IProfilingService * getProfilingService()
Service utilisé pour obtenir pour obtenir des informations de profiling.
IMemoryRessourceMng * getDataMemoryRessourceMng()
Gestionnaire de ressource mémoire pour les données.
void resetAlarmTimer(Integer nb_second)
Remet à timer d'alarme à nb_second.
void platformTerminate()
Routines de fin de programme spécifiques à une platforme.
IProfilingService * setProfilingService(IProfilingService *service)
Positionne le service utilisé pour obtenir des informations de profiling.
IMemoryAllocator * getAcceleratorHostMemoryAllocator()
Allocateur spécifique pour les accélérateurs.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
Int64 getPageSize()
Taille des pages du système hôte en octets.
String getExeFullPath()
Retourne le nom complet avec le chemin de l'exécutable.
Int64 getRealTimeNS()
Temps horloge en nano-secondes.
bool readAllFile(StringView filename, bool is_binary, ByteArray &out_bytes)
Lit le contenu d'un fichier et le conserve dans out_bytes.
IProcessorAffinityService * setProcessorAffinityService(IProcessorAffinityService *service)
Positionne le service utilisé pour la gestion de l'affinité des processeurs.
void setHasDotNETRuntime(bool v)
Positionne si le code s'exécute avec le runtime .NET.
IProcessorAffinityService * getProcessorAffinityService()
Service utilisé pour la gestion de l'affinité des processeurs.
IMemoryAllocator * setAcceleratorHostMemoryAllocator(IMemoryAllocator *a)
Positionne l'allocateur spécifique pour les accélérateurs.
IThreadImplementation * getThreadImplementationService()
Service utilisé pour gérer les threads.
IDynamicLibraryLoader * setDynamicLibraryLoader(IDynamicLibraryLoader *idll)
Positionne le service utilisé pour charger dynamiquement des bibliothèques.
IPerformanceCounterService * getPerformanceCounterService()
Service utilisé pour obtenir pour obtenir les compteurs interne du processeur.
bool hasDotNETRuntime()
Vrai si le code s'exécute avec le runtime .NET.
String getGDBStack()
Récupère la pile d'appel via gdb.
IThreadImplementation * setThreadImplementationService(IThreadImplementation *service)
Positionne le service utilisé pour gérer les threads.
IOnlineDebuggerService * getOnlineDebuggerService()
Service utilisé pour obtenir la mise en place d'une architecture en ligne de debug.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:211
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:599