aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2020-01-26 17:36:56 +0100
committerAnton Khirnov <anton@khirnov.net>2020-01-26 17:39:15 +0100
commit246c2746a25121ad51360f2ebb6c4b8073ea10e4 (patch)
tree74ed7928e7dcaa37011afbb5e5d49fdced359ed8
parente6c975d48f918856396ce4ae6824b9c387930f3f (diff)
mg2d: create a per-level logging context
-rw-r--r--log.c7
-rw-r--r--log.h1
-rw-r--r--mg2d.c54
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;
}