14#include "arcane/impl/ExecutionStatsDumper.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/OStringStream.h"
18#include "arcane/utils/IMemoryInfo.h"
19#include "arcane/utils/Profiling.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/JSONWriter.h"
22#include "arcane/utils/FloatingPointExceptionSentry.h"
24#include "arccore/base/internal/ProfilingInternal.h"
26#include "arcane/core/ISubDomain.h"
27#include "arcane/core/IVariableMng.h"
28#include "arcane/core/IVariableSynchronizerMng.h"
29#include "arcane/core/IPropertyMng.h"
30#include "arcane/core/ITimeLoopMng.h"
31#include "arcane/core/IMesh.h"
32#include "arcane/core/ITimeStats.h"
33#include "arcane/core/Directory.h"
34#include "arcane/core/IParallelMng.h"
35#include "arcane/core/ServiceBuilder.h"
36#include "arcane/core/ISimpleTableOutput.h"
51void ExecutionStatsDumper::
54 json_writer.write(
"Version",
"1");
55 auto f = [&](
const Impl::ForLoopStatInfoList& stat_list) {
56 JSONWriter::Object jo(json_writer);
57 json_writer.writeKey(
"Loops");
58 json_writer.beginArray();
59 for (
const auto& x : stat_list._internalImpl()->m_stat_map) {
60 JSONWriter::Object jo2(json_writer);
61 const auto& s = x.second;
62 json_writer.write(
"Name", x.first);
63 json_writer.write(
"TotalTime", s.execTime());
64 json_writer.write(
"NbLoop", s.nbCall());
65 json_writer.write(
"NbChunk", s.nbChunk());
67 json_writer.endArray();
70 json_writer.writeKey(
"AllLoops");
71 json_writer.beginArray();
73 json_writer.endArray();
79void ExecutionStatsDumper::
80_dumpProfilingJSON(
const String& filename)
82 JSONWriter json_writer;
84 JSONWriter::Object jo(json_writer);
85 _dumpProfilingJSON(json_writer);
88 ofstream ofile(filename.localstr());
89 ofile << json_writer.getBuffer();
96void ExecutionStatsDumper::
99 table->init(
"Profiling");
101 table->addColumn(
"TotalTime");
102 table->addColumn(
"NbLoop");
103 table->addColumn(
"NbChunk");
106 auto f = [&](
const Impl::ForLoopStatInfoList& stat_list) {
107 for (
const auto& x : stat_list._internalImpl()->m_stat_map) {
108 const auto& s = x.second;
109 String row_name = x.first;
111 row_name = String::format(
"{0}_{1}", x.first, list_index);
112 Integer row = table->addRow(row_name);
113 table->addElementInRow(row,
static_cast<Real>(s.execTime()));
114 table->addElementInRow(row,
static_cast<Real>(s.nbCall()));
115 table->addElementInRow(row,
static_cast<Real>(s.nbChunk()));
126void ExecutionStatsDumper::
127_dumpProfiling(std::ostream& o)
129 Impl::dumpProfilingStatistics(o);
135void ExecutionStatsDumper::
138 FloatingPointExceptionSentry fp_sentry(
false);
142 info() <<
"Memory consumption (Mo): " << mem / 1.e6;
148 postr() <<
"Properties:\n";
149 sd->propertyMng()->print(postr());
150 plog() << postr.str();
152 IVariableMng* vm = sd->variableMng();
154 IVariableSynchronizerMng* vsm = vm->synchronizerMng();
155 OStringStream ostr_vsm;
156 vsm->dumpStats(ostr_vsm());
157 info() << ostr_vsm.str();
159 OStringStream ostr_full;
160 vm->dumpStats(ostr_full(),
true);
162 vm->dumpStats(ostr(),
false);
163 plog() << ostr_full.str();
164 info() << ostr.str();
168 IMemoryInfo* mem_info = arcaneGlobalMemoryInfo();
170 mem_info->printInfos(ostr());
171 info() << ostr.str();
177 nb_loop = sd->timeLoopMng()->nbLoop();
178 if (sd->defaultMesh())
179 nb_cell = sd->defaultMesh()->nbCell();
182 info() <<
"NB_CELL=" << nb_cell <<
" nb_loop=" << nb_loop;
187 _dumpProfiling(ostr());
188 String str = ostr.str();
190 info() <<
"LoopStatistics:\n"
193 Directory dir = sd->listingDirectory();
194 Int32 rank = sd->parallelMng()->commRank();
196 String filename = String::format(
"loop_profiling.{0}.json", rank);
197 String full_filename(dir.file(filename));
198 _dumpProfilingJSON(full_filename);
201 ServiceBuilder<ISimpleTableOutput> sb(sd);
202 Ref<ISimpleTableOutput> table(sb.createReference(
"SimpleCsvOutput"));
203 _dumpProfilingTable(table.get());
208 _dumpProfilingJSON(
"loop_profiling.json");
212 bool use_elapsed_time =
true;
214 use_elapsed_time =
true;
216 use_elapsed_time =
false;
217 OStringStream ostr_full;
218 time_stat->dumpStats(ostr_full(),
true, n,
"cell", use_elapsed_time);
220 time_stat->dumpStats(ostr(),
false, n,
"cell", use_elapsed_time);
221 info() << ostr.str();
222 plog() << ostr_full.str();
Interface représentant une sortie de tableau simple.
Interface du gestionnaire d'un sous-domaine.
Interface gérant les statistiques sur les temps d'exécution.
virtual void flush()=0
Flush tous les flots.
static void visitLoopStat(const std::function< void(const Impl::ForLoopStatInfoList &)> &f)
Visite la liste des statistiques des boucles.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage plog() const
Flot pour un message de log.
ITraceMng * traceMng() const
Gestionnaire de trace.
-*- 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.
std::int32_t Int32
Type entier signé sur 32 bits.