From 246c2746a25121ad51360f2ebb6c4b8073ea10e4 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 26 Jan 2020 17:36:56 +0100 Subject: mg2d: create a per-level logging context --- mg2d.c | 54 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 19 deletions(-) (limited to 'mg2d.c') diff --git a/mg2d.c b/mg2d.c index 95bd1ee..3255ce7 100644 --- a/mg2d.c +++ b/mg2d.c @@ -79,6 +79,10 @@ typedef struct MG2DLevel { struct MG2DLevel *child; + MG2DLogger logger; + char log_prefix[32]; + MG2DInternal *priv; + /* timings */ int64_t count_cycles; Timer timer_solve; @@ -132,16 +136,18 @@ static void log_callback(MG2DLogger *log, int level, const char *fmt, va_list vl ctx->log_callback(ctx, level, fmt, vl); } -static void log_egs_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc, - double res_old, double res_new) +static void log_callback_level(MG2DLogger *log, int level, const char *fmt, va_list vl) { - char prefix[32] = { 0 }; - - for (int i = 0; i < MIN(sizeof(prefix) - 1, level->depth); i++) - prefix[i] = ' '; + MG2DLevel *l = log->opaque; + mg2di_log(&l->priv->logger, level, l->log_prefix); + mg2di_vlog(&l->priv->logger, level, fmt, vl); +} - mg2di_log(&ctx->priv->logger, MG2D_LOG_DEBUG, "%s[%d]%s %g->%g (%g)\n", - prefix, level->depth, step_desc, res_old, res_new, res_old / res_new); +static void log_egs_step(MG2DLevel *level, const char *step_desc, + double res_old, double res_new) +{ + mg2di_log(&level->logger, MG2D_LOG_DEBUG, "%s %g->%g (%g)\n", + step_desc, res_old, res_new, res_old / res_new); } static int coarse_correct_task(void *arg, unsigned int job_idx, unsigned int thread_idx) @@ -171,7 +177,7 @@ static int mg_solve(MG2DContext *ctx, MG2DLevel *level, enum EGSType solve_type, if (ret < 0) return ret; - log_egs_step(ctx, level, step_desc, res_old, level->solver->residual_max); + log_egs_step(level, step_desc, res_old, level->solver->residual_max); return 0; } @@ -308,7 +314,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level, int allow_exact) level->egs_init_flags |= EGS_INIT_FLAG_SAME_DIFF_COEFFS; - log_egs_step(ctx, level, "correct", res_prev, level->solver->residual_max); + log_egs_step(level, "correct", res_prev, level->solver->residual_max); } /* post-correct relaxation */ @@ -325,9 +331,9 @@ finish: res_new = level->solver->residual_max; if (!isfinite(res_new) || (res_new > 1e2 * ctx->tol && res_old / res_new <= 1e-1)) { - mg2di_log(&ctx->priv->logger, MG2D_LOG_ERROR, - "The relaxation step at level %d has diverged: %g -> %g\n", - level->depth, res_old, res_new); + mg2di_log(&level->logger, MG2D_LOG_ERROR, + "The relaxation step has diverged: %g -> %g\n", + res_old, res_new); return MG2D_ERR_DIVERGE; } @@ -833,7 +839,7 @@ static int mg_levels_init(MG2DContext *ctx) } } - cur->solver->logger = priv->logger; + cur->solver->logger = cur->logger; cur->solver->cpuflags = priv->cpuflags; cur->solver->tp = priv->tp; @@ -1479,7 +1485,7 @@ static int mg_levels_alloc(MG2DContext *ctx) MG2DInternal *priv = ctx->priv; MPI_Comm comm_parent; - MG2DLevel **dst; + MG2DLevel **dst, *level; int ret = 0; @@ -1519,12 +1525,22 @@ static int mg_levels_alloc(MG2DContext *ctx) if (priv->local_component >= dg->nb_components) break; - *dst = mg_level_alloc(dg, priv->local_component, comm_cur); - if (!*dst) + level = mg_level_alloc(dg, priv->local_component, comm_cur); + if (!level) return -ENOMEM; - (*dst)->depth = depth; - dst = &((*dst)->child); + level->depth = depth; + level->priv = priv; + level->logger.opaque = level; + level->logger.log = log_callback_level; + + for (int i = 0; i < MIN(level->depth, sizeof(level->log_prefix) - 1); i++) + level->log_prefix[i] = ' '; + snprintf(level->log_prefix + level->depth, MAX(0, sizeof(level->log_prefix) - level->depth), + "[%d]", depth); + + *dst = level; + dst = &level->child; comm_parent = comm_cur; } -- cgit v1.2.3