FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
statistics.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
9#include <kernel/util/string.hpp>
11#include <kernel/util/kahan_accumulator.hpp>
12#include <kernel/solver/expression.hpp>
13
14#include <list>
15#include <map>
16#include <time.h>
17#include <iostream>
18#include <fstream>
19#include <memory>
20
21namespace FEAT
22{
30 {
31 private:
32
34 static Index _flops;
35
38
41
44
47
50
53
56
59
62
65
68
71
74
76 static std::map<String, std::list<std::shared_ptr<Solver::ExpressionBase>>> _solver_expressions;
77
79 static std::map<String, String> _formatted_solver_trees;
80
82 static std::map<String, std::list<double>> _overall_toe;
83 static std::map<String, std::list<Index>> _overall_iters;
84 static std::map<String, std::list<double>> _overall_mpi_execute_reduction;
85 static std::map<String, std::list<double>> _overall_mpi_execute_blas2;
86 static std::map<String, std::list<double>> _overall_mpi_execute_blas3;
87 static std::map<String, std::list<double>> _overall_mpi_execute_collective;
88 static std::map<String, std::list<double>> _overall_mpi_wait_reduction;
89 static std::map<String, std::list<double>> _overall_mpi_wait_blas2;
90 static std::map<String, std::list<double>> _overall_mpi_wait_blas3;
91 static std::map<String, std::list<double>> _overall_mpi_wait_collective;
93 static std::map<String, std::list<std::vector<double>>> _outer_mg_toe;
94 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_execute_reduction;
95 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_execute_blas2;
96 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_execute_blas3;
97 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_execute_collective;
98 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_wait_reduction;
99 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_wait_blas2;
100 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_wait_blas3;
101 static std::map<String, std::list<std::vector<double>>> _outer_mg_mpi_wait_collective;
103 static std::map<String, std::list<double>> _outer_schwarz_toe;
105 static std::map<String, std::list<Index>> _outer_schwarz_iters;
106
107 /*static String _format_solver_statistics(String branch, SolverStatistics & stat)
108 {
109 String result;
110
111 result += "\n" + branch + "\n";
112 result +="Iteration Defects:\n";
113
114 for (Index i(0) ; i < stat.defect.size() ; ++i)
115 {
116 if (i == 0 && stat.defect.at(i) == double(-1))
117 continue;
118 if (stat.defect.at(i) == double(-1))
119 result += "------\n";
120 else
121 result += stringify_fp_sci(stat.defect.at(i)) + "\n";
122 }
123
124 result +="Iteration Timings [s]:\n";
125 for (Index i(0) ; i < stat.toe.size() ; ++i)
126 {
127 if (i == 0 && stat.toe.at(i) == double(-1))
128 continue;
129 if (stat.toe.at(i) == double(-1))
130 result += "------\n";
131 else
132 result += stringify_fp_sci(stat.toe.at(i)) + "\n";
133 }
134
135 result +="MPI Execution Iteration Timings [s]:\n";
136 for (Index i(0) ; i < stat.mpi_execute.size() ; ++i)
137 {
138 if (i == 0 && stat.mpi_execute.at(i) == double(-1))
139 continue;
140 if (stat.mpi_execute.at(i) == double(-1))
141 result += "------\n";
142 else
143 result += stringify_fp_sci(stat.mpi_execute.at(i)) + "\n";
144 }
145
146 result +="MPI Wait Iteration Timings [s]:\n";
147 for (Index i(0) ; i < stat.mpi_wait.size() ; ++i)
148 {
149 if (i == 0 && stat.mpi_wait.at(i) == double(-1))
150 continue;
151 if (stat.mpi_wait.at(i) == double(-1))
152 result += "------\n";
153 else
154 result += stringify_fp_sci(stat.mpi_wait.at(i)) + "\n";
155 }
156
157 return result;
158 }*/
159
160 static String _generate_formatted_solver_tree(String target);
161
162 public:
163
167 static double toe_partition;
169 static double toe_assembly;
171 static double toe_solve;
174
175
177 static void reset()
178 {
179 reset_flops();
180 reset_times();
181 _solver_expressions.clear();
182 _overall_toe.clear();
183 _overall_iters.clear();
184 _overall_mpi_execute_reduction.clear();
185 _overall_mpi_execute_blas2.clear();
186 _overall_mpi_execute_blas3.clear();
187 _overall_mpi_execute_collective.clear();
188 _overall_mpi_wait_reduction.clear();
189 _overall_mpi_wait_blas2.clear();
190 _overall_mpi_wait_blas3.clear();
191 _overall_mpi_wait_collective.clear();
192 _outer_mg_toe.clear();
193 _outer_mg_mpi_execute_reduction.clear();
194 _outer_mg_mpi_execute_blas2.clear();
195 _outer_mg_mpi_execute_blas3.clear();
196 _outer_mg_mpi_execute_collective.clear();
197 _outer_mg_mpi_wait_reduction.clear();
198 _outer_mg_mpi_wait_blas2.clear();
199 _outer_mg_mpi_wait_blas3.clear();
200 _outer_mg_mpi_wait_collective.clear();
201 _outer_schwarz_toe.clear();
202 _outer_schwarz_iters.clear();
203 }
204
206 static void add_flops(Index flops)
207 {
208 _flops += flops;
209 }
210
213 {
214 return _flops;
215 }
216
218 static String get_formatted_flops(double seconds, int ranks = 1)
219 {
220 double flops((double)_flops);
221 flops /= seconds;
222 flops /= 1000.; // kilo
223 flops /= 1000.; // mega
224 flops /= 1000.; // giga
225 return stringify(flops) + " GFlop/s [" + stringify(flops * double(ranks)) + " GFlops/s]";
226 }
227
229 static void reset_flops()
230 {
231 _flops = Index(0);
232 }
233
234 inline static void add_time_reduction(double seconds)
235 {
236 _time_reduction += seconds;
237 }
238 inline static void add_time_blas2(double seconds)
239 {
240 _time_blas2 += seconds;
241 }
242 inline static void add_time_blas3(double seconds)
243 {
244 _time_blas3 += seconds;
245 }
246 inline static void add_time_axpy(double seconds)
247 {
248 _time_axpy += seconds;
249 }
250 inline static void add_time_precon(double seconds)
251 {
252 _time_precon += seconds;
253 }
254 inline static void add_time_mpi_execute_reduction(double seconds)
255 {
257 }
258 inline static void add_time_mpi_execute_blas2(double seconds)
259 {
260 _time_mpi_execute_blas2 += seconds;
261 }
262 inline static void add_time_mpi_execute_blas3(double seconds)
263 {
264 _time_mpi_execute_blas3 += seconds;
265 }
266 inline static void add_time_mpi_execute_collective(double seconds)
267 {
269 }
270 inline static void add_time_mpi_wait_reduction(double seconds)
271 {
272 _time_mpi_wait_reduction += seconds;
273 }
274 inline static void add_time_mpi_wait_blas2(double seconds)
275 {
276 _time_mpi_wait_blas2 += seconds;
277 }
278 inline static void add_time_mpi_wait_blas3(double seconds)
279 {
280 _time_mpi_wait_blas3 += seconds;
281 }
282 inline static void add_time_mpi_wait_collective(double seconds)
283 {
284 _time_mpi_wait_collective += seconds;
285 }
286
287 inline static double get_time_reduction()
288 {
289 return _time_reduction;
290 }
291 inline static double get_time_blas2()
292 {
293 return _time_blas2.value;
294 }
295 inline static double get_time_blas3()
296 {
297 return _time_blas3.value;
298 }
299 inline static double get_time_axpy()
300 {
301 return _time_axpy.value;
302 }
303 inline static double get_time_precon()
304 {
305 return _time_precon.value;
306 }
307 inline static double get_time_mpi_execute_reduction()
308 {
310 }
311 inline static double get_time_mpi_execute_blas2()
312 {
314 }
315 inline static double get_time_mpi_execute_blas3()
316 {
318 }
319 inline static double get_time_mpi_execute_collective()
320 {
322 }
323 inline static double get_time_mpi_wait_reduction()
324 {
326 }
327 inline static double get_time_mpi_wait_blas2()
328 {
330 }
331 inline static double get_time_mpi_wait_blas3()
332 {
334 }
335 inline static double get_time_mpi_wait_collective()
336 {
338 }
339
340 inline static void add_solver_expression(std::shared_ptr<Solver::ExpressionBase> expression)
341 {
343 _solver_expressions[expression_target].push_back(expression);
344 }
345
346 static const std::list<std::shared_ptr<Solver::ExpressionBase>> & get_solver_expressions()
347 {
349 }
350
361 static String get_formatted_solver_tree(String target = "default")
362 {
363 if (_formatted_solver_trees.count(target) == 0)
365 if (_formatted_solver_trees.count(target) == 0)
366 return String("no solver tree for target '") + target + "' found";
367 else
368 return _formatted_solver_trees.at(target);
369 }
370
372 static void print_solver_expressions();
373
375 static void compress_solver_expressions();
376
378 static inline std::list<double> & get_time_toe(String target)
379 {
380 return _overall_toe.at(target);
381 }
382
384 static inline std::list<Index> & get_iters(String target)
385 {
386 return _overall_iters.at(target);
387 }
388
390 static inline std::list<double> & get_time_mpi_execute_reduction(String target)
391 {
392 return _overall_mpi_execute_reduction.at(target);
393 }
394
396 static inline std::list<double> & get_time_mpi_execute_blas2(String target)
397 {
398 return _overall_mpi_execute_blas2.at(target);
399 }
400
402 static inline std::list<double> & get_time_mpi_execute_blas3(String target)
403 {
404 return _overall_mpi_execute_blas3.at(target);
405 }
406
408 static inline std::list<double> & get_time_mpi_execute_collective(String target)
409 {
410 return _overall_mpi_execute_collective.at(target);
411 }
412
414 static inline std::list<double> & get_time_mpi_wait_reduction(String target)
415 {
416 return _overall_mpi_wait_reduction.at(target);
417 }
418
420 static inline std::list<double> & get_time_mpi_wait_blas2(String target)
421 {
422 return _overall_mpi_wait_blas2.at(target);
423 }
424
426 static inline std::list<double> & get_time_mpi_wait_blas3(String target)
427 {
428 return _overall_mpi_wait_blas3.at(target);
429 }
430
432 static inline std::list<double> & get_time_mpi_wait_collective(String target)
433 {
434 return _overall_mpi_wait_collective.at(target);
435 }
436
438 static inline std::list<std::vector<double>> & get_time_mg(String target)
439 {
440 return _outer_mg_toe.at(target);
441 }
442
444 static inline std::list<std::vector<double>> & get_time_mg_mpi_execute_reduction(String target)
445 {
446 return _outer_mg_mpi_execute_reduction.at(target);
447 }
448
450 static inline std::list<std::vector<double>> & get_time_mg_mpi_execute_blas2(String target)
451 {
452 return _outer_mg_mpi_execute_blas2.at(target);
453 }
454
456 static inline std::list<std::vector<double>> & get_time_mg_mpi_execute_blas3(String target)
457 {
458 return _outer_mg_mpi_execute_blas3.at(target);
459 }
460
462 static inline std::list<std::vector<double>> & get_time_mg_mpi_execute_collective(String target)
463 {
464 return _outer_mg_mpi_execute_collective.at(target);
465 }
466
468 static inline std::list<std::vector<double>> & get_time_mg_mpi_wait_reduction(String target)
469 {
470 return _outer_mg_mpi_wait_reduction.at(target);
471 }
472
474 static inline std::list<std::vector<double>> & get_time_mg_mpi_wait_blas2(String target)
475 {
476 return _outer_mg_mpi_wait_blas2.at(target);
477 }
478
480 static inline std::list<std::vector<double>> & get_time_mg_mpi_wait_blas3(String target)
481 {
482 return _outer_mg_mpi_wait_blas3.at(target);
483 }
484
486 static inline std::list<std::vector<double>> & get_time_mg_mpi_wait_collective(String target)
487 {
488 return _outer_mg_mpi_wait_collective.at(target);
489 }
490
492 static inline std::list<double> & get_time_schwarz(String target)
493 {
494 return _outer_schwarz_toe.at(target);
495 }
496
498 static inline std::list<Index> & get_iters_schwarz(String target)
499 {
500 return _outer_schwarz_iters.at(target);
501 }
502
508 static String get_formatted_times(double total_time);
509
511 static String get_formatted_solver_internals(String target = "default");
512
514 static void reset_times()
515 {
529 }
530
531 /*
532 static void write_out_solver_statistics_scheduled(Index rank, size_t la_bytes, size_t domain_bytes, size_t mpi_bytes, Index cells, Index dofs, Index nzes, String filename = "solver_stats");
533
534 static void write_out_solver_statistics(Index rank, size_t la_bytes, size_t domain_bytes, size_t mpi_bytes, Index cells, Index dofs, Index nzes, String filename = "solver_stats")
535 {
536 filename += ".";
537 filename += stringify(rank);
538
539 std::ofstream file(filename.c_str(), std::ofstream::out);
540 if (! file.is_open())
541 XABORTM("Unable to open statistics file " + filename);
542
543 {
544 time_t t = time(nullptr);
545 struct tm * ts = localtime(&t);
546
547 file << "timestamp " << stringify(ts->tm_mon + 1) << "/" << stringify(ts->tm_mday) << "/" << stringify(ts->tm_year + 1900) << " " << stringify(ts->tm_hour)
548 << ":" << stringify(ts->tm_min) << ":" << stringify(ts->tm_sec) << "\n";
549 }
550
551 file << "\n";
552
553 file << "#global time\n";
554 file << "partition " << stringify(toe_partition) << "\n";
555 file << "assembly " << stringify(toe_assembly) << "\n";
556 file << "solve " << stringify(toe_solve) << "\n";
557
558 file << "\n";
559
560 file << "#solver time\n";
561 file << "reduction " << stringify(get_time_reduction()) << "\n";
562 file << "axpy " << stringify(get_time_axpy()) << "\n";
563 file << "blas2 " << stringify(get_time_blas2()) << "\n";
564 file << "precon " << stringify(get_time_precon()) << "\n";
565 file << "mpi " << stringify(get_time_mpi_execute()) << "\n";
566 file << "wait reduction" << stringify(get_time_mpi_wait_reduction()) << "\n";
567 file << "wait blas2" << stringify(get_time_mpi_wait_blas2()) << "\n";
568
569 file << "\n";
570
571 file << "#global size\n";
572 file << "domain " << stringify(domain_bytes) << "\n";
573 file << "mpi " << stringify(mpi_bytes) << "\n";
574 file << "la " << stringify(la_bytes) << "\n";
575
576 file << "\n";
577
578 file <<"#problem size\n";
579 file << "cells " << stringify(cells) << "\n";
580 file << "dofs " << stringify(dofs) << "\n";
581 file << "nzes " << stringify(nzes) << "\n";
582
583 file << "\n";
584
585 file << "#solver statistics\n";
586 for (auto stat : _solver_statistics)
587 {
588 file << stat.first << "\n";
589
590 file << "#defects\n";
591 for (Index i(0) ; i < stat.second.defect.size() ; ++i)
592 {
593 if (i == 0 && stat.second.defect.at(i) == double(-1))
594 continue;
595 if (stat.second.defect.at(i) == double(-1))
596 file << "-\n";
597 else
598 file << stringify_fp_sci(stat.second.defect.at(i)) << "\n";
599 }
600
601 file << "#toe\n";
602 for (Index i(0) ; i < stat.second.toe.size() ; ++i)
603 {
604 if (i == 0 && stat.second.toe.at(i) == double(-1))
605 continue;
606 if (stat.second.toe.at(i) == double(-1))
607 file << "-\n";
608 else
609 file << stringify_fp_sci(stat.second.toe.at(i)) << "\n";
610 }
611
612 file << "#mpi_execute\n";
613 for (Index i(0) ; i < stat.second.mpi_execute.size() ; ++i)
614 {
615 if (i == 0 && stat.second.mpi_execute.at(i) == double(-1))
616 continue;
617 if (stat.second.mpi_execute.at(i) == double(-1))
618 file << "-\n";
619 else
620 file << stringify_fp_sci(stat.second.mpi_execute.at(i)) << "\n";
621 }
622
623 file << "#mpi_wait\n";
624 for (Index i(0) ; i < stat.second.mpi_wait.size() ; ++i)
625 {
626 if (i == 0 && stat.second.mpi_wait.at(i) == double(-1))
627 continue;
628 if (stat.second.mpi_wait.at(i) == double(-1))
629 file << "-\n";
630 else
631 file << stringify_fp_sci(stat.second.mpi_wait.at(i)) << "\n";
632 }
633 }
634
635 file.close();
636 }*/
637 };
638} // namespace FEAT
FEAT Kernel base header.
Kahan Summation accumulator class template.
DT_ value
the current sum value
void clear()
clears the accumulator, i.e. sets all values to zero
Statistics collection class.
Definition: statistics.hpp:30
static std::list< Index > & get_iters_schwarz(String target)
retrieve list of all outer schwarz solver call iteration count entries
Definition: statistics.hpp:498
static std::list< double > & get_time_mpi_execute_blas2(String target)
retrieve list of all overall solver mpi execute blas2 toe entries
Definition: statistics.hpp:396
static std::list< double > & get_time_mpi_wait_blas2(String target)
retrieve list of all overall solver mpi blas2 wait toe entries
Definition: statistics.hpp:420
static KahanAccumulator< double > _time_mpi_execute_blas3
global time of execution for mpi related idle/wait tasks of blas-3 operations
Definition: statistics.hpp:58
static KahanAccumulator< double > _time_precon
global time of execution for special preconditioner kernel type operations
Definition: statistics.hpp:49
static KahanAccumulator< double > _time_reduction
global time of execution for reduction type operations
Definition: statistics.hpp:37
static KahanAccumulator< double > _time_mpi_execute_reduction
global time of execution for mpi related idle/wait tasks of (scalar) reduction operations
Definition: statistics.hpp:52
static std::map< String, String > _formatted_solver_trees
mapping of solver target name to formatted solver tree string
Definition: statistics.hpp:79
static String get_formatted_solver_tree(String target="default")
Returns a descriptive string of the complete solver tree.
Definition: statistics.hpp:361
static std::list< double > & get_time_mpi_wait_blas3(String target)
retrieve list of all overall solver mpi blas3 wait toe entries
Definition: statistics.hpp:426
static std::map< String, std::list< std::vector< double > > > _outer_mg_toe
mapping of solver name to list of outer multigrid level timings. each std::vector holds a complete le...
Definition: statistics.hpp:93
static Index _flops
global flop counter
Definition: statistics.hpp:34
static std::list< std::vector< double > > & get_time_mg_mpi_execute_blas3(String target)
retrieve list of all overall solver mpi execute blas3 toe entries per level
Definition: statistics.hpp:456
static std::map< String, std::list< double > > _outer_schwarz_toe
overall time of outer schwarz preconditioners internal solver
Definition: statistics.hpp:103
static std::list< double > & get_time_mpi_wait_reduction(String target)
retrieve list of all overall solver mpi reduction wait toe entries
Definition: statistics.hpp:414
static std::list< double > & get_time_mpi_wait_collective(String target)
retrieve list of all overall solver mpi collective wait toe entries
Definition: statistics.hpp:432
static std::list< double > & get_time_mpi_execute_collective(String target)
retrieve list of all overall solver mpi execute collective toe entries
Definition: statistics.hpp:408
static void compress_solver_expressions()
compress solver statistics (toe / defect norm / mpi timings) from previous calls
Definition: statistics.cpp:866
static KahanAccumulator< double > _time_mpi_execute_blas2
global time of execution for mpi related idle/wait tasks of blas-2 operations
Definition: statistics.hpp:55
static void reset_times()
Reset all global timer counters.
Definition: statistics.hpp:514
static String get_formatted_solver_internals(String target="default")
Retrieve formatted timings and iteration counts of internal solver structures for the provided solver...
Definition: statistics.cpp:558
static std::map< String, std::list< double > > _overall_toe
overall time per reset call per solver name string.
Definition: statistics.hpp:82
static KahanAccumulator< double > _time_axpy
global time of execution for blas-1 type operations
Definition: statistics.hpp:46
static std::map< String, std::list< std::shared_ptr< Solver::ExpressionBase > > > _solver_expressions
a consecutive list of all solver actions
Definition: statistics.hpp:76
static KahanAccumulator< double > _time_mpi_wait_reduction
global time of wait execution for mpi related idle/wait tasks of (scalar) reduction operations
Definition: statistics.hpp:64
static std::list< double > & get_time_schwarz(String target)
retrieve list of all outer schwarz solver call toe entries
Definition: statistics.hpp:492
static void add_flops(Index flops)
Add an amount of flops to the global flop counter.
Definition: statistics.hpp:206
static KahanAccumulator< double > _time_blas2
global time of execution for blas-2 type operations
Definition: statistics.hpp:40
static std::list< double > & get_time_mpi_execute_blas3(String target)
retrieve list of all overall solver mpi execute blas3 toe entries
Definition: statistics.hpp:402
static KahanAccumulator< double > _time_mpi_execute_collective
global time of execution for mpi related idle/wait tasks of collective operations (without scalar red...
Definition: statistics.hpp:61
static std::list< Index > & get_iters(String target)
retrieve list of all overall solver iteration entries
Definition: statistics.hpp:384
static bool enable_solver_expressions
specifies whether collection of solver expressions is to be enabled
Definition: statistics.hpp:165
static std::list< std::vector< double > > & get_time_mg(String target)
retrieve list of all overall solver toe entries per mg level
Definition: statistics.hpp:438
static Index get_flops()
Retrieve current global flop counter.
Definition: statistics.hpp:212
static std::list< std::vector< double > > & get_time_mg_mpi_execute_collective(String target)
retrieve list of all overall solver mpi execute collective toe entries per level
Definition: statistics.hpp:462
static KahanAccumulator< double > _time_mpi_wait_collective
global time of wait execution for mpi related idle/wait tasks of collective operations (without scala...
Definition: statistics.hpp:73
static std::map< String, std::list< Index > > _outer_schwarz_iters
overall iterations of outer schwarz preconditioners internal solver
Definition: statistics.hpp:105
static std::list< std::vector< double > > & get_time_mg_mpi_wait_collective(String target)
retrieve list of all overall solver mpi collective wait toe entries per level
Definition: statistics.hpp:486
static KahanAccumulator< double > _time_mpi_wait_blas3
global time of wait execution for mpi related idle/wait tasks of blas3 operations
Definition: statistics.hpp:70
static std::list< std::vector< double > > & get_time_mg_mpi_execute_blas2(String target)
retrieve list of all overall solver mpi execute blas2 toe entries per level
Definition: statistics.hpp:450
static KahanAccumulator< double > _time_blas3
global time of execution for blas-3 type operations
Definition: statistics.hpp:43
static std::list< std::vector< double > > & get_time_mg_mpi_wait_reduction(String target)
retrieve list of all overall solver mpi reduction wait toe entries per level
Definition: statistics.hpp:468
static String get_formatted_times(double total_time)
Retrieve formatted time consumption overview in percent relative to some provided total time.
Definition: statistics.cpp:473
static double toe_solve
time of solution in seconds, needs initialization
Definition: statistics.hpp:171
static void reset()
Reset all internal counters (flops/times/solver_statistics)
Definition: statistics.hpp:177
static std::list< double > & get_time_toe(String target)
retrieve list of all overall solver toe entries
Definition: statistics.hpp:378
static std::list< std::vector< double > > & get_time_mg_mpi_execute_reduction(String target)
retrieve list of all overall solver mpi execute reduction toe entries per level
Definition: statistics.hpp:444
static std::list< std::vector< double > > & get_time_mg_mpi_wait_blas3(String target)
retrieve list of all overall solver mpi blas3 wait toe entries per level
Definition: statistics.hpp:480
static std::list< std::vector< double > > & get_time_mg_mpi_wait_blas2(String target)
retrieve list of all overall solver mpi blas2 wait toe entries per level
Definition: statistics.hpp:474
static KahanAccumulator< double > _time_mpi_wait_blas2
global time of wait execution for mpi related idle/wait tasks of blas2 operations
Definition: statistics.hpp:67
static void print_solver_expressions()
print out the complete solver expression list
Definition: statistics.cpp:355
static String get_formatted_flops(double seconds, int ranks=1)
Retrieve formatted flops per second string.
Definition: statistics.hpp:218
static String expression_target
the current solver's descriptive string
Definition: statistics.hpp:173
static double toe_partition
time of partitioning in seconds, needs initialization
Definition: statistics.hpp:167
static void reset_flops()
Reset global flop counter.
Definition: statistics.hpp:229
static std::list< double > & get_time_mpi_execute_reduction(String target)
retrieve list of all overall solver mpi execute reduction toe entries
Definition: statistics.hpp:390
static double toe_assembly
time of assembly in seconds, needs initialization
Definition: statistics.hpp:169
String class implementation.
Definition: string.hpp:46
FEAT namespace.
Definition: adjactor.hpp:12
String stringify(const T_ &item)
Converts an item into a String.
Definition: string.hpp:944
std::uint64_t Index
Index data type.