Arcane  v3.14.10.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-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/* PlatformUtils.h (C) 2000-2024 */
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
87using Arccore::Platform::safeStringCopy;
89
94
99
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105/*!
106 * \brief Service utilisé pour obtenir des informations
107 * sur les symboles du code source.
108 *
109 * Peut retourner nul si aucun service n'est disponible.
110 */
111extern "C++" ARCANE_UTILS_EXPORT ISymbolizerService*
113
114/*!
115 * \brief Positionne le service pour obtenir des informations
116 * sur les symboles du code source.
117 *
118 * Retourne l'ancien service utilisé.
119 */
120extern "C++" ARCANE_UTILS_EXPORT ISymbolizerService*
121setSymbolizerService(ISymbolizerService* service);
122
123/*!
124 * \brief Service utilisé pour la gestion de l'affinité des processeurs.
125 *
126 * Peut retourner nul si aucun service n'est disponible.
127 */
128extern "C++" ARCANE_UTILS_EXPORT IProcessorAffinityService*
130
131/*!
132 * \brief Positionne le service utilisé pour la gestion de l'affinité des processeurs.
133 *
134 * Retourne l'ancien service utilisé.
135 */
136extern "C++" ARCANE_UTILS_EXPORT IProcessorAffinityService*
137setProcessorAffinityService(IProcessorAffinityService* service);
138
139/*!
140 * \brief Service utilisé pour obtenir pour obtenir des informations de profiling.
141 *
142 * Peut retourner nul si aucun service n'est disponible.
143 */
144extern "C++" ARCANE_UTILS_EXPORT IProfilingService*
146
147/*!
148 * \brief Positionne le service utilisé pour obtenir des informations de profiling.
149 *
150 * Retourne l'ancien service utilisé.
151 */
152extern "C++" ARCANE_UTILS_EXPORT IProfilingService*
153setProfilingService(IProfilingService* service);
154
155/*!
156 * \brief Service utilisé pour obtenir la mise en place d'une architecture en ligne de debug.
157 *
158 * Peut retourner nul si aucun service n'est disponible.
159 */
160extern "C++" ARCANE_UTILS_EXPORT IOnlineDebuggerService*
162
163/*!
164 * \brief Positionne le service a utiliser pour l'architecture en ligne de debug.
165 *
166 * Retourne l'ancien service utilisé.
167 */
168extern "C++" ARCANE_UTILS_EXPORT IOnlineDebuggerService*
169setOnlineDebuggerService(IOnlineDebuggerService* service);
170
171/*!
172 * \brief Service utilisé pour gérer les threads.
173 *
174 * Peut retourner nul si aucun service n'est disponible.
175 */
176extern "C++" ARCANE_UTILS_EXPORT IThreadImplementation*
178
179/*!
180 * \brief Positionne le service utilisé pour gérer les threads.
181 *
182 * Retourne l'ancien service utilisé.
183 */
184extern "C++" ARCANE_UTILS_EXPORT IThreadImplementation*
185setThreadImplementationService(IThreadImplementation* service);
186
187/*!
188 * \brief Service utilisé pour charger dynamiquement des bibliothèques.
189 *
190 * Peut retourner \c nullptr si le chargement dynamique n'est pas disponible.
191 */
192extern "C++" ARCANE_UTILS_EXPORT IDynamicLibraryLoader*
194
195/*!
196 * \brief Positionne le service utilisé pour charger dynamiquement des bibliothèques.
197 *
198 * Retourne l'ancien service utilisé.
199 */
200extern "C++" ARCANE_UTILS_EXPORT IDynamicLibraryLoader*
201setDynamicLibraryLoader(IDynamicLibraryLoader* idll);
202
203/*!
204 * \brief Positionne le service utilisé pour gérer les compteurs interne du processeur.
205 *
206 * Retourne l'ancien service utilisé.
207 */
208extern "C++" ARCANE_UTILS_EXPORT IPerformanceCounterService*
209setPerformanceCounterService(IPerformanceCounterService* service);
210
211/*!
212 * \brief Service utilisé pour obtenir pour obtenir les compteurs interne du processeur.
213 *
214 * Peut retourner nul si aucun service n'est disponible.
215 */
216extern "C++" ARCANE_UTILS_EXPORT IPerformanceCounterService*
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221/*!
222 * \brief Remet à timer d'alarme à \a nb_second.
223 *
224 * Le timer déclenchera un signal (SIGALRM) au bout de \a nb_second.
225 */
226extern "C++" ARCANE_UTILS_EXPORT void
227resetAlarmTimer(Integer nb_second);
228
229/*!
230 * \brief Vrai si le code s'exécute avec le runtime .NET.
231 */
232extern "C++" ARCANE_UTILS_EXPORT bool
234
235/*!
236 * \brief Positionne si le code s'exécute avec le runtime .NET.
237 *
238 * Cette fonction ne peut être positionnée qu'au démarrage
239 * du calcul avant arcaneInitialize().
240 */
241extern "C++" ARCANE_UTILS_EXPORT void
242setHasDotNETRuntime(bool v);
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247//! Appelle le Garbage Collector de '.Net' s'il est disponible
248extern "C++" ARCANE_UTILS_EXPORT void
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253/*!
254 * \brief Allocateur spécifique pour les accélérateurs.
255 *
256 * Si non nul, cet allocateur permet d'allouer de la mémoire sur l'hôte en
257 * utilisant le runtime spécique de l'allocateur.
258 */
259extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
261
262/*!
263 * \brief Positionne l'allocateur spécifique pour les accélérateurs.
264 *
265 * Retourne l'ancien allocateur utilisé. L'allocateur spécifié doit rester
266 * valide durant toute la durée de vie de l'application.
267 */
268extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
269setAcceleratorHostMemoryAllocator(IMemoryAllocator* a);
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273/*!
274 * \brief Allocateur par défaut pour les données.
275 *
276 * Cette allocateur utilise celui getAcceleratorHostMemoryAllocator()
277 * s'il est disponible, sinon il utilise un allocateur aligné.
278 *
279 * Il est garanti que l'allocateur retourné permettra d'utiliser la donnée
280 * sur accélerateur si cela est disponible.
281 *
282 * Il est garanti que l'alignement est au moins celui retourné par
283 * AlignedMemoryAllocator::Simd().
284 */
285extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
287
288/*---------------------------------------------------------------------------*/
289/*---------------------------------------------------------------------------*/
290/*!
291 * \brief Positionne le gestionnaire de ressource mémoire pour les données.
292 *
293 * Le gestionnaire doit rester valide durant toute l'exécution du programme.
294 *
295 * Retourne l'ancien gestionnaire.
296 */
297extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng*
298setDataMemoryRessourceMng(IMemoryRessourceMng* mng);
299
300/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
302/*!
303 * \brief Gestionnaire de ressource mémoire pour les données.
304 *
305 * Il est garanti que l'alignement est au moins celui retourné par
306 * AlignedMemoryAllocator::Simd().
307 */
308extern "C++" ARCANE_UTILS_EXPORT IMemoryRessourceMng*
310
311/*---------------------------------------------------------------------------*/
312/*---------------------------------------------------------------------------*/
313/*!
314 * \brief Lit le contenu d'un fichier et le conserve dans \a out_bytes.
315 *
316 * Lit le fichier de nom \a filename et remplit \a out_bytes avec le contenu
317 * de ce fichier. Si \a is_binary est vrai, le fichier est ouvert en mode
318 * binaire. Sinon il est ouvert en mode texte.
319 *
320 * \retval true en cas d'erreur
321 * \retval false sinon.
322 */
323extern "C++" ARCANE_UTILS_EXPORT bool
324readAllFile(StringView filename, bool is_binary, ByteArray& out_bytes);
325
326/*---------------------------------------------------------------------------*/
327/*---------------------------------------------------------------------------*/
328/*!
329 * \brief Lit le contenu d'un fichier et le conserve dans \a out_bytes.
330 *
331 * Lit le fichier de nom \a filename et remplit \a out_bytes avec le contenu
332 * de ce fichier. Si \a is_binary est vrai, le fichier est ouvert en mode
333 * binaire. Sinon il est ouvert en mode texte.
334 *
335 * \retval true en cas d'erreur
336 * \retval false sinon.
337 */
338extern "C++" ARCANE_UTILS_EXPORT bool
339readAllFile(StringView filename, bool is_binary, Array<std::byte>& out_bytes);
340
341/*---------------------------------------------------------------------------*/
342/*---------------------------------------------------------------------------*/
343/*!
344 * \brief Retourne le nom complet avec le chemin de l'exécutable.
345 */
346extern "C++" ARCANE_UTILS_EXPORT String
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351/*!
352 * \brief Temps horloge en nano-secondes.
353 */
354extern "C++" ARCANE_UTILS_EXPORT Int64
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359/*!
360 * \brief Retourne le chemin complet d'une bibliothèque dynamique chargée.
361 *
362 * Retourne le chemin complet de la bibliothèque dynamique de nom
363 * \a dll_name. \a dll_name doit contenir juste le nom de la bibliothèque
364 * sans les extensions spécifiques à la plateforme. Par exemple, sous Linux,
365 * il ne faut pas mettre 'libtoto.so' mais juste 'toto'.
366 *
367 * Retourne une chaîne nulle si le chemin complet ne peut
368 * par être déterminé.
369 */
370extern "C++" ARCANE_UTILS_EXPORT String
371getLoadedSharedLibraryFullPath(const String& dll_name);
372
373/*---------------------------------------------------------------------------*/
374/*---------------------------------------------------------------------------*/
375/*!
376 * \brief Remplit \a arg_list avec les arguments de la ligne de commande.
377 *
378 * Cette fonction remplit \a arg_list avec les arguments utilisés dans
379 * l'appel à main().
380 *
381 * Actuellement cette méthode ne fonctionne que sous Linux. Pour les autres
382 * plateforme elle retourne une liste vide.
383 */
384extern "C++" ARCANE_UTILS_EXPORT void
386
387/*---------------------------------------------------------------------------*/
388/*---------------------------------------------------------------------------*/
389/*!
390 * \brief Taille des pages du système hôte en octets
391 */
392extern "C++" ARCANE_UTILS_EXPORT Int64
394
395/*---------------------------------------------------------------------------*/
396/*---------------------------------------------------------------------------*/
397/*!
398 * \brief Récupère la pile d'appel via gdb.
399 *
400 * Cette méthode ne fonctionne que sous Linux et si GDB est installé. Dans
401 * les autres cas c'est la chaîne nulle qui est retournée.
402 *
403 * Cette méthode appelle la commande std::system() pour lancer gbd qui doit
404 * se trouver dans le PATH. Comme gdb charge ensuite les symboles de debug
405 * la commande peut être assez longue à s'exécuter.
406 */
407extern "C++" ARCANE_UTILS_EXPORT String
409
410/*---------------------------------------------------------------------------*/
411/*---------------------------------------------------------------------------*/
412/*!
413 * \brief Récupère la pile d'appel via lldb.
414 *
415 * Cette méthode est similaire à getGDBStack() mais utilise 'lldb' pour
416 * récupérer la pile d'appel. Si `dotnet-sos` est installé, cela permet
417 * aussi de récupérer les informations sur les méthodes du runtime 'dotnet'.
418 */
419extern "C++" ARCANE_UTILS_EXPORT String
421
422/*---------------------------------------------------------------------------*/
423/*---------------------------------------------------------------------------*/
424
425// Définition du pragma pour indiquer l'indépendance des itérations
426
427/*!
428 * \def ARCANE_PRAGMA_IVDEP
429 * Pragma pour indiquer au compilateur que les itérations d'une boucle sont
430 * indépendanntes. Ce pragma se positionne avant une boucle 'for'.
431 */
432
433/*!
434 * \def ARCANE_PRAGMA_IVDEP_VALUE
435 * Valeur du pragma ARCANE_PRAGMA_IVDEP
436 */
437
438// Pour les définitions, il faut finir par GCC car Clang et ICC définissent
439// la macro __GNU__
440// Pour CLANG, il n'y a pas encore d'équivalent au pragma ivdep de ICC.
441// Celui qui s'en approche le plus est:
442// #pragma clang loop vectorize(enable)
443// mais il ne force pas la vectorisation.
444#ifdef __clang__
445# define ARCANE_PRAGMA_IVDEP_VALUE "clang loop vectorize(enable)"
446#else
447# ifdef __INTEL_COMPILER
448# define ARCANE_PRAGMA_IVDEP_VALUE "ivdep"
449# else
450# ifdef __GNUC__
451# if (__GNUC__>=5)
452# define ARCANE_PRAGMA_IVDEP_VALUE "GCC ivdep"
453# endif
454# endif
455# endif
456#endif
457
458#ifdef ARCANE_PRAGMA_IVDEP_VALUE
459#define ARCANE_PRAGMA_IVDEP _Pragma(ARCANE_PRAGMA_IVDEP_VALUE)
460#else
461#define ARCANE_PRAGMA_IVDEP
462#define ARCANE_PRAGMA_IVDEP_VALUE ""
463#endif
464
465/*---------------------------------------------------------------------------*/
466/*---------------------------------------------------------------------------*/
467
468} // End namespace platform
469
470/*---------------------------------------------------------------------------*/
471/*---------------------------------------------------------------------------*/
472
473} // End namespace Arcane
474
475/*---------------------------------------------------------------------------*/
476/*---------------------------------------------------------------------------*/
477
478#endif
479
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:321
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:667
ARCCORE_BASE_EXPORT void dumpStackTrace(std::ostream &ostr)
Affiche la pile d'appel sur le flot ostr.
ARCCORE_BASE_EXPORT bool isFloatingExceptionEnabled()
Indique si les exceptions flottantes du processeur sont activées.
ARCCORE_BASE_EXPORT bool hasFloatingExceptionSupport()
Indique si l'implémentation permet de modifier l'état d'activation des exceptions flottantes.
ARCCORE_BASE_EXPORT bool isFileReadable(const String &file_name)
Vérifie que le fichier file_name est accessible et lisible.
ARCCORE_BASE_EXPORT String getStackTrace()
Retourne une chaîne de caractere contenant la pile d'appel.
ARCCORE_BASE_EXPORT IStackTraceService * getStackTraceService()
Service utilisé pour obtenir la pile d'appel.
ARCCORE_BASE_EXPORT String getCompilerId()
Chaîne de caractère permettant d'identifier le compilateur utilisé pour compiler Arccore.
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
ARCCORE_BASE_EXPORT String getCurrentDateTime()
Date et l'heure courante sous la forme ISO 8601.
ARCCORE_BASE_EXPORT void enableFloatingException(bool active)
Active ou désactive les exceptions lors d'un calcul flottant. Cette opération n'est pas supportée sur...
ARCCORE_BASE_EXPORT void stdMemcpy(void *to, const void *from,::size_t len)
Copie de zone mémoire.
ARCCORE_BASE_EXPORT Real getRealTime()
Temps Real utilisé en secondes.
ARCCORE_BASE_EXPORT bool removeFile(const String &file_name)
Supprime le fichier file_name.
ARCCORE_BASE_EXPORT void sleep(Integer nb_second)
Met le process en sommeil pendant nb_second secondes.
ARCCORE_BASE_EXPORT String getUserName()
Nom de l'utilisateur.
ARCCORE_BASE_EXPORT bool getConsoleHasColor()
Indique si la console supporte les couleurs.
ARCCORE_BASE_EXPORT String getCurrentDirectory()
Chemin du répertoire courant.
ARCCORE_BASE_EXPORT String getHomeDirectory()
Répertoire contenant les documents utilisateurs.
ARCCORE_BASE_EXPORT String getFileDirName(const String &file_name)
Retourne le nom du répertoire d'un fichier.
ARCCORE_BASE_EXPORT Int64 getCPUTime()
Temps CPU utilisé en microsecondes.
ARCCORE_BASE_EXPORT long unsigned int getFileLength(const String &filename)
Longueur du fichier filename. Si le fichier n'est pas lisible ou n'existe pas, retourne 0.
ARCCORE_BASE_EXPORT int getProcessId()
Numéro du processus.
ARCCORE_BASE_EXPORT String getCurrentDate()
Date courante.
ARCCORE_BASE_EXPORT bool recursiveCreateDirectory(const String &dir_name)
Créé un répertoire.
ARCCORE_BASE_EXPORT double getMemoryUsed()
Mémoire utilisée em octets.
ARCCORE_BASE_EXPORT void raiseFloatingException()
Lève une exception flottante.
ARCCORE_BASE_EXPORT IStackTraceService * setStackTraceService(IStackTraceService *service)
Positionne le service utilisé pour obtenir la pile d'appel.
ARCCORE_BASE_EXPORT long getCurrentTime()
Date courante.
ARCCORE_BASE_EXPORT bool isDenormalized(Real v)
Retourne true si v est dénormalisé (flottant invalide).
ARCCORE_BASE_EXPORT bool createDirectory(const String &dir_name)
Créé le répertoire.
ARCCORE_BASE_EXPORT String getHostName()
Nom de la machine sur lequel tourne le processus.
ARCCORE_BASE_EXPORT String timeToHourMinuteSecond(Real t)
Retourne un temps sous forme des heures, minutes et secondes.