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 --- log.c | 7 ++++++- log.h | 1 + mg2d.c | 54 +++++++++++++++++++++++++++++++++++------------------- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/log.c b/log.c index d56ec28..3cdcac4 100644 --- a/log.c +++ b/log.c @@ -31,6 +31,11 @@ void mg2di_log_default_callback(MG2DLogger *log, int level, vfprintf(stderr, fmt, vl); } +void mg2di_vlog(MG2DLogger *log, int level, const char *fmt, va_list vl) +{ + log->log(log, level, fmt, vl); +} + void mg2di_log(MG2DLogger *log, int level, const char *fmt, ...) { va_list vl; @@ -39,6 +44,6 @@ void mg2di_log(MG2DLogger *log, int level, const char *fmt, ...) return; va_start(vl, fmt); - log->log(log, level, fmt, vl); + mg2di_vlog(log, level, fmt, vl); va_end(vl); } diff --git a/log.h b/log.h index 99fa9d1..aaf7b84 100644 --- a/log.h +++ b/log.h @@ -27,6 +27,7 @@ typedef struct MG2DLogger { } MG2DLogger; void mg2di_log(MG2DLogger *log, int level, const char *fmt, ...); +void mg2di_vlog(MG2DLogger *log, int level, const char *fmt, va_list vl); void mg2di_log_default_callback(MG2DLogger *log, int level, const char *fmt, va_list vl); 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