165 const double local_total =
Total();
166 const double local_min =
Min();
167 const double local_max =
Max();
168 const double local_mean =
Mean();
170 const unsigned long long local_count =
171 static_cast<unsigned long long>(count_);
176 unsigned long long count_min = 0;
177 unsigned long long count_max = 0;
178 unsigned long long count_sum = 0;
180 MPI_Reduce(&local_count, &count_min, 1,
181 MPI_UNSIGNED_LONG_LONG, MPI_MIN, 0, comm_);
183 MPI_Reduce(&local_count, &count_max, 1,
184 MPI_UNSIGNED_LONG_LONG, MPI_MAX, 0, comm_);
186 MPI_Reduce(&local_count, &count_sum, 1,
187 MPI_UNSIGNED_LONG_LONG, MPI_SUM, 0, comm_);
192 double total_min = 0.0;
193 double total_max = 0.0;
194 double total_sum = 0.0;
196 double step_min_min = 0.0;
197 double step_min_max = 0.0;
198 double step_min_sum = 0.0;
200 double step_max_min = 0.0;
201 double step_max_max = 0.0;
202 double step_max_sum = 0.0;
204 double mean_min = 0.0;
205 double mean_max = 0.0;
206 double mean_sum = 0.0;
208 ReduceMinMaxSum(local_total,
209 total_min, total_max, total_sum);
211 ReduceMinMaxSum(local_min,
212 step_min_min, step_min_max, step_min_sum);
214 ReduceMinMaxSum(local_max,
215 step_max_min, step_max_max, step_max_sum);
217 ReduceMinMaxSum(local_mean,
218 mean_min, mean_max, mean_sum);
225 const double inv_nranks = 1.0 /
static_cast<double>(nranks_);
227 const double count_mean =
228 static_cast<double>(count_sum) * inv_nranks;
230 const double total_mean =
231 total_sum * inv_nranks;
233 const double step_min_mean =
234 step_min_sum * inv_nranks;
236 const double step_max_mean =
237 step_max_sum * inv_nranks;
239 const double mean_mean =
240 mean_sum * inv_nranks;
242 auto old_flags = os.flags();
243 auto old_precision = os.precision();
244 os << std::fixed << std::setprecision(3);
246 <<
"========================================================================\n"
247 <<
"Theseus timestep performance\n"
248 <<
"========================================================================\n"
249 <<
"MPI ranks : " << nranks_ <<
"\n"
251 <<
"Per-rank timestep statistics\n"
256 << std::setw(12) << count_min
257 << std::setw(14) << count_mean
258 << std::setw(14) << count_max <<
"\n"
259 <<
" Total time (ms) : "
260 << std::setw(12) << total_min
261 << std::setw(14) << total_mean
262 << std::setw(14) << total_max <<
"\n"
263 <<
" Min step (ms) : "
264 << std::setw(12) << step_min_min
265 << std::setw(14) << step_min_mean
266 << std::setw(14) << step_min_max <<
"\n"
267 <<
" Mean step (ms) : "
268 << std::setw(12) << mean_min
269 << std::setw(14) << mean_mean
270 << std::setw(14) << mean_max <<
"\n"
271 <<
" Max step (ms) : "
272 << std::setw(12) << step_max_min
273 << std::setw(14) << step_max_mean
274 << std::setw(14) << step_max_max <<
"\n"
276 <<
"Critical-rank performance\n"
277 <<
" Mean timestep : " << mean_max <<
" ms\n";
281 os <<
" Timesteps/sec : "
282 << 1000.0 / mean_max <<
"\n";
285#ifdef TIMER_SYNC_DEVICE
286 os <<
" Device sync : enabled\n";
288 os <<
" Device sync : disabled\n";
292 os <<
" MPI barrier : enabled\n";
294 os <<
" MPI barrier : disabled\n";
297 os <<
"========================================================================\n";
299 os.precision(old_precision);