summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-04-17 11:54:38 +0200
committerAnton Khirnov <anton@khirnov.net>2019-04-19 17:11:40 +0200
commit8c35e7648cf7db413e1d2a9478edec797eac5df3 (patch)
tree01ea54c08f032e4f9b6cfa7774e91e695a3f648c
parent6158e0222d7143dde606e3ffddd62bee7413da10 (diff)
mg2d: timer improvements
Rename time_relax to time_solve, since it is also used for the exact solver. Properly include all the reinits.
-rw-r--r--mg2d.c29
1 files 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;
}