Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
TimeMetric.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* TimeMetric.h (C) 2000-2025 */
9/* */
10/* Classes managing temporal metrics. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCCORE_TRACE_INTERNAL_TIMEMETRIC_H
13#define ARCCORE_TRACE_INTERNAL_TIMEMETRIC_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arccore/trace/TraceGlobal.h"
18#include "arccore/trace/internal/ITimeMetricCollector.h"
19#include "arccore/base/String.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24/*
25 * API under definition. Do not use outside of Arccore/Arcane.
26 */
27namespace Arcane
28{
29
37{
38 Computation = 0,
40 InputOutput = 2
41};
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45
46class ARCCORE_TRACE_EXPORT TimeMetricActionBuildInfo
47{
48 public:
49
50 explicit TimeMetricActionBuildInfo(const String& name)
51 : m_name(name)
52 , m_phase(-1)
53 {}
54 TimeMetricActionBuildInfo(const String& name, int phase)
55 : m_name(name)
56 , m_phase(phase)
57 {}
58
59 public:
60
61 const String& name() const { return m_name; }
62 int phase() const { return m_phase; }
63
64 public:
65
66 String m_name;
67 int m_phase = -1;
68};
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
72
73class ARCCORE_TRACE_EXPORT TimeMetricAction
74{
75 public:
76
77 TimeMetricAction()
78 : m_collector(nullptr)
79 , m_phase(-1)
80 {}
81 TimeMetricAction(ITimeMetricCollector* c, const TimeMetricActionBuildInfo& x)
82 : m_collector(c)
83 , m_name(x.name())
84 , m_phase(x.phase())
85 {}
86
87 public:
88
89 ITimeMetricCollector* collector() const { return m_collector; }
90 const String& name() const { return m_name; }
91 int phase() const { return m_phase; }
92
93 private:
94
95 ITimeMetricCollector* m_collector;
96 String m_name;
97 int m_phase;
98};
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102// TODO: n'autoriser que la sémantique std::move
103class ARCCORE_TRACE_EXPORT TimeMetricId
104{
105 public:
106
107 TimeMetricId()
108 : m_id(-1)
109 {}
110 explicit TimeMetricId(const TimeMetricAction& action, Int64 id)
111 : m_action(action)
112 , m_id(id)
113 {}
114 const TimeMetricAction& action() const { return m_action; }
115 Int64 id() const { return m_id; }
116
117 public:
118
119 TimeMetricAction m_action;
120 Int64 m_id;
121};
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
129class ARCCORE_TRACE_EXPORT TimeMetricSentry
130{
131 public:
132
133 TimeMetricSentry()
134 : m_collector(nullptr)
135 {}
136 TimeMetricSentry(TimeMetricSentry&& rhs)
137 : m_collector(rhs.m_collector)
138 , m_id(rhs.m_id)
139 {
140 // Set rhs to null to prevent it from calling 'endAction'.
141 rhs.m_collector = nullptr;
142 }
143 explicit TimeMetricSentry(const TimeMetricAction& action)
144 : m_collector(action.collector())
145 {
146 if (m_collector)
147 m_id = m_collector->beginAction(action);
148 }
149 ~TimeMetricSentry() noexcept(false)
150 {
151 if (m_collector)
152 m_collector->endAction(m_id);
153 }
154
155 private:
156
157 ITimeMetricCollector* m_collector;
158 TimeMetricId m_id;
159};
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
167class ARCCORE_TRACE_EXPORT StandardPhaseTimeMetrics
168{
169 public:
170
171 StandardPhaseTimeMetrics() = default;
172 StandardPhaseTimeMetrics(ITimeMetricCollector* c) { initialize(c); }
173
174 public:
175
176 void initialize(ITimeMetricCollector* collector);
177
178 public:
179
181 const TimeMetricAction& messagePassingPhase() const { return m_message_passing_phase; }
183 const TimeMetricAction& inputOutputPhase() const { return m_input_output_phase; }
185 const TimeMetricAction& computationPhase() const { return m_computation_phase; }
186
187 private:
188
189 TimeMetricAction m_message_passing_phase;
190 TimeMetricAction m_input_output_phase;
191 TimeMetricAction m_computation_phase;
192};
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197extern "C++" ARCCORE_TRACE_EXPORT TimeMetricAction
198timeMetricPhaseMessagePassing(ITimeMetricCollector* c);
199extern "C++" ARCCORE_TRACE_EXPORT TimeMetricAction
200timeMetricPhaseInputOutput(ITimeMetricCollector* c);
201extern "C++" ARCCORE_TRACE_EXPORT TimeMetricAction
202timeMetricPhaseComputation(ITimeMetricCollector* c);
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207} // namespace Arcane
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
212#endif
Interface managing statistics on execution.
const TimeMetricAction & inputOutputPhase() const
Action to indicate that we are in an input-output phase.
Definition TimeMetric.h:183
const TimeMetricAction & computationPhase() const
Action to indicate that we are in a computation phase.
Definition TimeMetric.h:185
const TimeMetricAction & messagePassingPhase() const
Action to indicate that we are in a message passing phase.
Definition TimeMetric.h:181
Declarations of types and methods used by message exchange mechanisms.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int64_t Int64
Signed integer type of 64 bits.
TimeMetricPhase
Standard categories for temporal phases.
Definition TimeMetric.h:37