From 8c35e7648cf7db413e1d2a9478edec797eac5df3 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 17 Apr 2019 11:54:38 +0200 Subject: mg2d: timer improvements Rename time_relax to time_solve, since it is also used for the exact solver. Properly include all the reinits. --- mg2d.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/mg2d.c b/mg2d.c index 11a8158..a22a0a5 100644 --- a/mg2d.c +++ b/mg2d.c @@ -52,7 +52,7 @@ typedef struct MG2DLevel { /* timings */ int64_t count_cycles; - int64_t time_relax; + int64_t time_solve; int64_t time_prolong; int64_t time_restrict; int64_t time_correct; @@ -122,7 +122,7 @@ static int mg_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_de ret = mg2di_egs_solve(level->solver); - level->time_relax += gettime() - start; + level->time_solve += gettime() - start; if (ret < 0) return ret; @@ -140,6 +140,8 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* on the refined levels, use zero as the initial guess for the * solution (correction for the upper level) */ if (level->depth > 0) { + int64_t start = gettime(); + memset(level->solver->u->data, 0, sizeof(*level->solver->u->data) * level->solver->u->stride[0] * level->solver->domain_size[1]); @@ -148,6 +150,8 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) if (ret < 0) return ret; level->egs_init_flags |= EGS_INIT_FLAG_SAME_DIFF_COEFFS; + + level->time_reinit += gettime() - start; } res_old = level->solver->residual_max; @@ -514,10 +518,14 @@ int mg2d_solve(MG2DContext *ctx) priv->time_levels_init += gettime() - start; priv->count_levels_init++; + start = gettime(); + ret = mg2di_egs_init(s_root, 0); if (ret < 0) return ret; + root->time_reinit += gettime() - start; + res_orig = s_root->residual_max; res_prev = res_orig; @@ -790,7 +798,7 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix) EGSRelaxContext *r = NULL; EGSExactContext *e = NULL; - int64_t level_total = level->time_relax + level->time_prolong + level->time_restrict + + int64_t level_total = level->time_solve + level->time_prolong + level->time_restrict + level->time_correct + level->time_reinit; if (level->solver->solver_type == EGS_SOLVER_RELAXATION) @@ -798,7 +806,7 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix) 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_total = level->time_solve + level->time_prolong + level->time_restrict + level->time_correct + level->time_reinit; levels_total += level_total; @@ -812,14 +820,19 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix) if (ret > 0) p += ret; + ret = snprintf(p, sizeof(buf) - (p - buf), + "||%2.2f%% solve %2.2f%% reinit ", + level->time_solve * 100.0 / level_total, + level->time_reinit * 100.0 / level_total); + 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, + "%2.2f%% prolong %2.2f%% restrict %2.2f%% correct", 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->time_correct * 100.0 / level_total); if (ret > 0) p += ret; } -- cgit v1.2.3