aboutsummaryrefslogtreecommitdiff
path: root/mg2d.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-01-30 12:51:18 +0100
committerAnton Khirnov <anton@khirnov.net>2019-02-02 11:52:00 +0100
commit7dcabe1f8d406b62df4141883e503cabb39b8d45 (patch)
tree0946902915d319caa69ba2e771bcb760a29495cc /mg2d.c
parentb584bfe20168ac6208154b1eef395b3805b35e77 (diff)
mg2d: print stats properly for exact solves
Diffstat (limited to 'mg2d.c')
-rw-r--r--mg2d.c68
1 files changed, 50 insertions, 18 deletions
diff --git a/mg2d.c b/mg2d.c
index cbb2797..453a9c4 100644
--- a/mg2d.c
+++ b/mg2d.c
@@ -764,37 +764,69 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix)
prefix, priv->count_solve, priv->time_solve / 1e6, priv->time_solve / 1e3 / priv->count_solve);
while (level) {
+ char buf[1024], *p;
+ int ret;
+
EGSRelaxContext *r = NULL;
+ EGSExactContext *e = NULL;
+
int64_t level_total = level->time_relax + level->time_prolong + level->time_restrict +
level->time_correct + level->time_reinit;
- int64_t relax_total = (r ? r->time_correct : 0) + level->solver->time_res_calc + level->solver->time_boundaries;
if (level->solver->solver_type == EGS_SOLVER_RELAXATION)
r = level->solver->solver_data;
+ else if (level->solver->solver_type == EGS_SOLVER_EXACT)
+ e = level->solver->solver_data;
level_total = level->time_relax + level->time_prolong + level->time_restrict +
level->time_correct + level->time_reinit;
- relax_total = (r ? r->time_correct : 0) + level->solver->time_res_calc + level->solver->time_boundaries;
levels_total += level_total;
- mg2di_log(&priv->logger, MG2D_LOG_VERBOSE,
- "%s%2.2f%% level %d: %ld cycles %g s total time %g ms avg per call || "
- "%2.2f%% relax %2.2f%% prolong %2.2f%% restrict %2.2f%% correct %2.2f%% reinit || "
- "%2.2f%% residual %2.2f%% correct %2.2f%% boundaries ||"
- "\n",
- prefix, level_total * 100.0 / priv->time_solve, level->depth, level->count_cycles,
- level_total / 1e6, level_total / 1e3 / level->count_cycles,
- level->time_relax * 100.0 / level_total,
- level->time_prolong * 100.0 / level_total,
- level->time_restrict * 100.0 / level_total,
- level->time_correct * 100.0 / level_total,
- level->time_reinit * 100.0 / level_total,
- level->solver->time_res_calc * 100.0 / relax_total,
- (r ? r->time_correct : 0) * 100.0 / relax_total,
- level->solver->time_boundaries * 100.0 / relax_total
- );
+ p = buf;
+
+ ret = snprintf(p, sizeof(buf) - (p - buf),
+ "%2.2f%% level %d: %ld cycles %g s total time %g ms avg per call",
+ level_total * 100.0 / priv->time_solve, level->depth, level->count_cycles,
+ level_total / 1e6, level_total / 1e3 / level->count_cycles);
+ if (ret > 0)
+ p += ret;
+
+ if (level->child) {
+ ret = snprintf(p, sizeof(buf) - (p - buf),
+ "||%2.2f%% relax %2.2f%% prolong %2.2f%% restrict %2.2f%% correct %2.2f%% reinit",
+ level->time_relax * 100.0 / level_total,
+ level->time_prolong * 100.0 / level_total,
+ level->time_restrict * 100.0 / level_total,
+ level->time_correct * 100.0 / level_total,
+ level->time_reinit * 100.0 / level_total);
+ if (ret > 0)
+ p += ret;
+ }
+
+ ret = snprintf(p, sizeof(buf) - (p - buf),
+ "||%2.2f%% residual %2.2f%% boundaries",
+ level->solver->time_res_calc * 100.0 / level->solver->time_total,
+ level->solver->time_boundaries * 100.0 / level->solver->time_total);
+ if (ret > 0)
+ p += ret;
+
+ if (r) {
+ ret = snprintf(p, sizeof(buf) - (p - buf),
+ " %2.2f%% correct",
+ r->time_correct * 100.0 / level->solver->time_total);
+ if (ret > 0)
+ p += ret;
+ } else if (e) {
+ ret = snprintf(p, sizeof(buf) - (p - buf),
+ " %2.2f%% matrix construct %2.2f%% linear solve",
+ e->time_mat_construct * 100.0 / level->solver->time_total,
+ e->time_lin_solve * 100.0 / level->solver->time_total);
+ if (ret > 0)
+ p += ret;
+ }
+ mg2di_log(&priv->logger, MG2D_LOG_VERBOSE, "%s%s\n", prefix, buf);
level = level->child;
}