From 7dcabe1f8d406b62df4141883e503cabb39b8d45 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 30 Jan 2019 12:51:18 +0100 Subject: mg2d: print stats properly for exact solves --- mg2d.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 18 deletions(-) (limited to 'mg2d.c') 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; } -- cgit v1.2.3