14#include "arcane/utils/ArcanePrecomp.h"
16#include "arcane/utils/ScopedPtr.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/Convert.h"
20#include "arcane/core/ISubDomain.h"
21#include "arcane/core/EntryPoint.h"
22#include "arcane/core/Timer.h"
23#include "arcane/core/ITimeHistoryMng.h"
24#include "arcane/core/ModuleFactory.h"
25#include "arcane/core/ServiceUtils.h"
26#include "arcane/core/ICheckpointWriter.h"
27#include "arcane/core/ICheckpointMng.h"
28#include "arcane/core/Directory.h"
29#include "arcane/core/IParallelMng.h"
31#include "arcane/core/OutputChecker.h"
32#include "arcane/std/ArcaneCheckpoint_axl.h"
46class ArcaneCheckpointModule
47:
public ArcaneArcaneCheckpointObject
51 ArcaneCheckpointModule(
const ModuleBuilder& cb);
52 ~ArcaneCheckpointModule();
61 virtual void checkpointStartInit();
62 virtual void checkpointInit();
68 Timer* m_checkpoint_timer;
70 String m_checkpoint_dirname;
76 void _getCheckpointService();
77 void _setDirectoryName();
78 bool _checkHasOutput();
84ARCANE_REGISTER_MODULE_ARCANECHECKPOINT(ArcaneCheckpointModule);
89ArcaneCheckpointModule::
90ArcaneCheckpointModule(
const ModuleBuildInfo& mb)
92, m_output_checker(mb.subDomain(),
"CheckpointRestart")
93, m_checkpoint_timer(0)
94, m_checkpoint_writer(0)
95, m_checkpoint_dirname(
".")
97 m_checkpoint_timer =
new Timer(mb.subDomain(),
"Checkpoint",
Timer::TimerReal);
99 m_output_checker.assignGlobalTime(&m_next_global_time, &
options()->frequency);
100 m_output_checker.assignCPUTime(&m_next_cpu_time, &
options()->frequencyCpu);
106ArcaneCheckpointModule::
107~ArcaneCheckpointModule()
109 delete m_checkpoint_timer;
115void ArcaneCheckpointModule::
121 m_next_cpu_time =
options()->frequencyCpu();
122 info() <<
" -------------------------------------------";
123 info() <<
"| PROTECTION-REPRISE |";
124 info() <<
" -------------------------------------------";
129 m_output_checker.initialize();
133 if (
options()->doDumpAtEnd()) {
134 info() <<
"Protection requise à la fin des calculs";
135 _getCheckpointService();
142bool ArcaneCheckpointModule::
150 bool do_output = m_output_checker.check(old_time, current_time, iteration, cpu_used);
157void ArcaneCheckpointModule::
160 m_next_global_time = 0.;
185 if (m_checkpoint_writer)
186 m_checkpoint_writer->close();
187 m_checkpoint_writer = 0;
193void ArcaneCheckpointModule::
198 info() <<
"Temps total passé dans la sortie de protection (secondes) : " << total_time;
201 info() <<
"Temps moyen par sortie (secondes) : " << total_time / nb_time
202 <<
" (pour " << nb_time <<
" sorties";
208void ArcaneCheckpointModule::
212 if (export_dir.path().null())
215 Directory output_directory = Directory(export_dir,
"protection");
217 if (pm->isMasterIO())
218 output_directory.createDirectory();
221 m_checkpoint_dirname = output_directory.path();
238 if (!m_checkpoint_writer)
239 _getCheckpointService();
240 if (m_checkpoint_writer) {
241 Integer nb_checkpoint = m_checkpoints_time.size();
242 m_checkpoints_time.resize(nb_checkpoint + 1);
244 m_checkpoints_time[nb_checkpoint] = checkpoint_time;
245 m_checkpoint_writer->setCheckpointTimes(m_checkpoints_time);
246 m_checkpoint_writer->setBaseDirectoryName(m_checkpoint_dirname);
247 info() <<
"**** Protection active au temps " << checkpoint_time
248 <<
" répertoire=" << m_checkpoint_dirname
249 <<
" numéro " << nb_checkpoint <<
" ******";
253 info() <<
"Temps d'écriture du point de contrôle (secondes) : "
254 << m_checkpoint_timer->lastActivationTime();
264void ArcaneCheckpointModule::
265_getCheckpointService()
270 options()->checkpointService.getAvailableNames(valid_values);
271 pfatal() <<
"Les protections sont requises mais le service de protection/restauration sélectionné ("
272 <<
options()->checkpointService.serviceName() <<
") n'est pas disponible "
273 <<
"(valeurs valides : " << String::join(
", ", valid_values) <<
")";
275 m_checkpoint_writer = checkpoint;
289 bool do_output = _checkHasOutput();
293 info() <<
"Protection requise.";
Génération 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.
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.
virtual void writeDefaultCheckpoint(ICheckpointWriter *writer)=0
Écrit une protection avec l'écrivain writer.
Interface du service d'écriture d'une protection/reprise.
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.
virtual void dumpHistory(bool is_verbose)=0
Sauve l'historique.
Gère les sorties basées sur un temps physique, temps CPU ou un nombre d'itération.
Chaîne de caractères unicode.
Positionne la phase de l'action en cours d'exécution.
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Integer nbActivated() const
Retourne le nombre de fois que le timer a été activé
@ TimerReal
Timer utilisant le temps réel.
Real totalTime() const
Retourne le temps total (en secondes) passé dans le timer.
TraceMessage pfatal() const
Flot pour un message d'erreur fatale en parallèle.
TraceMessage info() const
Flot pour un message d'information.
Informations sur une version.
Integer toInteger(Real r)
Convertit un Real en Integer.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.