aboutsummaryrefslogtreecommitdiff
path: root/residual_calc.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-04-17 10:26:30 +0200
committerAnton Khirnov <anton@khirnov.net>2019-04-17 10:27:53 +0200
commitf9285315eccc26354eef6d8349db777727a63394 (patch)
tree99fff854450394d781126481e8b2fc48f4508c64 /residual_calc.c
parent6a92edee9bd679d1f71e66b2cc96456bead219fd (diff)
egs: do not assume the same stride for all arrays
Also, allocate all the diff coeffs together.
Diffstat (limited to 'residual_calc.c')
-rw-r--r--residual_calc.c43
1 files changed, 28 insertions, 15 deletions
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);