Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ArcaneCheckpointModule.cc
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/* ArcaneCheckpointModule.cc (C) 2000-2020 */
9/* */
10/* Module gérant les protections/reprises. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ArcanePrecomp.h"
15
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/StringBuilder.h"
18
19#include "arcane/ISubDomain.h"
20#include "arcane/EntryPoint.h"
21#include "arcane/Timer.h"
22#include "arcane/ITimeHistoryMng.h"
23#include "arcane/ModuleFactory.h"
24#include "arcane/ServiceUtils.h"
25#include "arcane/ICheckpointWriter.h"
26#include "arcane/ICheckpointMng.h"
27#include "arcane/Directory.h"
28#include "arcane/IParallelMng.h"
29
30#include "arcane/OutputChecker.h"
31#include "arcane/std/ArcaneCheckpoint_axl.h"
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
46{
47 public:
48
51
52 public:
53
54 virtual VersionInfo versionInfo() const { return VersionInfo(0,9,1); }
55
56 public:
57
58 virtual void checkpointCheckAndWriteData();
59 virtual void checkpointStartInit();
60 virtual void checkpointInit();
61 virtual void checkpointExit();
62
63
64 private:
65
66 OutputChecker m_output_checker;
67 Timer* m_checkpoint_timer;
68 ICheckpointWriter* m_checkpoint_writer;
69 String m_checkpoint_dirname;
70
71 private:
72
73 void _doCheckpoint(bool save_history);
74 void _dumpStats();
75 void _getCheckpointService();
76 void _setDirectoryName();
77 bool _checkHasOutput();
78};
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
82
83ARCANE_REGISTER_MODULE_ARCANECHECKPOINT(ArcaneCheckpointModule);
84
85/*---------------------------------------------------------------------------*/
86/*---------------------------------------------------------------------------*/
87
88ArcaneCheckpointModule::
89ArcaneCheckpointModule(const ModuleBuildInfo& mb)
91, m_output_checker(mb.subDomain(),"CheckpointRestart")
92, m_checkpoint_timer(0)
93, m_checkpoint_writer(0)
94, m_checkpoint_dirname(".")
95{
96 m_checkpoint_timer = new Timer(mb.subDomain(),"Checkpoint",Timer::TimerReal);
97 m_output_checker.assignIteration(&m_next_iteration,&options()->period);
98 m_output_checker.assignGlobalTime(&m_next_global_time,&options()->frequency);
99 m_output_checker.assignCPUTime(&m_next_cpu_time,&options()->frequencyCpu);
100}
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105ArcaneCheckpointModule::
106~ArcaneCheckpointModule()
107{
108 delete m_checkpoint_timer;
109}
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113
114void ArcaneCheckpointModule::
115checkpointInit()
116{
117 // Contrairement aux autres types de sortie, il faut remettre le temps
118 // CPU de la prochaine sortie à zéro car le temps CPU utilisé est de
119 // l'exécution courante.
120 m_next_cpu_time = options()->frequencyCpu();
121 info() << " -------------------------------------------";
122 info() << "| PROTECTION-REPRISE |";
123 info() << " -------------------------------------------";
124 info() << " ";
125 //info() << " Utilise le service '" << options()->checkpointServiceName()
126 // << "' pour les protections";
127 info() << " ";
128 m_output_checker.initialize();
129 info() << " ";
130 // Si les protections sont actives, vérifie que le service spécifié
131 // existe bien
132 if (options()->doDumpAtEnd()){
133 info() << "Protection required at the end of computations";
134 _getCheckpointService();
135 }
136}
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
141bool ArcaneCheckpointModule::
142_checkHasOutput()
143{
144 Real old_time = m_global_old_time();
145 Real current_time = m_global_time();
146 Integer iteration = m_global_iteration();
148
149 bool do_output = m_output_checker.check(old_time,current_time,iteration,cpu_used);
150 return do_output;
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
156void ArcaneCheckpointModule::
157checkpointStartInit()
158{
159 m_next_global_time = 0.;
161 m_next_cpu_time = 0;
162
163 // Initialise le vérificateur de sortie. Il faut le faire ici si on
164 // veut sauver des choses à l'itération 1.
165 _checkHasOutput();
166}
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
177{
178 if (!options()->doDumpAtEnd())
179 return;
180
181 _doCheckpoint(false);
182 _dumpStats();
183
184 if (m_checkpoint_writer)
185 m_checkpoint_writer->close();
186 m_checkpoint_writer = 0;
187}
188
189/*---------------------------------------------------------------------------*/
190/*---------------------------------------------------------------------------*/
191
192void ArcaneCheckpointModule::
193_dumpStats()
194{
195 // Affiche statistiques d'exécutions
196 Real total_time = m_checkpoint_timer->totalTime();
197 info() << "Total time spent in protection output (second): " << total_time;
198 Integer nb_time = m_checkpoint_timer->nbActivated();
199 if (nb_time!=0)
200 info() << "Average time per output (second): " << total_time / nb_time
201 << " (for " << nb_time << " outputs";
202}
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207void ArcaneCheckpointModule::
208_setDirectoryName()
209{
210 Directory export_dir = subDomain()->storageDirectory();
211 if (export_dir.path().null())
212 export_dir = subDomain()->exportDirectory();
213
214 Directory output_directory = Directory(export_dir,"protection");
215 IParallelMng* pm = parallelMng();
216 if (pm->isMasterIO())
217 output_directory.createDirectory();
218 pm->barrier();
219
220 m_checkpoint_dirname = output_directory.path();
221}
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
232{
233 {
234 Timer::Sentry sentry(m_checkpoint_timer);
235 Timer::Phase tp(subDomain(),TP_InputOutput);
236 if (!m_checkpoint_writer)
237 _getCheckpointService();
238 if (m_checkpoint_writer){
239 Integer nb_checkpoint = m_checkpoints_time.size();
240 m_checkpoints_time.resize(nb_checkpoint+1);
242 m_checkpoints_time[nb_checkpoint] = checkpoint_time;
243 m_checkpoint_writer->setCheckpointTimes(m_checkpoints_time);
244 m_checkpoint_writer->setBaseDirectoryName(m_checkpoint_dirname);
245 info() << "**** Protection active at time " << checkpoint_time
246 << " directory=" << m_checkpoint_dirname
247 <<" numéro " << nb_checkpoint << " ******";
248 subDomain()->checkpointMng()->writeDefaultCheckpoint(m_checkpoint_writer);
249 }
250 }
251 info() << "Protection write time (second): "
252 << m_checkpoint_timer->lastActivationTime();
253
254 // Sauve les historiques
255 if (save_history)
256 subDomain()->timeHistoryMng()->dumpHistory(true);
257}
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
261
262void ArcaneCheckpointModule::
263_getCheckpointService()
264{
265 ICheckpointWriter* checkpoint = options()->checkpointService();
266 if (!checkpoint){
268 options()->checkpointService.getAvailableNames(valid_values);
269 pfatal() << "Protections required but protection/restore service selected ("
270 << options()->checkpointService.serviceName() << ") not available "
271 << "(valid values: " << String::join(", ",valid_values) << ")";
272 }
273 m_checkpoint_writer = checkpoint;
274 _setDirectoryName();
275}
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
285{
286 bool do_output = _checkHasOutput();
287 if (!do_output)
288 return;
289
290 info() << "Protection required.";
291 // TEMPORAIRE:
292 // Contrairement a la protection en fin d'execution, celle-ci a lieu
293 // dans à la fin de la boucle en temps, mais avant que le numéro
294 // d'itération ne soit incrémenté. Si on reprend à ce temps,
295 // le numéro d'itération ne sera pas bon. Pour corriger ce problème,
296 // on incrémente ce nombre avant la protection et on le remet
297 // à sa bonne valeur après.
298 // SDC : ce probleme n'est pas constaté. Il me semble que c'est bien le numérod
299 // de l'itération courante qu'il faut sauver. Changé pour un problème de restart
300 // pour une application IFPEN (en interne Bugzilla 778.
301 // m_global_iteration = m_global_iteration() + 1;
302 _doCheckpoint(true);
303 // m_global_iteration = m_global_iteration() - 1;
304}
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
309} // End namespace Arcane
310
311/*---------------------------------------------------------------------------*/
312/*---------------------------------------------------------------------------*/
Generation de la classe de base du Module.
CaseOptionsArcaneCheckpoint * options() const
Options du jeu de données du module.
Arcane::VariableScalarInteger m_next_iteration
Variables du module.
ISubDomain * subDomain() const override
Sous-domaine associé au module.
IParallelMng * parallelMng() const override
Gestionnaire du parallélisme par échange de message.
Module gérant les protections (mécanisme de protections/reprises).
virtual void checkpointCheckAndWriteData()
Vérifie s'il faut faire une protection à cet instant et l'effectue si nécessaire.
virtual VersionInfo versionInfo() const
Version du module.
void _doCheckpoint(bool save_history)
Effectue une protection.
virtual void checkpointExit()
Opérations de fin de calcul.
VariableScalarInt32 m_global_iteration
Itération courante.
VariableScalarReal m_global_cpu_time
Temps CPU utilisé (en seconde)
VariableScalarReal m_global_time
Temps actuel.
VariableScalarReal m_global_old_time
Temps précédent le temps actuel.
Interface du service d'écriture d'une protection/reprise.
virtual void setBaseDirectoryName(const String &dirname)=0
Positionne le nom du répertoire de base de la protection.
virtual void close()=0
Ferme les protections.
virtual void setCheckpointTimes(RealConstArrayView times)=0
Positionne les temps des protections.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual void barrier()=0
Effectue une barière.
virtual const IDirectory & storageDirectory() const =0
Répertoire de base des exportations nécessitant un archivage.
virtual ICheckpointMng * checkpointMng() const =0
Gestionnaire de protections.
virtual ITimeHistoryMng * timeHistoryMng()=0
Retourne le gestionnaire d'historique.
virtual const IDirectory & exportDirectory() const =0
Répertoire de base des exportations.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Informations pour construire un module.
Gère les sorties basées sur un temps physique, temps CPU ou un nombre d'itération.
bool check(Real old_time, Real current_time, Integer current_iteration, Integer current_cpu_time, const String &from_function=String())
Vérifie s'il faut effectuer une sortie.
Positionne la phase de l'action en cours d'exécution.
Definition Timer.h:128
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Definition Timer.h:89
Gestion d'un timer.
Definition Timer.h:62
Integer nbActivated() const
Retourne le nombre de fois que le timer a été activé
Definition Timer.h:222
@ TimerReal
Timer utilisant le temps réel.
Definition Timer.h:76
Real totalTime() const
Retourne le temps total (en secondes) passé dans le timer.
Definition Timer.h:216
Real lastActivationTime() const
Retourne le temps (en secondes) passé lors de la dernière activation du timer.
Definition Timer.h:219
virtual void resize(Integer new_size)
Redimensionne le tableau pour contenir new_size éléments.
Informations sur une version.
Definition VersionInfo.h:46
constexpr Integer size() const noexcept
Retourne la taille du tableau.
Chaîne de caractères unicode.
TraceMessage pfatal() const
Flot pour un message d'erreur fatale en parallèle.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Integer toInteger(Real r)
Converti un Real en Integer.
Definition Convert.h:53
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.