From 7dcabe1f8d406b62df4141883e503cabb39b8d45 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 30 Jan 2019 12:51:18 +0100 Subject: mg2d: print stats properly for exact solves --- ell_grid_solve.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'ell_grid_solve.c') diff --git a/ell_grid_solve.c b/ell_grid_solve.c index 1893214..13d1854 100644 --- a/ell_grid_solve.c +++ b/ell_grid_solve.c @@ -387,9 +387,13 @@ static void fill_mat_s2(double *mat_row, double **diff_coeffs, double *fd_factor static int solve_exact(EGSContext *ctx) { EGSInternal *priv = ctx->priv; + EGSExactContext *ec = ctx->solver_data; EGSExactInternal *e = &priv->e; + int64_t start; int ret; + start = gettime(); + memset(e->mat, 0, SQR(e->N) * sizeof(*e->mat)); for (ptrdiff_t idx1 = 0; idx1 < ctx->domain_size[1]; idx1++) { @@ -532,6 +536,10 @@ static int solve_exact(EGSContext *ctx) } } + ec->time_mat_construct += gettime() - start; + ec->count_mat_construct++; + + start = gettime(); ret = LAPACKE_dgesv(LAPACK_ROW_MAJOR, e->N, 1, e->mat, e->N, e->ipiv, e->rhs, 1); if (ret != 0) { mg2di_log(&ctx->logger, MG2D_LOG_ERROR, @@ -539,6 +547,9 @@ static int solve_exact(EGSContext *ctx) return -EDOM; } + ec->time_lin_solve += gettime() - start; + ec->count_lin_solve++; + for (size_t idx1 = 0; idx1 < ctx->domain_size[1]; idx1++) memcpy(ctx->u + idx1 * ctx->u_stride, e->rhs + idx1 * ctx->domain_size[0], ctx->domain_size[0] * sizeof(*e->rhs)); @@ -550,19 +561,30 @@ static int solve_exact(EGSContext *ctx) int mg2di_egs_solve(EGSContext *ctx) { + int64_t start; + int ret; + + start = gettime(); + switch (ctx->solver_type) { - case EGS_SOLVER_RELAXATION: return solve_relax_step(ctx); - case EGS_SOLVER_EXACT: return solve_exact(ctx); + case EGS_SOLVER_RELAXATION: ret = solve_relax_step(ctx); break; + case EGS_SOLVER_EXACT: ret = solve_exact(ctx); break; + default: ret = -EINVAL; } - return -EINVAL; + ctx->time_total += gettime() - start; + + return ret; } int mg2di_egs_init(EGSContext *ctx) { EGSInternal *priv = ctx->priv; + int64_t start; int ret; + start = gettime(); + if (ctx->solver_type == EGS_SOLVER_EXACT) { switch (ctx->fd_stencil) { case 1: priv->e.fill_mat = fill_mat_s1; break; @@ -637,6 +659,8 @@ int mg2di_egs_init(EGSContext *ctx) boundaries_apply(ctx); residual_calc(ctx); + ctx->time_total += gettime() - start; + return 0; } @@ -727,6 +751,9 @@ EGSContext *mg2di_egs_alloc(enum EGSType type, size_t domain_size[2]) goto fail; break; case EGS_SOLVER_EXACT: + ctx->solver_data = calloc(1, sizeof(EGSExactContext)); + if (!ctx->solver_data) + goto fail; break; default: goto fail; } -- cgit v1.2.3