From f9285315eccc26354eef6d8349db777727a63394 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 17 Apr 2019 10:26:30 +0200 Subject: egs: do not assume the same stride for all arrays Also, allocate all the diff coeffs together. --- residual_calc.c | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'residual_calc.c') diff --git a/residual_calc.c b/residual_calc.c index 2fc1a66..8f67823 100644 --- a/residual_calc.c +++ b/residual_calc.c @@ -32,12 +32,19 @@ typedef struct ResidualCalcTask { size_t line_size; - ptrdiff_t stride; double *dst; + ptrdiff_t dst_stride; + const double *u; + ptrdiff_t u_stride; + const double *rhs; + ptrdiff_t rhs_stride; + const double * const *diff_coeffs; + ptrdiff_t diff_coeffs_stride; + const double *fd_factors; } ResidualCalcTask; @@ -178,24 +185,27 @@ static int residual_calc_task(void *arg, unsigned int job_idx, unsigned int thre ResidualCalcInternal *priv = arg; ResidualCalcTask *task = &priv->task; - const ptrdiff_t offset = job_idx * task->stride; const double *diff_coeffs[MG2D_DIFF_COEFF_NB]; for (int i = 0; i < ARRAY_ELEMS(diff_coeffs); i++) - diff_coeffs[i] = task->diff_coeffs[i] + offset; + diff_coeffs[i] = task->diff_coeffs[i] + job_idx * task->diff_coeffs_stride; - priv->residual_calc_line(task->line_size, task->dst + offset, + priv->residual_calc_line(task->line_size, task->dst + job_idx * task->dst_stride, priv->residual_max + thread_idx * priv->calc_blocksize, - task->stride, task->u + offset, task->rhs + offset, + task->u_stride, task->u + job_idx * task->u_stride, + task->rhs + job_idx * task->rhs_stride, diff_coeffs, task->fd_factors); return 0; } -int mg2di_residual_calc(ResidualCalcContext *ctx, size_t size[2], ptrdiff_t stride, - double *residual_max, - double *dst, const double *u, const double *rhs, +int mg2di_residual_calc(ResidualCalcContext *ctx, size_t size[2], + double *residual_max, + double *dst, ptrdiff_t dst_stride, + const double *u, ptrdiff_t u_stride, + const double *rhs, ptrdiff_t rhs_stride, const double * const diff_coeffs[MG2D_DIFF_COEFF_NB], + ptrdiff_t diff_coeffs_stride, const double *fd_factors) { ResidualCalcInternal *priv = ctx->priv; @@ -204,13 +214,16 @@ int mg2di_residual_calc(ResidualCalcContext *ctx, size_t size[2], ptrdiff_t stri memset(priv->residual_max, 0, sizeof(*priv->residual_max) * priv->residual_max_size); - task->line_size = size[0]; - task->stride = stride; - task->dst = dst; - task->u = u; - task->rhs = rhs; - task->diff_coeffs = diff_coeffs; - task->fd_factors = fd_factors; + task->line_size = size[0]; + task->dst = dst; + task->dst_stride = dst_stride; + task->u = u; + task->u_stride = u_stride; + task->rhs = rhs; + task->rhs_stride = rhs_stride; + task->diff_coeffs = diff_coeffs; + task->diff_coeffs_stride = diff_coeffs_stride; + task->fd_factors = fd_factors; tp_execute(ctx->tp, size[1], residual_calc_task, priv); -- cgit v1.2.3