Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
SolverStater.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/* alienc (C) 2000-2024 */
9/* */
10/* Stats for Alien solvers */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#pragma once
15
17#include <alien/expression/solver/SolverStat.h>
18#include <alien/utils/Precomp.h>
19
20/*---------------------------------------------------------------------------*/
21
22namespace Alien
23{
24
25/*---------------------------------------------------------------------------*/
26class ALIEN_EXPORT BaseSolverStater
27{
28 public:
29 typedef enum
30 {
31 eNone,
32 eInit,
33 ePrepare,
34 eSolve
35 } eStateType;
36
37 public:
38 BaseSolverStater()
39 : m_state(eNone)
40 , m_suspend_count(0)
41 {}
42
43 virtual ~BaseSolverStater() {}
44
45 public:
46 static Real getVirtualTimeCounter() { return _getVirtualTime(); }
47
48 static Real getRealTimeCounter() { return _getRealTime(); }
49
50 class Sentry
51 {
52 public:
53 Sentry(Real& time_counter, bool is_virtual = false)
54 : m_counter(time_counter)
55 , m_is_virtual(is_virtual)
56 {
57 m_start_counter = m_is_virtual ? BaseSolverStater::getVirtualTimeCounter()
58 : BaseSolverStater::getRealTimeCounter();
59 }
60
61 virtual ~Sentry()
62 {
63 Real end_counter = m_is_virtual ? BaseSolverStater::getVirtualTimeCounter()
64 : BaseSolverStater::getRealTimeCounter();
65 m_counter += end_counter - m_start_counter;
66 }
67
68 private:
69 Real& m_counter;
70 Real m_start_counter;
71 bool m_is_virtual;
72 };
73
74 protected:
75 static Arccore::Real _getVirtualTime();
76
77 static Arccore::Real _getRealTime();
78
79 static void _errorInTimer(const String& msg, int retcode);
80
81 void _startTimer();
82
83 void _stopTimer();
84
85 protected:
86 eStateType m_state;
87 Integer m_suspend_count;
90};
91
92template <typename SolverT>
93class SolverStater : public BaseSolverStater
94{
95 public:
96 public:
98 SolverStater(SolverT* solver)
99 : BaseSolverStater()
100 , m_solver(solver)
101 {}
102
104 virtual ~SolverStater() {}
105
106 public:
107 void reset()
108 {
109 m_solver->getSolverStat().reset();
110
111 m_state = eNone;
112 m_suspend_count = 0;
113 }
114
115 void startInitializationMeasure()
116 {
117 ALIEN_ASSERT((m_state == eNone), ("Unexpected SolverStater state %d", m_state));
118 _startTimer();
119 m_state = eInit;
120 }
121
122 void stopInitializationMeasure()
123 {
124 ALIEN_ASSERT((m_state == eInit), ("Unexpected SolverStater state %d", m_state));
125 _stopTimer();
126 m_state = eNone;
127
128 auto& solver_stat = m_solver->getSolverStat();
129 solver_stat.m_initialization_time += m_real_time;
130 solver_stat.m_initialization_cpu_time += m_cpu_time;
131 }
132
133 void startPrepareMeasure()
134 {
135 ALIEN_ASSERT((m_state == eNone), ("Unexpected SolverStater state %d", m_state));
136 _startTimer();
137 m_state = ePrepare;
138 }
139
140 void suspendPrepareMeasure()
141 {
142 ALIEN_ASSERT((m_state == ePrepare), ("Unexpected SolverStater state %d", m_state));
143 _stopTimer();
144 auto& solver_stat = m_solver->getSolverStat();
145 if (m_suspend_count == 0) {
146 solver_stat.m_last_prepare_time = m_real_time;
147 solver_stat.m_last_prepare_cpu_time = m_cpu_time;
148 }
149 else {
150 solver_stat.m_last_prepare_time += m_real_time;
151 solver_stat.m_last_prepare_cpu_time += m_cpu_time;
152 }
153 m_state = eNone;
154 ++m_suspend_count;
155 }
156
157 void stopPrepareMeasure()
158 {
159 if (m_state == ePrepare)
160 suspendPrepareMeasure();
161 ALIEN_ASSERT((m_suspend_count > 0), ("Unexpected suspend count"));
162
163 auto& solver_stat = m_solver->getSolverStat();
164 solver_stat.m_last_prepare_time += m_real_time;
165 solver_stat.m_last_prepare_cpu_time += m_cpu_time;
166
167 m_suspend_count = 0;
168 m_state = eNone;
169 solver_stat.m_prepare_time += solver_stat.m_last_prepare_time;
170 solver_stat.m_prepare_cpu_time += solver_stat.m_last_prepare_cpu_time;
171 }
172
173 void startSolveMeasure()
174 {
175 ALIEN_ASSERT((m_state == eNone), ("Unexpected SolverStater state %d", m_state));
176 _startTimer();
177 m_state = eSolve;
178 }
179
180 void stopSolveMeasure()
181 {
182 ALIEN_ASSERT((m_state == eSolve), ("Unexpected SolverStater state %d", m_state));
183 _stopTimer();
184 m_state = eNone;
185 auto const& status = m_solver->getStatus();
186 auto& solver_stat = m_solver->getSolverStat();
187 solver_stat.m_last_solve_time = m_real_time;
188 solver_stat.m_last_solve_cpu_time = m_cpu_time;
189 solver_stat.m_solve_time += solver_stat.m_last_solve_time;
190 solver_stat.m_solve_cpu_time += solver_stat.m_last_solve_cpu_time;
191 ++solver_stat.m_solve_count;
192 solver_stat.m_last_iteration_count = status.iteration_count;
193 solver_stat.m_iteration_count += solver_stat.m_last_iteration_count;
194 }
195
196 private:
197 SolverT* m_solver = nullptr;
198};
199
200/*---------------------------------------------------------------------------*/
201template <typename SolverT>
202class SolverStatSentry
203{
204 private:
205 bool m_is_released = false;
206 SolverStater<SolverT> m_solver_stater;
207 BaseSolverStater::eStateType m_state = BaseSolverStater::eNone;
208
209 public:
210 SolverStatSentry(SolverStater<SolverT>& parent, BaseSolverStater::eStateType state)
211 : m_solver_stater(parent)
212 , m_state(state)
213 {
214 switch (m_state) {
215 case BaseSolverStater::eInit:
216 m_solver_stater.reset();
217 m_solver_stater.startInitializationMeasure();
218 break;
219 case BaseSolverStater::ePrepare:
220 m_solver_stater.startPrepareMeasure();
221 break;
222 case BaseSolverStater::eSolve:
223 m_solver_stater.startSolveMeasure();
224 break;
225 default:
226 break;
227 }
228 }
229
230 virtual ~SolverStatSentry() { release(); }
231
232 void release()
233 {
234 if (m_is_released)
235 return;
236 switch (m_state) {
237 case BaseSolverStater::eInit:
238 m_solver_stater.stopInitializationMeasure();
239 break;
240 case BaseSolverStater::ePrepare:
241 m_solver_stater.stopPrepareMeasure();
242 break;
243 case BaseSolverStater::eSolve:
244 m_solver_stater.stopSolveMeasure();
245 break;
246 default:
247 break;
248 }
249 m_is_released = true;
250 }
251};
252
253/*---------------------------------------------------------------------------*/
254
255} // namespace Alien
256
257/*---------------------------------------------------------------------------*/
ILinearSolver.h.
Real m_cpu_time
'cpu' time for the lastest start or stop
Real m_real_time
'wall clock' time for the lastest start or stop
SolverStater(SolverT *solver)
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17