Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Profiling.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* Profiling.h (C) 2000-2022 */
9/* */
10/* Classes pour gérer le profilage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_PROFILING_H
13#define ARCANE_UTILS_PROFILING_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arcane/utils/String.h"
20
21#include <atomic>
22#include <functional>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane::impl
28{
29class AcceleratorStatInfoList;
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33/*!
34 * \brief Classe permettant de récupérer le temps passé entre l'appel au
35 * constructeur et au destructeur.
36 */
37class ARCANE_UTILS_EXPORT ScopedStatLoop
38{
39 public:
40
41 explicit ScopedStatLoop(ForLoopOneExecStat* s);
43
44 public:
45
46 Int64 m_begin_time = 0.0;
47 ForLoopOneExecStat* m_stat_info = nullptr;
48};
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52/*!
53 * \brief Statistiques d'exécution des boucles.
54 */
55class ARCANE_UTILS_EXPORT ForLoopStatInfoList
56{
57 public:
58
61
62 public:
63
64 void merge(const ForLoopOneExecStat& loop_stat_info, const ForLoopTraceInfo& loop_trace_info);
65
66 public:
67
68 /*!
69 * \internal
70 * \brief Type opaque pour l'implémentation interne.
71 */
72 ForLoopStatInfoListImpl* _internalImpl() const { return m_p; }
73
74 private:
75
76 ForLoopStatInfoListImpl* m_p = nullptr;
77};
78
79} // namespace Arcane::impl
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
83
84namespace Arcane
85{
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89/*!
90 * \brief Classe pour gérer le profiling d'une seule exécution d'une boucle.
91 */
92class ARCANE_UTILS_EXPORT ForLoopOneExecStat
93{
94 public:
95
96 /*!
97 * \brief Incrémente le nombre de chunk utilisé.
98 *
99 * Cette méthode peut être appelée simultanément par plusieurs threads.
100 */
101 void incrementNbChunk() { ++m_nb_chunk; }
102
103 //! Positionne le temps de début de la boucle (en nanoseconde)
104 void setBeginTime(Int64 v) { m_begin_time = v; }
105
106 //! Positionne le temps de fin de la boucle en nanoseconde
107 void setEndTime(Int64 v) { m_end_time = v; }
108
109 //! Nombre de chunks
110 Int64 nbChunk() const { return m_nb_chunk; }
111
112 /*!
113 * \brief Temps d'exécution (en nanoseconde).
114 *
115 * La valeur retournée n'est valide que si setBeginTime() et setEndTime()
116 * ont été appelés avant.
117 */
118 Int64 execTime() const { return m_end_time - m_begin_time; }
119
120 void reset()
121 {
122 m_nb_chunk = 0;
123 m_begin_time = 0;
124 m_end_time = 0;
125 }
126
127 private:
128
129 //! Nombre de chunk de décomposition de la boucle (en multi-thread)
130 std::atomic<Int64> m_nb_chunk = 0;
131
132 // Temps de début d'exécution
133 Int64 m_begin_time = 0;
134
135 // Temps de fin d'exécution
136 Int64 m_end_time = 0;
137};
138
139/*---------------------------------------------------------------------------*/
140/*---------------------------------------------------------------------------*/
141/*!
142 * \brief Gestionnaire pour le profiling.
143 *
144 * Il est possible d'activer le profilage en appelant setProfilingLevel() avec
145 * une valeur supérieur ou égale à 1.
146 *
147 * L'ajout de statistiques se fait en récupérant une instance de
148 * impl::ForLoopStatInfoList spécifique au thread en cours d'exécution.
149 */
150class ARCANE_UTILS_EXPORT ProfilingRegistry
151{
152 public:
153
154 /*!
155 * TODO: rendre obsolète. Utiliser à la place:
156 * static impl::ForLoopStatInfoList* _threadLocalForLoopInstance();
157 */
158 ARCANE_DEPRECATED_REASON("Y2023: Use _threadLocalForLoopInstance() instead")
159 static impl::ForLoopStatInfoList* threadLocalInstance();
160
161 /*!
162 * \brief Positionne le niveau de profilage.
163 *
164 * Si 0, alors il n'y a pas de profilage. Le profilage est actif à partir
165 * du niveau 1.
166 */
167 static void setProfilingLevel(Int32 level);
168
169 //! Niveau de profilage
170 static Int32 profilingLevel() { return m_profiling_level; }
171
172 //! Indique si le profilage est actif.
173 static bool hasProfiling() { return m_profiling_level > 0; }
174
175 /*!
176 * \brief Visite la liste des statistiques des boucles
177 *
178 * Il y a une instance de impl::ForLoopStatInfoList par thread qui a
179 * exécuté une boucle.
180 *
181 * Cette méthode ne doit pas être appelée s'il y a des boucles en cours d'exécution.
182 */
183 static void visitLoopStat(const std::function<void(const impl::ForLoopStatInfoList&)>& f);
184
185 /*!
186 * \brief Visite la liste des statistiques sur accélérateur
187 *
188 * Il y a une instance de impl::AcceleratorStatInfoList par thread qui a
189 * exécuté une boucle.
190 *
191 * Cette méthode ne doit pas être appelée lorsque le profiling est actif.
192 */
193 static void visitAcceleratorStat(const std::function<void(const impl::AcceleratorStatInfoList&)>& f);
194
195 static const impl::ForLoopCumulativeStat& globalLoopStat();
196
197 public:
198
199 // API publique mais réservée à Arcane.
200
201 /*!
202 * \internal.
203 * Instance locale par thread du gestionnaire des statistiques de boucle
204 */
205 static impl::ForLoopStatInfoList* _threadLocalForLoopInstance();
206
207 /*!
208 * \internal.
209 * Instance locale par thread du gestionnaire des statistiques pour accélérateur
210 */
211 static impl::AcceleratorStatInfoList* _threadLocalAcceleratorInstance();
212
213 private:
214
215 static Int32 m_profiling_level;
216};
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
221} // End namespace Arcane
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
225
226#endif
Déclarations des types utilisés dans Arcane.
Informations de trace pour une boucle 'for'.
Statistiques d'exécution des boucles.
Definition Profiling.h:56
Classe permettant de récupérer le temps passé entre l'appel au constructeur et au destructeur.
Definition Profiling.h:38
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-